diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java index 37765dd36239fd..0a0971e3de2d7d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/ReorderJoin.java @@ -124,6 +124,10 @@ public Plan joinToMultiJoin(Plan plan, Map planToHintType) join = (LogicalJoin) plan; } + if (join.isMarkJoin()) { + return plan; + } + if (join.getJoinType().isInnerOrCrossJoin()) { joinFilter.addAll(join.getHashJoinConjuncts()); joinFilter.addAll(join.getOtherJoinConjuncts()); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ReorderJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ReorderJoinTest.java index 42f87cdd5575c8..047b7bc27eeb33 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ReorderJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/ReorderJoinTest.java @@ -105,6 +105,25 @@ public void testLeftSemiJoin() { ); } + @Test + public void testLeftSemiMarkJoin() { + LogicalPlan plan = new LogicalPlanBuilder(scan1) + .markJoin(scan2, JoinType.LEFT_SEMI_JOIN, Pair.of(0, 0)) + .join(scan3, JoinType.INNER_JOIN, Pair.of(0, 0)) + .filter(new EqualTo(scan3.getOutput().get(0), scan1.getOutput().get(0))) + .build(); + ConnectContext connectContext = MemoTestUtils.createConnectContext(); + connectContext.getSessionVariable().setDisableNereidsRules("PRUNE_EMPTY_PARTITION"); + PlanChecker.from(connectContext, plan) + .applyBottomUp(new ReorderJoin()) + .matchesFromRoot( + logicalJoin( + logicalJoin().when(join -> join.isMarkJoin()), + logicalOlapScan() + ).whenNot(join -> join.getJoinType().isCrossJoin()) + ); + } + @Test public void testRightSemiJoin() { LogicalPlan plan1 = new LogicalPlanBuilder(scan1)