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

morrySnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new a57a2b36afe [fix](join) Restrict auto salt join rewrite (#64518)
a57a2b36afe is described below

commit a57a2b36afe2cf555981f52af1f624897e01f741
Author: feiniaofeiafei <[email protected]>
AuthorDate: Tue Jun 16 15:21:00 2026 +0800

    [fix](join) Restrict auto salt join rewrite (#64518)
    
    ### What problem does this PR solve?
    
    Related PR: #59591 #54207
    
    Problem Summary:
    
    This PR restricts the auto salt join rewrite in two cases.
    
    First, ASOF joins are excluded from automatic salt join optimization
    because the current rewrite may introduce large build-side expansion and
    is not cost guarded for ASOF semantics.
    
    Second, SaltJoin now marks internally generated helper joins with
    `isSaltJoinGenerated` in `JoinReorderContext`. `SkewJoin` skips these
    generated joins to avoid applying salt rewrite recursively on SaltJoin's
    own expansion plan.
---
 .../nereids/rules/exploration/join/JoinReorderContext.java | 11 +++++++++++
 .../org/apache/doris/nereids/rules/rewrite/SaltJoin.java   |  1 +
 .../org/apache/doris/nereids/rules/rewrite/SkewJoin.java   |  8 ++++----
 .../apache/doris/nereids/rules/rewrite/SaltJoinTest.java   | 14 ++++++++++----
 4 files changed, 26 insertions(+), 8 deletions(-)

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 376e75a7aa5..716df428b14 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 class JoinReorderContext {
         this.hasRightAssociate = joinReorderContext.hasRightAssociate;
         this.hasCommuteZigZag = joinReorderContext.hasCommuteZigZag;
         this.isLeadingJoin = joinReorderContext.isLeadingJoin;
+        this.isSaltJoinGenerated = joinReorderContext.isSaltJoinGenerated;
     }
 
     /**
@@ -68,6 +70,7 @@ public class JoinReorderContext {
         hasRightAssociate = false;
         hasLeftAssociate = false;
         isLeadingJoin = false;
+        isSaltJoinGenerated = false;
     }
 
     public boolean hasCommute() {
@@ -125,4 +128,12 @@ public class JoinReorderContext {
     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 bccaac9fb11..698114ba146 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 @@ public class SaltJoin extends OneRewriteRuleFactory {
         equalTo = (EqualPredicate) 
TypeCoercionUtils.processComparisonPredicate(equalTo);
         JoinReorderContext joinReorderContext = new JoinReorderContext();
         joinReorderContext.setLeadingJoin(true);
+        joinReorderContext.setSaltJoinGenerated(true);
         LogicalJoin<Plan, Plan> 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 29121236e83..5db8f4217f5 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,8 +54,9 @@ 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)
                 .thenApply(SkewJoin::transform).toRule(RuleType.SALT_JOIN);
     }
@@ -86,8 +87,7 @@ public class SkewJoin extends OneRewriteRuleFactory {
             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);
@@ -98,7 +98,7 @@ public class SkewJoin extends OneRewriteRuleFactory {
                     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);
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 499f0a34d88..50479433eed 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 class SaltJoinTest extends TestWithFeService 
implements MemoPatternMatchS
                                                         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 class SaltJoinTest extends TestWithFeService 
implements MemoPatternMatchS
                                                         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())
                 );
     }
 


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

Reply via email to