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
The following commit(s) were added to refs/heads/branch-2.0 by this push: new 8cabe11d800 [fix](set) incorrect result of set operator (#35607) (#35691) 8cabe11d800 is described below commit 8cabe11d8008f6e586cf8cdbc1deee8ab73cd75d Author: Jerry Hu <mrh...@gmail.com> AuthorDate: Fri May 31 14:05:26 2024 +0800 [fix](set) incorrect result of set operator (#35607) (#35691) If there are duplicated expressions in the select list, the result will be incorrect. --- be/src/vec/exec/vset_operation_node.cpp | 6 +++--- be/src/vec/exec/vset_operation_node.h | 4 ++-- regression-test/data/query_p0/operator/test_set_operator.out | 12 ++++++++++++ .../suites/query_p0/operator/test_set_operator.groovy | 8 ++++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/be/src/vec/exec/vset_operation_node.cpp b/be/src/vec/exec/vset_operation_node.cpp index 801d07b2bdd..71774e97267 100644 --- a/be/src/vec/exec/vset_operation_node.cpp +++ b/be/src/vec/exec/vset_operation_node.cpp @@ -502,8 +502,8 @@ void VSetOperationNode<is_intersect>::add_result_columns(RowRefListWithFlags& va int& block_size) { auto it = value.begin(); for (auto idx = _build_col_idx.begin(); idx != _build_col_idx.end(); ++idx) { - auto& column = *_build_blocks[it->block_offset].get_by_position(idx->first).column; - _mutable_cols[idx->second]->insert_from(column, it->row_num); + const auto& column = *_build_blocks[it->block_offset].get_by_position(idx->second).column; + _mutable_cols[idx->first]->insert_from(column, it->row_num); } block_size++; } @@ -590,7 +590,7 @@ Status VSetOperationNode<is_intersect>::extract_build_column(Block& block, } raw_ptrs[i] = block.get_by_position(result_col_id).column.get(); DCHECK_GE(result_col_id, 0); - _build_col_idx.insert({result_col_id, i}); + _build_col_idx.insert({i, result_col_id}); } return Status::OK(); } diff --git a/be/src/vec/exec/vset_operation_node.h b/be/src/vec/exec/vset_operation_node.h index 9b21fca26b3..88009557c68 100644 --- a/be/src/vec/exec/vset_operation_node.h +++ b/be/src/vec/exec/vset_operation_node.h @@ -107,8 +107,8 @@ private: std::vector<VExprContextSPtrs> _child_expr_lists; //record build column type DataTypes _left_table_data_types; - //first:column_id, could point to origin column or cast column - //second:idx mapped to column types + //first: idx mapped to column types + //second: column_id, could point to origin column or cast column std::unordered_map<int, int> _build_col_idx; //record memory during running int64_t _mem_used; diff --git a/regression-test/data/query_p0/operator/test_set_operator.out b/regression-test/data/query_p0/operator/test_set_operator.out index 1d8bc5ef93e..48eb4a0c9ba 100644 --- a/regression-test/data/query_p0/operator/test_set_operator.out +++ b/regression-test/data/query_p0/operator/test_set_operator.out @@ -13,3 +13,15 @@ 9 9 +-- !select_minus -- +3 3 +4 4 +5 5 +7 7 + +-- !select_except -- +3 3 +4 4 +5 5 +7 7 + diff --git a/regression-test/suites/query_p0/operator/test_set_operator.groovy b/regression-test/suites/query_p0/operator/test_set_operator.groovy index 69534381cd8..cb05e18b3e8 100644 --- a/regression-test/suites/query_p0/operator/test_set_operator.groovy +++ b/regression-test/suites/query_p0/operator/test_set_operator.groovy @@ -89,4 +89,12 @@ suite("test_set_operators", "query,p0") { t3 on t2.col1=t3.col1; """ + + order_qt_select_minus """ + select col1, col1 from t1 minus select col1, col1 from t2; + """ + + order_qt_select_except """ + select col1, col1 from t1 except select col1, col1 from t2; + """ } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org