This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 24a3706281bcfefb5b2fd9e07d676101a6e0f8b8
Author: morrySnow <101034200+morrys...@users.noreply.github.com>
AuthorDate: Wed Mar 15 09:56:44 2023 +0800

    [fix](planner) nested loop join with left semi generate repeat result 
(#17767)
---
 .../java/org/apache/doris/planner/NestedLoopJoinNode.java   |  4 ++--
 .../src/main/java/org/apache/doris/qe/Coordinator.java      |  4 ++++
 .../data/query_p0/join/test_nestedloop_semi_anti_join.out   |  3 +++
 .../query_p0/join/test_nestedloop_semi_anti_join.groovy     | 13 +++++++++++++
 4 files changed, 22 insertions(+), 2 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java 
b/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java
index 421c534860..351e67f30c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java
@@ -76,8 +76,8 @@ public class NestedLoopJoinNode extends JoinNodeBase {
 
     public boolean canParallelize() {
         return joinOp == JoinOperator.CROSS_JOIN || joinOp == 
JoinOperator.INNER_JOIN
-                || joinOp == JoinOperator.LEFT_OUTER_JOIN || joinOp == 
JoinOperator.LEFT_ANTI_JOIN
-                || joinOp == JoinOperator.NULL_AWARE_LEFT_ANTI_JOIN;
+                || joinOp == JoinOperator.LEFT_OUTER_JOIN || joinOp == 
JoinOperator.LEFT_SEMI_JOIN
+                || joinOp == JoinOperator.LEFT_ANTI_JOIN || joinOp == 
JoinOperator.NULL_AWARE_LEFT_ANTI_JOIN;
     }
 
     public void setJoinConjuncts(List<Expr> joinConjuncts) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
index d76677ac8d..8878eab5e3 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/Coordinator.java
@@ -1261,6 +1261,10 @@ public class Coordinator {
                 if (ConnectContext.get() != null && 
ConnectContext.get().getSessionVariable() != null) {
                     exchangeInstances = 
ConnectContext.get().getSessionVariable().getExchangeInstanceParallel();
                 }
+                // when we use nested loop join do right outer / semi / anti 
join, the instance must be 1.
+                if (leftMostNode.getNumInstances() == 1) {
+                    exchangeInstances = 1;
+                }
                 if (exchangeInstances > 0 && 
fragmentExecParamsMap.get(inputFragmentId)
                         .instanceExecParams.size() > exchangeInstances) {
                     // random select some instance
diff --git 
a/regression-test/data/query_p0/join/test_nestedloop_semi_anti_join.out 
b/regression-test/data/query_p0/join/test_nestedloop_semi_anti_join.out
index 73d9152253..563fc605a9 100644
--- a/regression-test/data/query_p0/join/test_nestedloop_semi_anti_join.out
+++ b/regression-test/data/query_p0/join/test_nestedloop_semi_anti_join.out
@@ -39,3 +39,6 @@
 3      3
 10     10
 
+-- !nlj_left_semi --
+1
+
diff --git 
a/regression-test/suites/query_p0/join/test_nestedloop_semi_anti_join.groovy 
b/regression-test/suites/query_p0/join/test_nestedloop_semi_anti_join.groovy
index 36a38996d7..d43d6f254f 100644
--- a/regression-test/suites/query_p0/join/test_nestedloop_semi_anti_join.groovy
+++ b/regression-test/suites/query_p0/join/test_nestedloop_semi_anti_join.groovy
@@ -78,4 +78,17 @@ suite("test_nestedloop_semi_anti_join", "query_p0") {
     """
     sql "DROP TABLE IF EXISTS ${tbl1}"
     sql "DROP TABLE IF EXISTS ${tbl2}"
+
+    sql """
+        CREATE TABLE ${tbl1} (id int)
+        DISTRIBUTED BY HASH(id)
+        PROPERTIES ("replication_allocation" = "tag.location.default: 1");
+    """
+
+    sql "insert into ${tbl1} values (1),(2),(3);"
+
+    qt_nlj_left_semi "select a.id\n" +
+            "from ${tbl1} a\n" +
+            "join (select id from ${tbl1} where id = (select 1)) b on a.id = 
b.id"
+    sql "DROP TABLE IF EXISTS ${tbl1}"
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to