Add null bitmap backup/restore in expansion operator

This commit is contained in:
Zach41 2024-11-29 09:44:48 +00:00 committed by ob-robot
parent b0ee07126b
commit 218184335b
4 changed files with 7 additions and 41 deletions

View File

@ -69,26 +69,9 @@ copy_bitmap_null_base(const ObBitmapNullVectorBase &vec,
frame_nulls_ = sql::to_bit_vector(buffer);
}
}
if (OB_SUCC(ret)
&& orig_nulls_ == nullptr
&& OB_NOT_NULL(expr_)
&& vec.get_nulls() != &expr_->get_nulls(eval_ctx)) {
// null bitmap stored in vector may not come from expr frame memory, e.g. column_store
// in this case, we copy nulls into orig_nulls_ and restore it later
void *buffer = nullptr;
if (OB_ISNULL(buffer = alloc.alloc(sql::ObBitVector::memory_size(max_row_cnt_)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate memory failed", K(ret));
} else {
orig_nulls_ = sql::to_bit_vector(buffer);
}
}
if (OB_SUCC(ret)) {
has_null_ = vec.has_null();
nulls_ = const_cast<sql::ObBitVector *> (vec.get_nulls());
if (orig_nulls_ != nullptr) {
orig_nulls_->deep_copy(*nulls_, max_row_cnt_);
}
if (OB_NOT_NULL(expr_)) {
frame_nulls_->deep_copy(expr_->get_nulls(eval_ctx), max_row_cnt_);
}
@ -223,9 +206,6 @@ void ObVectorsResultHolder::ObColResultHolder::
restore_bitmap_null_base(ObBitmapNullVectorBase &vec, const int64_t batch_size, ObEvalCtx &eval_ctx) const
{
restore_vector_base(vec);
if (orig_nulls_ != nullptr) {
nulls_->deep_copy(*orig_nulls_, max_row_cnt_);
}
vec.set_has_null(has_null_);
vec.set_nulls(nulls_);
if (OB_NOT_NULL(expr_)) {

View File

@ -68,7 +68,7 @@ private:
{
ObColResultHolder(int64_t max_batch_size, const ObExpr *expr) :
header_(), max_row_cnt_(max_batch_size), nulls_(nullptr),
orig_nulls_(nullptr), has_null_(false), datums_(nullptr), len_(-1),
has_null_(false), datums_(nullptr), len_(-1),
data_(nullptr), lens_(nullptr), ptrs_(nullptr),
offsets_(nullptr), continuous_data_(nullptr),
expr_(expr), frame_nulls_(nullptr), frame_datums_(nullptr),
@ -136,7 +136,6 @@ private:
int64_t max_row_cnt_; //ObVectorBase
sql::ObBitVector *nulls_; //ObBitmapNullVectorBase
sql::ObBitVector *orig_nulls_;
bool has_null_; //ObBitmapNullVectorBase
ObDatum *datums_; //ObUniformBase

View File

@ -180,24 +180,12 @@ int ObExpandVecOp::do_dup_partial()
// do nothing
} else if (MY_SPEC.use_rich_format_) {
ObExpr *null_expr = MY_SPEC.expand_exprs_.at(expr_iter_idx_);
VectorFormat fmt = null_expr->get_format(eval_ctx_);
if (OB_UNLIKELY(fmt == VEC_UNIFORM)) {
ObDatum *uni_datums =
static_cast<ObUniformBase *>(null_expr->get_vector(eval_ctx_))->get_datums();
for (int i = 0; i < child_input_size_; i++) {
if (child_input_skip_->at(i)) {
} else {
uni_datums[i].set_null();
}
}
} else if (OB_LIKELY(fmt == VEC_DISCRETE || fmt == VEC_FIXED || fmt == VEC_CONTINUOUS)) {
ObBitmapNullVectorBase *nulls =
static_cast<ObBitmapNullVectorBase *>(null_expr->get_vector(eval_ctx_));
nulls->get_nulls()->set_all(child_input_size_);
nulls->set_has_null();
if (OB_FAIL(null_expr->init_vector_for_write(eval_ctx_, null_expr->get_default_res_format(),
child_input_size_))) {
LOG_WARN("init vector failed", K(ret));
} else {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected fmt", K(ret), K(fmt));
null_expr->get_nulls(eval_ctx_).set_all(child_input_size_);
null_expr->get_vector(eval_ctx_)->set_has_null();
}
} else {
ObExpr *null_expr = MY_SPEC.expand_exprs_.at(expr_iter_idx_);
@ -501,7 +489,7 @@ int ObExpandVecOp::duplicate_rollup_exprs()
for (int j = 0; j < brs_.size_; j++) {
if (brs_.skip_->at(j)) {
} else {
to_datums[j] = *src_datums.at(i);
to_datums[j] = *src_datums.at(j);
}
}
}

View File

@ -170,7 +170,6 @@ private:
ObBatchResultHolder *datum_holder_;
};
common::ObArenaAllocator allocator_;
private:
DISALLOW_COPY_AND_ASSIGN(ObExpandVecOp);
};