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

starocean999 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 8e7b51470a8 [fix](nereids)forbid some join reorder rules for mark join 
(#31966)
8e7b51470a8 is described below

commit 8e7b51470a8b34e5f8c4c7a4a8d88993c4c670d1
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Fri Mar 8 10:15:05 2024 +0800

    [fix](nereids)forbid some join reorder rules for mark join (#31966)
---
 .../doris/nereids/rules/exploration/join/JoinCommute.java    |  5 +++--
 .../rules/exploration/join/LogicalJoinSemiJoinTranspose.java |  7 +++++++
 .../join/LogicalJoinSemiJoinTransposeProject.java            |  7 +++++++
 .../main/java/org/apache/doris/nereids/util/JoinUtils.java   | 12 ++++++++++++
 4 files changed, 29 insertions(+), 2 deletions(-)

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 ef8868998e0..49c91b92942 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
@@ -63,8 +63,9 @@ public class JoinCommute extends OneExplorationRuleFactory {
                 // null aware mark join will be translated to null aware left 
semi/anti join
                 // we don't support null aware right semi/anti join, so should 
not commute
                 .whenNot(join -> JoinUtils.isNullAwareMarkJoin(join))
-                // commuting nest loop mark join is not supported by be
-                .whenNot(join -> join.isMarkJoin() && 
join.getHashJoinConjuncts().isEmpty())
+                // commuting nest loop mark join or left anti mark join is not 
supported by be
+                .whenNot(join -> join.isMarkJoin() && 
(join.getHashJoinConjuncts().isEmpty()
+                        || join.getJoinType().isLeftAntiJoin()))
                 .then(join -> {
                     LogicalJoin<Plan, Plan> newJoin = 
join.withTypeChildren(join.getJoinType().swap(),
                             join.right(), join.left(), null);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTranspose.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTranspose.java
index 7f0409e45e6..9482d719451 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTranspose.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTranspose.java
@@ -23,6 +23,7 @@ import 
org.apache.doris.nereids.rules.exploration.ExplorationRuleFactory;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
+import org.apache.doris.nereids.util.JoinUtils;
 
 import com.google.common.collect.ImmutableList;
 
@@ -46,6 +47,9 @@ public class LogicalJoinSemiJoinTranspose implements 
ExplorationRuleFactory {
                         .whenNot(topJoin -> topJoin.hasDistributeHint() || 
topJoin.left().hasDistributeHint())
                         .then(topJoin -> {
                             LogicalJoin<GroupPlan, GroupPlan> bottomJoin = 
topJoin.left();
+                            if (!JoinUtils.checkReorderPrecondition(topJoin, 
bottomJoin)) {
+                                return null;
+                            }
                             GroupPlan a = bottomJoin.left();
                             GroupPlan b = bottomJoin.right();
                             GroupPlan c = topJoin.right();
@@ -61,6 +65,9 @@ public class LogicalJoinSemiJoinTranspose implements 
ExplorationRuleFactory {
                         .whenNot(topJoin -> topJoin.hasDistributeHint() || 
topJoin.right().hasDistributeHint())
                         .then(topJoin -> {
                             LogicalJoin<GroupPlan, GroupPlan> bottomJoin = 
topJoin.right();
+                            if (!JoinUtils.checkReorderPrecondition(topJoin, 
bottomJoin)) {
+                                return null;
+                            }
                             GroupPlan a = topJoin.left();
                             GroupPlan b = bottomJoin.left();
                             GroupPlan c = bottomJoin.right();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTransposeProject.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTransposeProject.java
index 3b2c6e0dbc7..0240fc99586 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTransposeProject.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/LogicalJoinSemiJoinTransposeProject.java
@@ -24,6 +24,7 @@ import 
org.apache.doris.nereids.rules.exploration.ExplorationRuleFactory;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
+import org.apache.doris.nereids.util.JoinUtils;
 
 import com.google.common.collect.ImmutableList;
 
@@ -48,6 +49,9 @@ public class LogicalJoinSemiJoinTransposeProject implements 
ExplorationRuleFacto
                         .when(join -> join.left().isAllSlots())
                         .then(topJoin -> {
                             LogicalJoin<GroupPlan, GroupPlan> bottomJoin = 
topJoin.left().child();
+                            if (!JoinUtils.checkReorderPrecondition(topJoin, 
bottomJoin)) {
+                                return null;
+                            }
                             GroupPlan a = bottomJoin.left();
                             GroupPlan b = bottomJoin.right();
                             GroupPlan c = topJoin.right();
@@ -68,6 +72,9 @@ public class LogicalJoinSemiJoinTransposeProject implements 
ExplorationRuleFacto
                         .when(join -> join.right().isAllSlots())
                         .then(topJoin -> {
                             LogicalJoin<GroupPlan, GroupPlan> bottomJoin = 
topJoin.right().child();
+                            if (!JoinUtils.checkReorderPrecondition(topJoin, 
bottomJoin)) {
+                                return null;
+                            }
                             GroupPlan a = topJoin.left();
                             GroupPlan b = bottomJoin.left();
                             GroupPlan c = bottomJoin.right();
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 3c439f8b99f..07274cc27c6 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
@@ -29,6 +29,7 @@ import 
org.apache.doris.nereids.rules.rewrite.ForeignKeyContext;
 import org.apache.doris.nereids.trees.expressions.EqualPredicate;
 import org.apache.doris.nereids.trees.expressions.ExprId;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.MarkJoinSlotReference;
 import org.apache.doris.nereids.trees.expressions.Not;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import 
org.apache.doris.nereids.trees.expressions.functions.scalar.BitmapContains;
@@ -392,4 +393,15 @@ public class JoinUtils {
         // and translate join type to NULL_AWARE_LEFT_SEMI_JOIN or 
NULL_AWARE_LEFT_ANTI_JOIN
         return join.getHashJoinConjuncts().isEmpty() && 
!join.getMarkJoinConjuncts().isEmpty();
     }
+
+    /**
+     * forbid join reorder if top join's condition use mark join slot produced 
by bottom join
+     */
+    public static boolean checkReorderPrecondition(LogicalJoin<?, ?> top, 
LogicalJoin<?, ?> bottom) {
+        Set<Slot> markSlots = top.getConditionSlot().stream()
+                .filter(MarkJoinSlotReference.class::isInstance)
+                .collect(Collectors.toSet());
+        markSlots.retainAll(bottom.getOutputSet());
+        return markSlots.isEmpty();
+    }
 }


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

Reply via email to