fix direct load not set has_null_ for vector in shallow copy

This commit is contained in:
suz-yang 2024-11-28 13:18:44 +00:00 committed by ob-robot
parent e012731a64
commit fd09979d38
3 changed files with 12 additions and 3 deletions

View File

@ -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 {

View File

@ -68,6 +68,7 @@ void ObDirectLoadBatchRowBuffer::reuse()
}
for (int64_t i = 0; i < vectors_.count(); ++i) {
ObBitmapNullVectorBase *vector = static_cast<ObBitmapNullVectorBase *>(vectors_.at(i));
vector->reset_flag();
vector->get_nulls()->reset(max_batch_size_);
}
}

View File

@ -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<char *>(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;
}