This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch dev-1.0.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/dev-1.0.1 by this push:
new 8c5e2b7328 fix_runtime_filter_outer_join (#10654)
8c5e2b7328 is described below
commit 8c5e2b73288c991205d33de4a4aabc6dd5b68362
Author: Kidd <[email protected]>
AuthorDate: Thu Jul 7 11:19:51 2022 +0800
fix_runtime_filter_outer_join (#10654)
---
.../src/main/java/org/apache/doris/analysis/Analyzer.java | 15 ++++++++++++++-
.../org/apache/doris/analysis/ExprSubstitutionMap.java | 4 +++-
.../main/java/org/apache/doris/planner/HashJoinNode.java | 2 +-
3 files changed, 18 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 062eef4df8..d352d7608a 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,6 +171,7 @@ 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));
+ analyzer.putEquivalentSlot(((SlotRef)
Objects.requireNonNull(f.get(g.lhs_.get(i)))).getSlotId(), ((SlotRef)
g.lhs_.get(i)).getSlotId());
} else {
result.put(g.lhs_.get(i), g.rhs_.get(i));
}
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 25df202fde..6deb20d619 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: [email protected]
For additional commands, e-mail: [email protected]