From 1a86ebe117df6d4bb842e562d1b1b85314ac60ba Mon Sep 17 00:00:00 2001 From: a1iive Date: Thu, 28 Nov 2024 13:45:14 +0000 Subject: [PATCH] fix mysqltest --- src/sql/engine/basic/ob_temp_column_store.cpp | 33 +++++++++++++++++++ src/sql/engine/basic/ob_temp_column_store.h | 1 + 2 files changed, 34 insertions(+) diff --git a/src/sql/engine/basic/ob_temp_column_store.cpp b/src/sql/engine/basic/ob_temp_column_store.cpp index f790be7f0..41324d0de 100644 --- a/src/sql/engine/basic/ob_temp_column_store.cpp +++ b/src/sql/engine/basic/ob_temp_column_store.cpp @@ -388,6 +388,35 @@ int ObTempColumnStore::Iterator::init(ObTempColumnStore *store) return BlockReader::init(store); } +int ObTempColumnStore::Iterator::nested_from_vector(ObExpr &expr, ObEvalCtx &ctx, const int64_t start_pos, const int64_t size) +{ + int ret = OB_SUCCESS; + ObIVector *root_vec = expr.get_vector(ctx); + if (root_vec->get_format() != VEC_CONTINUOUS) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected format", K(ret), K(root_vec->get_format())); + } else if (OB_FAIL(from_vector(static_cast(root_vec), &expr, ctx, start_pos, size))) { + LOG_WARN("from vector failed", K(ret), K(root_vec->get_format())); + } else { + for (uint32_t i = 0; i < expr.attrs_cnt_ && OB_SUCC(ret); ++i) { + ObIVector *vec = expr.attrs_[i]->get_vector(ctx); + const VectorFormat format = vec->get_format(); + switch (format) { + case VEC_FIXED: + ret = from_vector(static_cast(vec), expr.attrs_[i], ctx, start_pos, size); + break; + case VEC_CONTINUOUS: + ret = from_vector(static_cast(vec), expr.attrs_[i], ctx, start_pos, size); + break; + default: + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected format", K(ret), K(format)); + } + } + } + return ret; +} + int ObTempColumnStore::Iterator::get_next_batch(const ObExprPtrIArray &exprs, ObEvalCtx &ctx, const int64_t max_rows, @@ -421,6 +450,10 @@ int ObTempColumnStore::Iterator::get_next_batch(const ObExprPtrIArray &exprs, ObIVector *vec = NULL; if (OB_ISNULL(e) || ((is_uniform_format((vec = e->get_vector(ctx))->get_format())))) { // skip null input expr and uniform expr + } else if (e->is_nested_expr()) { + if (OB_FAIL(nested_from_vector(*e, ctx, begin, batch_rows))) { + LOG_WARN("failed to get nested expr", K(ret), K(begin), K(batch_rows)); + } } else { const VectorFormat format = vec->get_format(); switch (format) { diff --git a/src/sql/engine/basic/ob_temp_column_store.h b/src/sql/engine/basic/ob_temp_column_store.h index 31cde0643..d7345fcb8 100644 --- a/src/sql/engine/basic/ob_temp_column_store.h +++ b/src/sql/engine/basic/ob_temp_column_store.h @@ -143,6 +143,7 @@ public: inline bool has_next() const { return cur_blk_id_ < get_row_cnt(); } inline int64_t get_row_cnt() const { return column_store_->get_row_cnt(); } inline int64_t get_col_cnt() const { return column_store_->get_col_cnt(); } + int nested_from_vector(ObExpr &expr, ObEvalCtx &ctx, const int64_t start_pos, const int64_t size); int get_next_batch(const ObExprPtrIArray &exprs, ObEvalCtx &ctx, const int64_t max_rows,