From f34fe46bfa0fe43be4093933a02a40492fed34ad Mon Sep 17 00:00:00 2001 From: Mryange <59914473+Mryange@users.noreply.github.com> Date: Thu, 25 Apr 2024 14:06:15 +0800 Subject: [PATCH] [fix](scan) fix ignore expr exec when _non_predicate_columns is empty (#33934) fix ignore expr exec when _non_predicate_columns is empty --- .../olap/rowset/segment_v2/segment_iterator.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp b/be/src/olap/rowset/segment_v2/segment_iterator.cpp index ccdc0577a6..d4ae8cf332 100644 --- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp +++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp @@ -1956,14 +1956,16 @@ void SegmentIterator::_replace_version_col(size_t num_rows) { uint16_t SegmentIterator::_evaluate_vectorization_predicate(uint16_t* sel_rowid_idx, uint16_t selected_size) { SCOPED_RAW_TIMER(&_opts.stats->vec_cond_ns); - if (_is_need_vec_eval) { - _is_need_vec_eval = false; - for (const auto& pred : _pre_eval_block_predicate) { - _is_need_vec_eval |= (!pred->always_true()); + bool all_pred_always_true = true; + for (const auto& pred : _pre_eval_block_predicate) { + if (!pred->always_true()) { + all_pred_always_true = false; + break; } } - if (!_is_need_vec_eval) { - for (uint32_t i = 0; i < selected_size; ++i) { + //If all predicates are always_true, then return directly. + if (all_pred_always_true || !_is_need_vec_eval) { + for (uint16_t i = 0; i < selected_size; ++i) { sel_rowid_idx[i] = i; } return selected_size; @@ -2247,6 +2249,9 @@ Status SegmentIterator::_next_batch_internal(vectorized::Block* block) { } if (!_is_need_vec_eval && !_is_need_short_eval && !_is_need_expr_eval) { + if (_non_predicate_columns.empty()) { + return Status::InternalError("_non_predicate_columns is empty"); + } RETURN_IF_ERROR(_convert_to_expected_type(_first_read_column_ids)); RETURN_IF_ERROR(_convert_to_expected_type(_non_predicate_columns)); _output_non_pred_columns(block);