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