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 <13843187+qz...@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-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to