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]