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

morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new 08b99cea155 branch-3.1: [fix](nereids) inferPredicate should not 
pullup predicates from mark join's right child #57712 (#58341)
08b99cea155 is described below

commit 08b99cea1554a518ccb263b4d744fbe0b7a30f48
Author: minghong <[email protected]>
AuthorDate: Tue Dec 2 11:00:15 2025 +0800

    branch-3.1: [fix](nereids) inferPredicate should not pullup predicates from 
mark join's right child #57712 (#58341)
    
    picked from #57712
---
 .../nereids/rules/rewrite/InferPredicates.java     |  6 +++
 .../nereids/rules/rewrite/PullUpPredicates.java    | 16 +++++++
 .../nereids/rules/rewrite/InferPredicatesTest.java | 51 ++++++++++++++++++++++
 3 files changed, 73 insertions(+)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InferPredicates.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InferPredicates.java
index 98fd368b30e..4ca9cfad478 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InferPredicates.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/InferPredicates.java
@@ -22,7 +22,10 @@ import org.apache.doris.nereids.jobs.JobContext;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
+import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator;
+import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral;
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalEmptyRelation;
 import org.apache.doris.nereids.trees.plans.logical.LogicalExcept;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
 import org.apache.doris.nereids.trees.plans.logical.LogicalIntersect;
@@ -113,6 +116,9 @@ public class InferPredicates extends 
DefaultPlanRewriter<JobContext> implements
 
     @Override
     public Plan visitLogicalFilter(LogicalFilter<? extends Plan> filter, 
JobContext context) {
+        if (filter.getConjuncts().contains(BooleanLiteral.FALSE)) {
+            return new 
LogicalEmptyRelation(StatementScopeIdGenerator.newRelationId(), 
filter.getOutput());
+        }
         filter = visitChildren(this, filter, context);
         Set<Expression> filterPredicates = pullUpPredicates(filter);
         filterPredicates.removeAll(pullUpAllPredicates(filter.child()));
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
index a2d820a9ccd..57d3b0dc4e4 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
@@ -222,6 +222,22 @@ public class PullUpPredicates extends 
PlanVisitor<ImmutableSet<Expression>, Void
                     () -> join.right().accept(this, context));
             switch (join.getJoinType()) {
                 case CROSS_JOIN:
+                    /*
+                     * select * from t1 where exsits (select * from t2) or 
t1.a=t1.b
+                     * The above SQL will generate a mark join, with the join 
type being CROSS_JOIN.
+                     * In this case,
+                     * it is equivalent to simulating a left semi join using a 
cross join, and
+                     * predicates cannot be pulled up from the right child.
+                     */
+                    if (join.isMarkJoin()) {
+                        predicates.addAll(leftPredicates.get());
+                    } else {
+                        predicates.addAll(leftPredicates.get());
+                        predicates.addAll(rightPredicates.get());
+                        predicates.addAll(join.getHashJoinConjuncts());
+                        predicates.addAll(join.getOtherJoinConjuncts());
+                    }
+                    break;
                 case INNER_JOIN: {
                     predicates.addAll(leftPredicates.get());
                     predicates.addAll(rightPredicates.get());
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferPredicatesTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferPredicatesTest.java
index 95e676e8145..d7f4a66c7e5 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferPredicatesTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferPredicatesTest.java
@@ -17,14 +17,30 @@
 
 package org.apache.doris.nereids.rules.rewrite;
 
+import org.apache.doris.nereids.hint.DistributeHint;
+import org.apache.doris.nereids.trees.expressions.EqualTo;
+import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.MarkJoinSlotReference;
+import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral;
+import org.apache.doris.nereids.trees.plans.DistributeType;
 import org.apache.doris.nereids.trees.plans.JoinType;
+import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
+import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
+import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan;
+import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
 import org.apache.doris.nereids.util.ExpressionUtils;
 import org.apache.doris.nereids.util.MemoPatternMatchSupported;
 import org.apache.doris.nereids.util.PlanChecker;
+import org.apache.doris.nereids.util.PlanConstructor;
 import org.apache.doris.utframe.TestWithFeService;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.util.Optional;
+
 class InferPredicatesTest extends TestWithFeService implements 
MemoPatternMatchSupported {
 
     @Override
@@ -774,4 +790,39 @@ class InferPredicatesTest extends TestWithFeService 
implements MemoPatternMatchS
                 .matches(logicalFilter(logicalOlapScan().when(scan -> 
scan.getTable().getName().equals("student")))
                         .when(filter -> filter.getConjuncts().size() == 2));
     }
+
+    @Test
+    void pullUpPredicatesShouldIgnoreRightSideForCrossJoinMarkJoin() {
+        LogicalOlapScan leftScan = PlanConstructor.newLogicalOlapScan(10, 
"mark_left", 0);
+        LogicalOlapScan rightScan = PlanConstructor.newLogicalOlapScan(11, 
"mark_right", 0);
+        Expression leftPredicate = new EqualTo(leftScan.getOutput().get(0), 
new IntegerLiteral(1));
+        Expression rightPredicate = new EqualTo(rightScan.getOutput().get(0), 
new IntegerLiteral(2));
+
+        LogicalFilter<LogicalOlapScan> leftFilter = new 
LogicalFilter<>(ImmutableSet.of(leftPredicate),
+                leftScan);
+        LogicalFilter<LogicalOlapScan> rightFilter = new 
LogicalFilter<>(ImmutableSet.of(rightPredicate),
+                rightScan);
+
+        LogicalJoin<LogicalPlan, LogicalPlan> markJoin = new LogicalJoin<>(
+                JoinType.CROSS_JOIN,
+                ImmutableList.<Expression>of(),
+                ImmutableList.<Expression>of(),
+                ImmutableList.<Expression>of(),
+                new DistributeHint(DistributeType.NONE),
+                Optional.of(new MarkJoinSlotReference("mark")),
+                leftFilter,
+                rightFilter,
+                null);
+
+        PullUpPredicates pullUpPredicates = new PullUpPredicates(false);
+        PullUpPredicates pullUpAllPredicates = new PullUpPredicates(true);
+
+        ImmutableSet<Expression> predicates = 
markJoin.accept(pullUpPredicates, null);
+        ImmutableSet<Expression> allPredicates = 
markJoin.accept(pullUpAllPredicates, null);
+
+        Assertions.assertTrue(predicates.contains(leftPredicate));
+        Assertions.assertFalse(predicates.contains(rightPredicate));
+        Assertions.assertTrue(allPredicates.contains(leftPredicate));
+        Assertions.assertFalse(allPredicates.contains(rightPredicate));
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to