From e86598bb74d6da3c9e1b5f9255b01a1db84bb0b0 Mon Sep 17 00:00:00 2001 From: starocean999 Date: Mon, 13 Oct 2025 15:59:20 +0800 Subject: [PATCH] [fix](nereids)ReorderJoin rule should not absorb mark join to multi join (#56837) Issue Number: close (https://github.com/apache/doris/issues/56786) --- .../nereids/rules/rewrite/ReorderJoin.java | 4 ++++ .../rules/rewrite/ReorderJoinTest.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) 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)