Add null bitmap backup/restore in expansion operator
This commit is contained in:
parent
b0ee07126b
commit
218184335b
@ -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_)) {
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -170,7 +170,6 @@ private:
|
||||
ObBatchResultHolder *datum_holder_;
|
||||
};
|
||||
common::ObArenaAllocator allocator_;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ObExpandVecOp);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user