From 1dd6da3831d66d43b38587eb354a5f62b575356c Mon Sep 17 00:00:00 2001 From: feiniaofeiafei Date: Mon, 15 Jun 2026 12:02:23 +0800 Subject: [PATCH 1/3] add flag isSaltJoinGenerated in JoinReorderContext --- .../rules/exploration/join/JoinReorderContext.java | 11 +++++++++++ .../apache/doris/nereids/rules/rewrite/SaltJoin.java | 1 + .../apache/doris/nereids/rules/rewrite/SkewJoin.java | 1 + 3 files changed, 13 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderContext.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderContext.java index 376e75a7aa5979..716df428b14ecc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderContext.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/join/JoinReorderContext.java @@ -40,6 +40,7 @@ public class JoinReorderContext { private boolean hasLeftAssociate = false; private boolean isLeadingJoin = false; + private boolean isSaltJoinGenerated = false; public JoinReorderContext() { } @@ -55,6 +56,7 @@ public void copyFrom(JoinReorderContext joinReorderContext) { this.hasRightAssociate = joinReorderContext.hasRightAssociate; this.hasCommuteZigZag = joinReorderContext.hasCommuteZigZag; this.isLeadingJoin = joinReorderContext.isLeadingJoin; + this.isSaltJoinGenerated = joinReorderContext.isSaltJoinGenerated; } /** @@ -68,6 +70,7 @@ public void clear() { hasRightAssociate = false; hasLeftAssociate = false; isLeadingJoin = false; + isSaltJoinGenerated = false; } public boolean hasCommute() { @@ -125,4 +128,12 @@ public boolean isLeadingJoin() { public void setLeadingJoin(boolean leadingJoin) { isLeadingJoin = leadingJoin; } + + public boolean isSaltJoinGenerated() { + return isSaltJoinGenerated; + } + + public void setSaltJoinGenerated(boolean saltJoinGenerated) { + isSaltJoinGenerated = saltJoinGenerated; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SaltJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SaltJoin.java index bccaac9fb110f4..698114ba14643e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SaltJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SaltJoin.java @@ -325,6 +325,7 @@ private static LogicalProject expandSkewValueRows(Expression skewExpr, Lis equalTo = (EqualPredicate) TypeCoercionUtils.processComparisonPredicate(equalTo); JoinReorderContext joinReorderContext = new JoinReorderContext(); joinReorderContext.setLeadingJoin(true); + joinReorderContext.setSaltJoinGenerated(true); LogicalJoin rightJoin = new LogicalJoin<>(JoinType.RIGHT_OUTER_JOIN, ImmutableList.of(equalTo), project, originPlan, joinReorderContext); // construct upper project diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SkewJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SkewJoin.java index 29121236e83d82..f7ebce3570d73c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SkewJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SkewJoin.java @@ -56,6 +56,7 @@ public Rule build() { .when(join -> join.getJoinType().isOneSideOuterJoin() || join.getJoinType().isInnerJoin() || join.getJoinType().isAsofJoin()) .when(join -> join.getDistributeHint().distributeType == DistributeType.NONE) + .whenNot(join -> join.getJoinReorderContext().isSaltJoinGenerated()) .whenNot(LogicalJoin::isMarkJoin) .thenApply(SkewJoin::transform).toRule(RuleType.SALT_JOIN); } From 3d77768702c89f9cb89b6a82f7c8183a5ffbe812 Mon Sep 17 00:00:00 2001 From: feiniaofeiafei Date: Mon, 15 Jun 2026 12:12:10 +0800 Subject: [PATCH 2/3] asof join not support auto salt join --- .../org/apache/doris/nereids/rules/rewrite/SkewJoin.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SkewJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SkewJoin.java index f7ebce3570d73c..5db8f4217f54bb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SkewJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/SkewJoin.java @@ -54,7 +54,7 @@ public class SkewJoin extends OneRewriteRuleFactory { public Rule build() { return logicalJoin() .when(join -> join.getJoinType().isOneSideOuterJoin() - || join.getJoinType().isInnerJoin() || join.getJoinType().isAsofJoin()) + || join.getJoinType().isInnerJoin()) .when(join -> join.getDistributeHint().distributeType == DistributeType.NONE) .whenNot(join -> join.getJoinReorderContext().isSaltJoinGenerated()) .whenNot(LogicalJoin::isMarkJoin) @@ -87,8 +87,7 @@ private static Plan transform(MatchingContext> ctx) { equal = equal.commute(); } - if (join.getJoinType().isInnerJoin() || join.getJoinType().isLeftOuterJoin() - || join.getJoinType().isAsofInnerJoin() || join.getJoinType().isAsofLeftOuterJoin()) { + if (join.getJoinType().isInnerJoin() || join.getJoinType().isLeftOuterJoin()) { Expression leftEqHand = equal.child(0); if (left.getStats().findColumnStatistics(leftEqHand) != null) { ColumnStatistic leftColStats = left.getStats().findColumnStatistics(leftEqHand); @@ -99,7 +98,7 @@ private static Plan transform(MatchingContext> ctx) { hotValues.addAll(filtered.keySet()); } } - } else if (join.getJoinType().isRightOuterJoin() || join.getJoinType().isAsofRightOuterJoin()) { + } else if (join.getJoinType().isRightOuterJoin()) { Expression rightEqHand = equal.child(1); if (right.getStats().findColumnStatistics(rightEqHand) != null) { ColumnStatistic rightColStats = right.getStats().findColumnStatistics(rightEqHand); From f96bcb1411017af0736a7ede61535d16d7808f91 Mon Sep 17 00:00:00 2001 From: feiniaofeiafei Date: Mon, 15 Jun 2026 15:35:18 +0800 Subject: [PATCH 3/3] fix ut --- .../doris/nereids/rules/rewrite/SaltJoinTest.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/SaltJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/SaltJoinTest.java index 499f0a34d88c5f..50479433eed73d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/SaltJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/SaltJoinTest.java @@ -136,11 +136,14 @@ public void testRightJoin() { logicalGenerate( logicalUnion())), logicalOlapScan() - ).when(join -> join.getJoinType() == JoinType.RIGHT_OUTER_JOIN) + ).when(join -> join.getJoinType() == JoinType.RIGHT_OUTER_JOIN + && join.getJoinReorderContext().isSaltJoinGenerated()) ), logicalProject( logicalOlapScan()) - ).when(join -> join.getHashJoinConjuncts().size() == 2 && join.getJoinType() == JoinType.RIGHT_OUTER_JOIN) + ).when(join -> join.getHashJoinConjuncts().size() == 2 + && join.getJoinType() == JoinType.RIGHT_OUTER_JOIN + && !join.getJoinReorderContext().isSaltJoinGenerated()) ); } @@ -265,11 +268,14 @@ public void testLeading() { logicalGenerate( logicalUnion())), logicalOlapScan() - ).when(join -> join.getJoinType() == JoinType.RIGHT_OUTER_JOIN) + ).when(join -> join.getJoinType() == JoinType.RIGHT_OUTER_JOIN + && join.getJoinReorderContext().isSaltJoinGenerated()) ), logicalProject( logicalOlapScan()) - ).when(join -> join.getHashJoinConjuncts().size() == 2 && join.getJoinType() == JoinType.RIGHT_OUTER_JOIN) + ).when(join -> join.getHashJoinConjuncts().size() == 2 + && join.getJoinType() == JoinType.RIGHT_OUTER_JOIN + && !join.getJoinReorderContext().isSaltJoinGenerated()) ); }