This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.1 by this push:
new a4490bbd622 branch-4.1:[fix](join) Restrict auto salt join rewrite
#64518 (#65059)
a4490bbd622 is described below
commit a4490bbd622ab82bc7c73ff0cf7c785193ac0fe2
Author: feiniaofeiafei <[email protected]>
AuthorDate: Wed Jul 1 16:11:51 2026 +0800
branch-4.1:[fix](join) Restrict auto salt join rewrite #64518 (#65059)
picked from #64518
---
.../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 60c6c3ee756..37cd93a4fe5 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
@@ -50,8 +50,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);
}
@@ -81,15 +82,14 @@ public class SkewJoin extends OneRewriteRuleFactory {
if (join.left().getOutputSet().contains(equal.right())) {
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
&&
left.getStats().findColumnStatistics(leftEqHand).getHotValues() != null) {
skewExpr = leftEqHand;
hotValues.addAll(left.getStats().findColumnStatistics(leftEqHand).getHotValues().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
&&
right.getStats().findColumnStatistics(rightEqHand).getHotValues() != null) {
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]