You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/12/22 06:13:54 UTC
[doris] branch master updated: [Feature](Nereids) unnest subquery in 'not in' predicate into NULL AWARE ANTI JOIN (#15230)
This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new a87f905a2d [Feature](Nereids) unnest subquery in 'not in' predicate into NULL AWARE ANTI JOIN (#15230)
a87f905a2d is described below
commit a87f905a2dab0d4b9f6c540455f8d44b512650bb
Author: zhengshiJ <32...@users.noreply.github.com>
AuthorDate: Thu Dec 22 14:13:47 2022 +0800
[Feature](Nereids) unnest subquery in 'not in' predicate into NULL AWARE ANTI JOIN (#15230)
when we process not in subquery. if the subquery return column is nullable, we need a NULL AWARE ANTI JOIN instead of ANTI JOIN.
Doris already support NULL AWARE ANTI JOIN in PR #13871
Nereids need to do that so.
---
.../glue/translator/PhysicalPlanTranslator.java | 8 ++-
.../processor/post/RuntimeFilterGenerator.java | 3 +-
.../rules/exploration/join/JoinCommute.java | 7 ++
.../join/SemiJoinLogicalJoinTranspose.java | 3 +-
.../join/SemiJoinLogicalJoinTransposeProject.java | 3 +-
.../join/SemiJoinSemiJoinTranspose.java | 7 +-
.../rules/rewrite/logical/InApplyToJoin.java | 4 +-
.../rules/rewrite/logical/InferPredicates.java | 1 +
.../rules/rewrite/logical/PullUpPredicates.java | 1 +
.../rewrite/logical/PushdownFilterThroughJoin.java | 1 +
.../logical/PushdownJoinOtherCondition.java | 1 +
.../apache/doris/nereids/stats/JoinEstimation.java | 4 +-
.../apache/doris/nereids/trees/plans/JoinType.java | 4 ++
.../nereids/trees/plans/logical/LogicalJoin.java | 1 +
.../org/apache/doris/nereids/util/JoinUtils.java | 4 +-
.../null_aware_left_anti_join.out | 12 ++++
.../null_aware_left_anti_join.groovy | 79 ++++++++++++++++++++++
17 files changed, 132 insertions(+), 11 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 225fb883c9..6237bef417 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -745,7 +745,9 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
TupleDescriptor intermediateDescriptor = context.generateTupleDesc();
if (hashJoin.getOtherJoinConjuncts().isEmpty()
- && (joinType == JoinType.LEFT_ANTI_JOIN || joinType == JoinType.LEFT_SEMI_JOIN)) {
+ && (joinType == JoinType.LEFT_ANTI_JOIN
+ || joinType == JoinType.LEFT_SEMI_JOIN
+ || joinType == JoinType.NULL_AWARE_LEFT_ANTI_JOIN)) {
for (SlotDescriptor leftSlotDescriptor : leftSlotDescriptors) {
if (!leftSlotDescriptor.isMaterialized()) {
continue;
@@ -903,7 +905,9 @@ public class PhysicalPlanTranslator extends DefaultPlanVisitor<PlanFragment, Pla
.collect(Collectors.toList());
if (nestedLoopJoinNode.getConjuncts().isEmpty()
- && (joinType == JoinType.LEFT_ANTI_JOIN || joinType == JoinType.LEFT_SEMI_JOIN)) {
+ && (joinType == JoinType.LEFT_ANTI_JOIN
+ || joinType == JoinType.LEFT_SEMI_JOIN
+ || joinType == JoinType.NULL_AWARE_LEFT_ANTI_JOIN)) {
for (SlotDescriptor leftSlotDescriptor : leftSlotDescriptors) {
if (!leftSlotDescriptor.isMaterialized()) {
continue;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterGenerator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterGenerator.java
index c580866a16..1d656fa9b7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterGenerator.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/RuntimeFilterGenerator.java
@@ -55,7 +55,8 @@ public class RuntimeFilterGenerator extends PlanPostProcessor {
private static final ImmutableSet<JoinType> deniedJoinType = ImmutableSet.of(
JoinType.LEFT_ANTI_JOIN,
JoinType.FULL_OUTER_JOIN,
- JoinType.LEFT_OUTER_JOIN
+ JoinType.LEFT_OUTER_JOIN,
+ JoinType.NULL_AWARE_LEFT_ANTI_JOIN
);
private final IdGenerator<RuntimeFilterId> generator = RuntimeFilterId.createGenerator();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java
index 0dfa60dd05..3c89dcd681 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinCommute.java
@@ -68,11 +68,18 @@ public class JoinCommute extends OneExplorationRuleFactory {
LEFT_DEEP, ZIG_ZAG, BUSHY
}
+ /**
+ * Check if commutative law needs to be enforced.
+ */
public static boolean check(SwapType swapType, LogicalJoin<GroupPlan, GroupPlan> join) {
if (swapType == SwapType.LEFT_DEEP && isNotBottomJoin(join)) {
return false;
}
+ if (join.getJoinType().isNullAwareLeftAntiJoin()) {
+ return false;
+ }
+
return !join.getJoinReorderContext().hasCommute() && !join.getJoinReorderContext().hasExchange();
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinLogicalJoinTranspose.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinLogicalJoinTranspose.java
index be0508336a..0f4c57a09f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinLogicalJoinTranspose.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinLogicalJoinTranspose.java
@@ -55,7 +55,8 @@ public class SemiJoinLogicalJoinTranspose extends OneExplorationRuleFactory {
public Rule build() {
return logicalJoin(logicalJoin(), group())
.when(topJoin -> topJoin.getJoinType() == JoinType.LEFT_SEMI_JOIN
- || topJoin.getJoinType() == JoinType.LEFT_ANTI_JOIN)
+ || topJoin.getJoinType() == JoinType.LEFT_ANTI_JOIN
+ || topJoin.getJoinType() == JoinType.NULL_AWARE_LEFT_ANTI_JOIN)
.whenNot(topJoin -> topJoin.left().getJoinType().isSemiOrAntiJoin())
.when(this::conditionChecker)
.whenNot(topJoin -> topJoin.hasJoinHint() || topJoin.left().hasJoinHint())
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinLogicalJoinTransposeProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinLogicalJoinTransposeProject.java
index 3546abfa07..4559680e37 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinLogicalJoinTransposeProject.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinLogicalJoinTransposeProject.java
@@ -57,7 +57,8 @@ public class SemiJoinLogicalJoinTransposeProject extends OneExplorationRuleFacto
public Rule build() {
return logicalJoin(logicalProject(logicalJoin()), group())
.when(topJoin -> topJoin.getJoinType() == JoinType.LEFT_SEMI_JOIN
- || topJoin.getJoinType() == JoinType.LEFT_ANTI_JOIN)
+ || topJoin.getJoinType() == JoinType.LEFT_ANTI_JOIN
+ || topJoin.getJoinType() == JoinType.NULL_AWARE_LEFT_ANTI_JOIN)
.whenNot(topJoin -> topJoin.left().child().getJoinType().isSemiOrAntiJoin())
.whenNot(join -> join.hasJoinHint() || join.left().child().hasJoinHint())
.when(this::conditionChecker)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTranspose.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTranspose.java
index 78bc186501..e616bc7397 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTranspose.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/SemiJoinSemiJoinTranspose.java
@@ -44,7 +44,12 @@ public class SemiJoinSemiJoinTranspose extends OneExplorationRuleFactory {
Pair.of(JoinType.LEFT_SEMI_JOIN, JoinType.LEFT_SEMI_JOIN),
Pair.of(JoinType.LEFT_ANTI_JOIN, JoinType.LEFT_ANTI_JOIN),
Pair.of(JoinType.LEFT_SEMI_JOIN, JoinType.LEFT_ANTI_JOIN),
- Pair.of(JoinType.LEFT_ANTI_JOIN, JoinType.LEFT_SEMI_JOIN));
+ Pair.of(JoinType.LEFT_ANTI_JOIN, JoinType.LEFT_SEMI_JOIN),
+ Pair.of(JoinType.NULL_AWARE_LEFT_ANTI_JOIN, JoinType.NULL_AWARE_LEFT_ANTI_JOIN),
+ Pair.of(JoinType.NULL_AWARE_LEFT_ANTI_JOIN, JoinType.LEFT_SEMI_JOIN),
+ Pair.of(JoinType.NULL_AWARE_LEFT_ANTI_JOIN, JoinType.LEFT_ANTI_JOIN),
+ Pair.of(JoinType.LEFT_SEMI_JOIN, JoinType.NULL_AWARE_LEFT_ANTI_JOIN),
+ Pair.of(JoinType.LEFT_ANTI_JOIN, JoinType.NULL_AWARE_LEFT_ANTI_JOIN));
/*
* topJoin newTopJoin
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InApplyToJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InApplyToJoin.java
index ba89fe1f0e..ba6b1fa325 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InApplyToJoin.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InApplyToJoin.java
@@ -34,7 +34,7 @@ import com.google.common.collect.Lists;
/**
* Convert InApply to LogicalJoin.
* <p>
- * Not In -> LEFT_ANTI_JOIN
+ * Not In -> NULL_AWARE_LEFT_ANTI_JOIN
* In -> LEFT_SEMI_JOIN
*/
public class InApplyToJoin extends OneRewriteRuleFactory {
@@ -53,7 +53,7 @@ public class InApplyToJoin extends OneRewriteRuleFactory {
}
if (((InSubquery) apply.getSubqueryExpr()).isNot()) {
- return new LogicalJoin<>(JoinType.LEFT_ANTI_JOIN, Lists.newArrayList(),
+ return new LogicalJoin<>(JoinType.NULL_AWARE_LEFT_ANTI_JOIN, Lists.newArrayList(),
ExpressionUtils.extractConjunction(predicate),
JoinHint.NONE,
apply.left(), apply.right());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InferPredicates.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InferPredicates.java
index d1e5ab77ef..e56abd201d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InferPredicates.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/InferPredicates.java
@@ -69,6 +69,7 @@ public class InferPredicates extends DefaultPlanRewriter<JobContext> {
break;
case LEFT_OUTER_JOIN:
case LEFT_ANTI_JOIN:
+ case NULL_AWARE_LEFT_ANTI_JOIN:
otherJoinConjuncts.addAll(inferNewPredicate(right, expressions));
break;
case RIGHT_OUTER_JOIN:
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpPredicates.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpPredicates.java
index 9d86415344..ea4333c4d6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpPredicates.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpPredicates.java
@@ -91,6 +91,7 @@ public class PullUpPredicates extends PlanVisitor<ImmutableSet<Expression>, Void
break;
case LEFT_OUTER_JOIN:
case LEFT_ANTI_JOIN:
+ case NULL_AWARE_LEFT_ANTI_JOIN:
predicates.addAll(leftPredicates);
break;
case RIGHT_OUTER_JOIN:
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughJoin.java
index 1bdc6087ec..48e7141dc0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughJoin.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownFilterThroughJoin.java
@@ -47,6 +47,7 @@ public class PushdownFilterThroughJoin extends OneRewriteRuleFactory {
JoinType.LEFT_OUTER_JOIN,
JoinType.LEFT_SEMI_JOIN,
JoinType.LEFT_ANTI_JOIN,
+ JoinType.NULL_AWARE_LEFT_ANTI_JOIN,
JoinType.CROSS_JOIN
);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownJoinOtherCondition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownJoinOtherCondition.java
index cbe3eebe17..b5fe6c5cad 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownJoinOtherCondition.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PushdownJoinOtherCondition.java
@@ -50,6 +50,7 @@ public class PushdownJoinOtherCondition extends OneRewriteRuleFactory {
JoinType.INNER_JOIN,
JoinType.LEFT_OUTER_JOIN,
JoinType.LEFT_ANTI_JOIN,
+ JoinType.NULL_AWARE_LEFT_ANTI_JOIN,
JoinType.LEFT_SEMI_JOIN,
JoinType.RIGHT_SEMI_JOIN,
JoinType.CROSS_JOIN
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/JoinEstimation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/JoinEstimation.java
index 8531321e3f..50e8fce4c4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/JoinEstimation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/JoinEstimation.java
@@ -98,7 +98,9 @@ public class JoinEstimation {
public static StatsDeriveResult estimate(StatsDeriveResult leftStats, StatsDeriveResult rightStats, Join join) {
JoinType joinType = join.getJoinType();
double rowCount = Double.MAX_VALUE;
- if (joinType == JoinType.LEFT_SEMI_JOIN || joinType == JoinType.LEFT_ANTI_JOIN) {
+ if (joinType == JoinType.LEFT_SEMI_JOIN
+ || joinType == JoinType.LEFT_ANTI_JOIN
+ || joinType == JoinType.NULL_AWARE_LEFT_ANTI_JOIN) {
double rightCount = rightStats.getRowCount();
double leftCount = leftStats.getRowCount();
if (join.getHashJoinConjuncts().isEmpty()) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/JoinType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/JoinType.java
index f5d816d76a..a6f5cd2cb0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/JoinType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/JoinType.java
@@ -146,6 +146,10 @@ public enum JoinType {
return this != LEFT_SEMI_JOIN && this != LEFT_ANTI_JOIN && this != NULL_AWARE_LEFT_ANTI_JOIN;
}
+ public final boolean isNullAwareLeftAntiJoin() {
+ return this == NULL_AWARE_LEFT_ANTI_JOIN;
+ }
+
public final boolean isSwapJoinType() {
return joinSwapMap.containsKey(this);
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java
index db9ed1816b..663108bab6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalJoin.java
@@ -174,6 +174,7 @@ public class LogicalJoin<LEFT_CHILD_TYPE extends Plan, RIGHT_CHILD_TYPE extends
switch (joinType) {
case LEFT_SEMI_JOIN:
case LEFT_ANTI_JOIN:
+ case NULL_AWARE_LEFT_ANTI_JOIN:
return ImmutableList.copyOf(left().getOutput());
case RIGHT_SEMI_JOIN:
case RIGHT_ANTI_JOIN:
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
index 125c18d199..5f590e2842 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/JoinUtils.java
@@ -51,8 +51,8 @@ import java.util.stream.Collectors;
*/
public class JoinUtils {
public static boolean couldShuffle(Join join) {
- // Cross-join only can be broadcast join.
- return !(join.getJoinType().isCrossJoin());
+ // Cross-join and Null-Aware-Left-Anti-Join only can be broadcast join.
+ return !(join.getJoinType().isCrossJoin()) && !(join.getJoinType().isNullAwareLeftAntiJoin());
}
public static boolean couldBroadcast(Join join) {
diff --git a/regression-test/data/nereids_syntax_p0/null_aware_left_anti_join.out b/regression-test/data/nereids_syntax_p0/null_aware_left_anti_join.out
new file mode 100644
index 0000000000..445f07fa65
--- /dev/null
+++ b/regression-test/data/nereids_syntax_p0/null_aware_left_anti_join.out
@@ -0,0 +1,12 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !select --
+2
+
+-- !select --
+\N
+2
+
+-- !select --
+
+-- !select --
+
diff --git a/regression-test/suites/nereids_syntax_p0/null_aware_left_anti_join.groovy b/regression-test/suites/nereids_syntax_p0/null_aware_left_anti_join.groovy
new file mode 100644
index 0000000000..e6a15f6ca9
--- /dev/null
+++ b/regression-test/suites/nereids_syntax_p0/null_aware_left_anti_join.groovy
@@ -0,0 +1,79 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_nereids_null_aware_left_anti_join") {
+ def tableName1 = "test_null_aware_left_anti_join1"
+ def tableName2 = "test_null_aware_left_anti_join2"
+ sql """
+ drop table if exists ${tableName1};
+ """
+
+ sql """
+ drop table if exists ${tableName2};
+ """
+
+ sql """
+ create table if not exists ${tableName1} ( `k1` int(11) NULL ) DISTRIBUTED BY HASH(`k1`) BUCKETS 4 PROPERTIES ( "replication_num" = "1");
+ """
+
+ sql """
+ create table if not exists ${tableName2} ( `k1` int(11) NULL ) DISTRIBUTED BY HASH(`k1`) BUCKETS 4 PROPERTIES ( "replication_num" = "1");
+ """
+
+ sql """
+ insert into ${tableName1} values (1), (3);
+ """
+
+ sql """
+ insert into ${tableName2} values (1), (2);
+ """
+ sql "SET enable_nereids_planner=true"
+ sql "SET enable_vectorized_engine=true"
+
+ sql "SET enable_fallback_to_original_planner=false"
+ qt_select """ select ${tableName2}.k1 from ${tableName2} where k1 not in (select ${tableName1}.k1 from ${tableName1}) order by ${tableName2}.k1; """
+
+ sql "SET enable_fallback_to_original_planner=true"
+ sql """
+ insert into ${tableName2} values(null);
+ """
+
+ sql "SET enable_fallback_to_original_planner=false"
+ qt_select """ select ${tableName2}.k1 from ${tableName2} where k1 not in (select ${tableName1}.k1 from ${tableName1}) order by ${tableName2}.k1; """
+
+ sql "SET enable_fallback_to_original_planner=true"
+ sql """
+ insert into ${tableName1} values(null);
+ """
+
+ sql "SET enable_fallback_to_original_planner=false"
+ qt_select """ select ${tableName2}.k1 from ${tableName2} where k1 not in (select ${tableName1}.k1 from ${tableName1}) order by ${tableName2}.k1; """
+
+ sql "SET enable_fallback_to_original_planner=true"
+ sql """ set parallel_fragment_exec_instance_num=2; """
+ sql "SET enable_fallback_to_original_planner=false"
+ qt_select """ select ${tableName2}.k1 from ${tableName2} where k1 not in (select ${tableName1}.k1 from ${tableName1}) order by ${tableName2}.k1; """
+
+ sql "SET enable_fallback_to_original_planner=true"
+ sql """
+ drop table if exists ${tableName2};
+ """
+
+ sql """
+ drop table if exists ${tableName1};
+ """
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org