This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 7e7e4da958d3e522345c3d60c9cc3479d09cc3f5 Author: HappenLee <[email protected]> AuthorDate: Thu Aug 3 10:35:59 2023 +0800 [exec](set_operation) Support one child node in set operation (#22463) Support one child node in set operation --- be/src/vec/exec/vset_operation_node.cpp | 16 +++++++++++----- be/src/vec/exec/vset_operation_node.h | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/be/src/vec/exec/vset_operation_node.cpp b/be/src/vec/exec/vset_operation_node.cpp index 17db664c8a..ac01cbd5da 100644 --- a/be/src/vec/exec/vset_operation_node.cpp +++ b/be/src/vec/exec/vset_operation_node.cpp @@ -218,7 +218,10 @@ Status VSetOperationNode<is_intersect>::alloc_resource(RuntimeState* state) { for (const VExprContextSPtrs& exprs : _child_expr_lists) { RETURN_IF_ERROR(VExpr::open(exprs, state)); } - _probe_columns.resize(_child_expr_lists[1].size()); + // Add the if check only for compatible with old optimiser + if (_child_expr_lists.size() > 1) { + _probe_columns.resize(_child_expr_lists[1].size()); + } return Status::OK(); } @@ -326,8 +329,8 @@ void VSetOperationNode<is_intersect>::hash_table_init() { bool has_null = false; int key_byte_size = 0; - _probe_key_sz.resize(_child_expr_lists[1].size()); _build_key_sz.resize(_child_expr_lists[0].size()); + _probe_key_sz.resize(_child_expr_lists[0].size()); for (int i = 0; i < _child_expr_lists[0].size(); ++i) { const auto vexpr = _child_expr_lists[0][i]->root(); const auto& data_type = vexpr->data_type(); @@ -407,6 +410,7 @@ Status VSetOperationNode<is_intersect>::sink(RuntimeState* state, Block* block, *_hash_table_variants); } _build_finished = true; + _can_read = _children.size() == 1; } } return Status::OK(); @@ -530,11 +534,14 @@ Status VSetOperationNode<is_intersect>::sink_probe(RuntimeState* state, int chil *_hash_table_variants)); } - return eos ? finalize_probe(state, child_id) : Status::OK(); + if (eos) { + _finalize_probe(child_id); + } + return Status::OK(); } template <bool is_intersect> -Status VSetOperationNode<is_intersect>::finalize_probe(RuntimeState* /*state*/, int child_id) { +void VSetOperationNode<is_intersect>::_finalize_probe(int child_id) { if (child_id != (_children.size() - 1)) { refresh_hash_table(); if constexpr (is_intersect) { @@ -554,7 +561,6 @@ Status VSetOperationNode<is_intersect>::finalize_probe(RuntimeState* /*state*/, _can_read = true; } _probe_finished_children_index[child_id] = true; - return Status::OK(); } template <bool is_intersect> diff --git a/be/src/vec/exec/vset_operation_node.h b/be/src/vec/exec/vset_operation_node.h index 39a74f899e..9b21fca26b 100644 --- a/be/src/vec/exec/vset_operation_node.h +++ b/be/src/vec/exec/vset_operation_node.h @@ -70,11 +70,11 @@ public: Status pull(RuntimeState* state, Block* output_block, bool* eos) override; Status sink_probe(RuntimeState* state, int child_id, Block* block, bool eos); - Status finalize_probe(RuntimeState* state, int child_id); bool is_child_finished(int child_id) const; private: + void _finalize_probe(int child_id); //Todo: In build process of hashtable, It's same as join node. //It's time to abstract out the same methods and provide them directly to others; void hash_table_init(); --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
