From 1584d80d64fb6a45612b30245e3cb6125d86aa94 Mon Sep 17 00:00:00 2001 From: a1iive Date: Wed, 18 Sep 2024 07:50:44 +0000 Subject: [PATCH] [VECTOR] fix reset attrs at the wrong address --- src/sql/engine/expr/ob_expr.cpp | 21 +++++---------------- src/sql/engine/expr/ob_expr.h | 4 ++-- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/sql/engine/expr/ob_expr.cpp b/src/sql/engine/expr/ob_expr.cpp index 99d3b60c7..7816be4fd 100644 --- a/src/sql/engine/expr/ob_expr.cpp +++ b/src/sql/engine/expr/ob_expr.cpp @@ -714,7 +714,7 @@ int ObExpr::eval_one_datum_of_batch(ObEvalCtx &ctx, common::ObDatum *&datum) con need_evaluate = true; to_bit_vector(frame + eval_flags_off_)->reset(ctx.get_batch_size()); reset_datums_ptr(frame, ctx.get_batch_size()); - reset_attrs_datums(frame, ctx.get_batch_size()); + reset_attrs_datums(ctx); info->evaluated_ = true; info->cnt_ = ctx.get_batch_size(); info->point_to_frame_ = true; @@ -779,7 +779,7 @@ int ObExpr::do_eval_batch(ObEvalCtx &ctx, // FIXME bin.lb: maybe we can optimize this by ObEvalInfo::point_to_frame_ if (!info->evaluated_) { reset_datums_ptr(frame, size); - reset_attrs_datums(frame, size); + reset_attrs_datums(ctx); info->notnull_ = false; info->point_to_frame_ = true; info->evaluated_ = true; @@ -1113,22 +1113,11 @@ int ObExpr::init_vector(ObEvalCtx &ctx, return ret; } -void ObExpr::reset_attr_datums_ptr(char *frame, const int64_t size) -{ - ObDatum *datum = reinterpret_cast(frame + datum_off_); - ObDatum *datum_end = datum + size; - char *ptr = frame + res_buf_off_; - for (; datum < datum_end; datum += 1) { - if (datum->ptr_ != ptr) { - datum->ptr_ = ptr; - } - ptr += res_buf_len_; - } -} - -void ObExpr::reset_attrs_datums(char *frame, const int64_t size) const +void ObExpr::reset_attrs_datums(ObEvalCtx &ctx) const { + int64_t size = ctx.get_batch_size(); for (uint32_t idx = 0; idx < attrs_cnt_; ++idx) { + char *frame = ctx.frames_[attrs_[idx]->frame_idx_]; attrs_[idx]->reset_datums_ptr(frame, size); } } diff --git a/src/sql/engine/expr/ob_expr.h b/src/sql/engine/expr/ob_expr.h index d09f9bbd8..9bf310a6b 100644 --- a/src/sql/engine/expr/ob_expr.h +++ b/src/sql/engine/expr/ob_expr.h @@ -742,8 +742,8 @@ public: OB_INLINE void unset_null(ObEvalCtx &ctx, int64_t batch_idx) { get_nulls(ctx).unset(batch_idx); } - void reset_attr_datums_ptr(char *frame, const int64_t size); - void reset_attrs_datums(char *frame, const int64_t size) const; + + void reset_attrs_datums(ObEvalCtx &ctx) const; OB_INLINE bool is_nested_expr() const { return attrs_cnt_ > 0; }