This is an automated email from the ASF dual-hosted git repository. morningman pushed a commit to branch dev-1.0.1-v20220707 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 300f5cdbeba0258e103f45172f87c3a047c324f7 Author: Kidd <107781942+k-i-...@users.noreply.github.com> AuthorDate: Thu Jul 7 11:19:51 2022 +0800 [hotfix](dev-1.0.1) Fix Runtime Filter support equivalent slot of outer join (#10669) This bug may cause some runtime filter not generated --- .../src/main/java/org/apache/doris/analysis/Analyzer.java | 15 ++++++++++++++- .../org/apache/doris/analysis/ExprSubstitutionMap.java | 9 ++++++++- .../main/java/org/apache/doris/planner/HashJoinNode.java | 2 +- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java index 26bf81e5b2..74b8b674e1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -181,6 +181,12 @@ public class Analyzer { public String getTimezone() { return timezone; } + public void putEquivalentSlot(SlotId src_sid, SlotId target_sid) { globalState.equivalentSlots.put(src_sid, target_sid); } + + public SlotId getEquivalentSlot(SlotId src_sid) { return globalState.equivalentSlots.get(src_sid); } + + public boolean containEquivalentSlot(SlotId src_sid) { return globalState.equivalentSlots.containsKey(src_sid); } + public void putAssignedRuntimeFilter(RuntimeFilter rf) { assignedRuntimeFilters.add(rf); } public List<RuntimeFilter> getAssignedRuntimeFilter() { return assignedRuntimeFilters; } @@ -313,6 +319,8 @@ public class Analyzer { private final long autoBroadcastJoinThreshold; + private final Map<SlotId, SlotId> equivalentSlots = Maps.newHashMap(); + public GlobalState(Catalog catalog, ConnectContext context) { this.catalog = catalog; this.context = context; @@ -2141,7 +2149,7 @@ public class Analyzer { * TODO(zxy) Use value-transfer graph to check */ public boolean hasValueTransfer(SlotId a, SlotId b) { - return a.equals(b); + return getValueTransferTargets(a).contains(b); } /** @@ -2153,6 +2161,11 @@ public class Analyzer { public List<SlotId> getValueTransferTargets(SlotId srcSid) { List<SlotId> result = new ArrayList<>(); result.add(srcSid); + SlotId equalSlot = srcSid; + while(containEquivalentSlot(equalSlot)) { + result.add(getEquivalentSlot(equalSlot)); + equalSlot = getEquivalentSlot(equalSlot); + } return result; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java index aee8142908..e0df525ce5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExprSubstitutionMap.java @@ -18,6 +18,7 @@ package org.apache.doris.analysis; import java.util.List; +import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -156,7 +157,7 @@ public final class ExprSubstitutionMap { * f [A.id, B.id] g [A.id, C.id] * return: g-f [B,id, C,id] */ - public static ExprSubstitutionMap subtraction(ExprSubstitutionMap f, ExprSubstitutionMap g) { + public static ExprSubstitutionMap subtraction(ExprSubstitutionMap f, ExprSubstitutionMap g, Analyzer analyzer) { if (f == null && g == null) { return new ExprSubstitutionMap(); } @@ -170,8 +171,14 @@ public final class ExprSubstitutionMap { for (int i = 0; i < g.size(); i++) { if (f.containsMappingFor(g.lhs_.get(i))) { result.put(f.get(g.lhs_.get(i)), g.rhs_.get(i)); + if (f.get(g.lhs_.get(i)) instanceof SlotRef && g.rhs_.get(i) instanceof SlotRef) { + analyzer.putEquivalentSlot(((SlotRef) g.rhs_.get(i)).getSlotId(), ((SlotRef) Objects.requireNonNull(f.get(g.lhs_.get(i)))).getSlotId()); + } } else { result.put(g.lhs_.get(i), g.rhs_.get(i)); + if (g.lhs_.get(i) instanceof SlotRef && g.rhs_.get(i) instanceof SlotRef) { + analyzer.putEquivalentSlot(((SlotRef) g.rhs_.get(i)).getSlotId(), ((SlotRef) g.lhs_.get(i)).getSlotId()); + } } } return result; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java index 9c1436af90..16e82b644f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java @@ -398,7 +398,7 @@ public class HashJoinNode extends PlanNode { } } // 2. compute srcToOutputMap - vSrcToOutputSMap = ExprSubstitutionMap.subtraction(outputSmap, srcTblRefToOutputTupleSmap); + vSrcToOutputSMap = ExprSubstitutionMap.subtraction(outputSmap, srcTblRefToOutputTupleSmap, analyzer); for (int i = 0; i < vSrcToOutputSMap.size(); i++) { Preconditions.checkState(vSrcToOutputSMap.getRhs().get(i) instanceof SlotRef); SlotRef rSlotRef = (SlotRef) vSrcToOutputSMap.getRhs().get(i); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org