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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]