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