This is an automated email from the ASF dual-hosted git repository.

morningman 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 bc878c81b1 [hotfix](dev-1.0.1) Fix Runtime Filter support equivalent 
slot of outer join (#10669)
bc878c81b1 is described below

commit bc878c81b11e0e4fa6c65c46320dd74679557e6b
Author: Kidd <107781942+k-i-...@users.noreply.github.com>
AuthorDate: Fri Jul 8 10:21:26 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
---
 .../org/apache/doris/analysis/ExprSubstitutionMap.java   | 16 ++++++++++++++--
 .../main/java/org/apache/doris/planner/HashJoinNode.java |  5 ++++-
 2 files changed, 18 insertions(+), 3 deletions(-)

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 d352d7608a..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
@@ -171,9 +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));
-                analyzer.putEquivalentSlot(((SlotRef) 
Objects.requireNonNull(f.get(g.lhs_.get(i)))).getSlotId(), ((SlotRef) 
g.lhs_.get(i)).getSlotId());
+                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;
@@ -184,7 +189,7 @@ public final class ExprSubstitutionMap {
      * f [A.id, B.id] [A.name, B.name] g [A.id, C.id] [A.age, C.age]
      * return: [A.id, C,id] [A.name, B.name] [A.age, C.age]
      */
-    public static ExprSubstitutionMap combineAndReplace(ExprSubstitutionMap f, 
ExprSubstitutionMap g) {
+    public static ExprSubstitutionMap composeAndReplace(ExprSubstitutionMap f, 
ExprSubstitutionMap g) {
         if (f == null && g == null) {
             return new ExprSubstitutionMap();
         }
@@ -196,6 +201,13 @@ public final class ExprSubstitutionMap {
         }
         ExprSubstitutionMap result = new ExprSubstitutionMap();
         result = ExprSubstitutionMap.combine(result, g);
+        for (int i = 0; i < g.size(); i++) {
+            // case a->b, b->c => a->c
+            if (f.mappingForRhsExpr(g.getLhs().get(i)) != null) {
+                result.getLhs().set(i, f.mappingForRhsExpr(g.getLhs().get(i)));
+            }
+        }
+        // add remaining f
         for (int i = 0; i < f.size(); i++) {
             if (!result.containsMappingFor(f.lhs_.get(i))) {
                 result.put(f.lhs_.get(i), f.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 6deb20d619..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
@@ -441,7 +441,7 @@ public class HashJoinNode extends PlanNode {
             }
         }
         // 4. change the outputSmap
-        outputSmap = ExprSubstitutionMap.combineAndReplace(outputSmap, 
srcTblRefToOutputTupleSmap);
+        outputSmap = ExprSubstitutionMap.composeAndReplace(outputSmap, 
srcTblRefToOutputTupleSmap);
     }
 
     private void replaceOutputSmapForOuterJoin() {
@@ -989,6 +989,9 @@ public class HashJoinNode extends PlanNode {
 
     @Override
     public ArrayList<TupleId> getOutputTblRefIds() {
+        if (vOutputTupleDesc != null) {
+            return Lists.newArrayList(vOutputTupleDesc.getId());
+        }
         switch (joinOp) {
             case LEFT_SEMI_JOIN:
             case LEFT_ANTI_JOIN:


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to