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

Reply via email to