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

Reply via email to