You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/12/26 02:57:20 UTC

[doris] branch master updated: [Fix](Nerids) fix dup key for pull predicate from project children (#15292)

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

morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 7b5739e9a9 [Fix](Nerids) fix dup key for pull predicate from project children (#15292)
7b5739e9a9 is described below

commit 7b5739e9a937b868f2eb51946e15b700dae91ed3
Author: shee <13...@users.noreply.github.com>
AuthorDate: Mon Dec 26 10:57:14 2022 +0800

    [Fix](Nerids) fix dup key for pull predicate from project children (#15292)
    
    In InferPredicates, we need pull predicates from project children then use sid replace id1.
    In our code, use alias name as key, use expression as value to build map. Obviously, sid has two alias name(id1,id2) so throw Duplicate key exception.
---
 .../rules/rewrite/logical/PullUpPredicates.java    | 18 ++++++++--------
 .../rules/rewrite/logical/InferPredicatesTest.java | 25 ++++++++++++++++++++++
 2 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpPredicates.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpPredicates.java
index ea4333c4d6..065cb85362 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpPredicates.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/logical/PullUpPredicates.java
@@ -38,7 +38,6 @@ import java.util.Collection;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -108,14 +107,15 @@ public class PullUpPredicates extends PlanVisitor<ImmutableSet<Expression>, Void
     public ImmutableSet<Expression> visitLogicalProject(LogicalProject<? extends Plan> project, Void context) {
         return cacheOrElse(project, () -> {
             ImmutableSet<Expression> childPredicates = project.child().accept(this, context);
-            Map<Expression, Slot> expressionSlotMap = project.getAliasToProducer()
-                    .entrySet()
-                    .stream()
-                    .collect(Collectors.toMap(Entry::getValue, Entry::getKey));
-            Expression expression = ExpressionUtils.replace(ExpressionUtils.and(Lists.newArrayList(childPredicates)),
-                    expressionSlotMap);
-            List<Expression> predicates = ExpressionUtils.extractConjunction(expression);
-            return getAvailableExpressions(predicates, project);
+
+            Set<Expression> allPredicates = Sets.newHashSet(childPredicates);
+            project.getAliasToProducer().forEach((k, v) -> {
+                Set<Expression> expressions = childPredicates.stream()
+                        .map(e -> e.rewriteDownShortCircuit(c -> c.equals(v) ? k : c)).collect(Collectors.toSet());
+                allPredicates.addAll(expressions);
+            });
+
+            return getAvailableExpressions(allPredicates, project);
         });
     }
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/InferPredicatesTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/InferPredicatesTest.java
index 84b3dcbf3f..4a973539e4 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/InferPredicatesTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/logical/InferPredicatesTest.java
@@ -533,4 +533,29 @@ public class InferPredicatesTest extends TestWithFeService implements PatternMat
                     )
                 );
     }
+
+    /**
+     * test for #15310
+     */
+    @Test
+    public void inferPredicatesTest22() {
+        String sql = "select * from student join (select sid as id1, sid as id2, grade from score) s on student.id = s.id1 where s.id1 > 1";
+        PlanChecker.from(connectContext).analyze(sql).rewrite().printlnTree();
+        PlanChecker.from(connectContext)
+                .analyze(sql)
+                .rewrite()
+                .matchesFromRoot(
+                        logicalJoin(
+                            logicalFilter(
+                                    logicalOlapScan()
+                            ).when(filter -> filter.getPredicates().toSql().contains("id > 1")),
+                            logicalProject(
+                                    logicalFilter(
+                                            logicalOlapScan()
+                                    ).when(filter -> filter.getPredicates().toSql().contains("sid > 1"))
+                            )
+                        )
+                );
+    }
 }
+


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