From fd09979d381b2ec16be89371c17d4a9ab7611a41 Mon Sep 17 00:00:00 2001 From: suz-yang Date: Thu, 28 Nov 2024 13:18:44 +0000 Subject: [PATCH] fix direct load not set has_null_ for vector in shallow copy --- src/share/vector/ob_bitmap_null_vector_base.h | 5 +++++ .../direct_load/ob_direct_load_batch_row_buffer.cpp | 1 + src/storage/direct_load/ob_direct_load_vector_utils.cpp | 9 ++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/share/vector/ob_bitmap_null_vector_base.h b/src/share/vector/ob_bitmap_null_vector_base.h index 968f234ad..c9645e764 100644 --- a/src/share/vector/ob_bitmap_null_vector_base.h +++ b/src/share/vector/ob_bitmap_null_vector_base.h @@ -43,6 +43,11 @@ public: OB_INLINE void set_nulls(sql::ObBitVector *nulls) { nulls_ = nulls; } inline const sql::ObBitVector *get_nulls() const { return nulls_; } inline uint16_t get_flag() const { return flag_; } + inline void reset_flag() + { + has_null_ = false; + is_batch_ascii_ = UNKNOWN; + } OB_INLINE bool is_null(const int64_t idx) const override final { return nulls_->at(idx); } OB_INLINE void set_null(const int64_t idx) override final { diff --git a/src/storage/direct_load/ob_direct_load_batch_row_buffer.cpp b/src/storage/direct_load/ob_direct_load_batch_row_buffer.cpp index ff7f4989d..cab03c745 100644 --- a/src/storage/direct_load/ob_direct_load_batch_row_buffer.cpp +++ b/src/storage/direct_load/ob_direct_load_batch_row_buffer.cpp @@ -68,6 +68,7 @@ void ObDirectLoadBatchRowBuffer::reuse() } for (int64_t i = 0; i < vectors_.count(); ++i) { ObBitmapNullVectorBase *vector = static_cast(vectors_.at(i)); + vector->reset_flag(); vector->get_nulls()->reset(max_batch_size_); } } diff --git a/src/storage/direct_load/ob_direct_load_vector_utils.cpp b/src/storage/direct_load/ob_direct_load_vector_utils.cpp index 6caee6242..fa7001f92 100644 --- a/src/storage/direct_load/ob_direct_load_vector_utils.cpp +++ b/src/storage/direct_load/ob_direct_load_vector_utils.cpp @@ -136,6 +136,7 @@ int ObDirectLoadVectorUtils::new_vector(VectorFormat format, VecValueTypeClass v ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("fail to new ObEvalInfo", KR(ret)); } else { + MEMSET(eval_info, 0, sizeof(ObEvalInfo)); switch (value_tc) { #define UNIFORM_VECTOR_INIT_SWITCH(value_tc) \ case value_tc: { \ @@ -194,6 +195,7 @@ int ObDirectLoadVectorUtils::new_vector(VectorFormat format, VecValueTypeClass v ret = OB_ALLOCATE_MEMORY_FAILED; LOG_WARN("fail to new ObEvalInfo", KR(ret)); } else { + MEMSET(eval_info, 0, sizeof(ObEvalInfo)); switch (value_tc) { #define UNIFORM_CONST_VECTOR_INIT_SWITCH(value_tc) \ case value_tc: { \ @@ -428,14 +430,14 @@ inline int shallow_copy_vector_impl(ObUniformBase *src_vec, { int ret = OB_SUCCESS; ObDatum *datums = src_vec->get_datums(); - ObBitVector *nulls = dest_vec->get_nulls(); char **ptrs = dest_vec->get_ptrs(); ObLength *lens = dest_vec->get_lens(); - nulls->reset(batch_size); + dest_vec->reset_flag(); + dest_vec->get_nulls()->reset(batch_size); for (int64_t i = 0; i < batch_size; ++i) { const ObDatum &datum = datums[IS_CONST ? 0 : i]; if (datum.is_null()) { - nulls->set(i); + dest_vec->set_null(i); } else { ptrs[i] = const_cast(datum.ptr_); lens[i] = datum.len_; @@ -451,6 +453,7 @@ inline int shallow_copy_vector_impl(ObUniformBase *src_vec, int ret = OB_SUCCESS; ObDatum *src_datums = src_vec->get_datums(); ObDatum *dest_datums = dest_vec->get_datums(); + *dest_vec->get_eval_info() = *src_vec->get_eval_info(); MEMCPY(dest_datums, src_datums, sizeof(ObDatum) * (IS_CONST ? 1 : batch_size)); return ret; }