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]