This is an automated email from the ASF dual-hosted git repository.
liulijia pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 3b9330eb150 [fix](optimizer) Avoid Duplicate key exception when pull
up predicates from child in aggretation (#38862)
3b9330eb150 is described below
commit 3b9330eb150e6d3fd05672d6c37a9c8e2976efe8
Author: Lijia Liu <[email protected]>
AuthorDate: Wed Aug 7 09:10:50 2024 +0800
[fix](optimizer) Avoid Duplicate key exception when pull up predicates from
child in aggretation (#38862)
## Proposed changes
The agg expressions can not appears in child predicates.
Issue Number: close #38905
---------
Co-authored-by: liutang123 <[email protected]>
---
.../nereids/rules/rewrite/PullUpPredicates.java | 18 +--------
.../nereids/rules/rewrite/InferPredicatesTest.java | 45 ++++++++++++++++++++++
2 files changed, 46 insertions(+), 17 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
index 26e1358c2e5..96425add56b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PullUpPredicates.java
@@ -17,10 +17,7 @@
package org.apache.doris.nereids.rules.rewrite;
-import org.apache.doris.nereids.trees.expressions.Alias;
import org.apache.doris.nereids.trees.expressions.Expression;
-import org.apache.doris.nereids.trees.expressions.NamedExpression;
-import org.apache.doris.nereids.trees.expressions.Slot;
import
org.apache.doris.nereids.trees.expressions.functions.agg.AggregateFunction;
import org.apache.doris.nereids.trees.plans.Plan;
import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
@@ -99,20 +96,7 @@ public class PullUpPredicates extends
PlanVisitor<ImmutableSet<Expression>, Void
return cacheOrElse(aggregate, () -> {
ImmutableSet<Expression> childPredicates =
aggregate.child().accept(this, context);
// TODO
- Map<Expression, Slot> expressionSlotMap =
aggregate.getOutputExpressions()
- .stream()
- .filter(this::hasAgg)
- .collect(Collectors.toMap(
- namedExpr -> {
- if (namedExpr instanceof Alias) {
- return ((Alias) namedExpr).child();
- } else {
- return namedExpr;
- }
- }, NamedExpression::toSlot)
- );
- Expression expression =
ExpressionUtils.replace(ExpressionUtils.and(Lists.newArrayList(childPredicates)),
- expressionSlotMap);
+ Expression expression =
ExpressionUtils.and(Lists.newArrayList(childPredicates));
List<Expression> predicates =
ExpressionUtils.extractConjunction(expression);
return getAvailableExpressions(predicates, aggregate);
});
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferPredicatesTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferPredicatesTest.java
index 243466b13c0..e12cec94495 100644
---
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferPredicatesTest.java
+++
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/InferPredicatesTest.java
@@ -72,6 +72,13 @@ class InferPredicatesTest extends TestWithFeService
implements MemoPatternMatchS
+ "distributed by hash(k2) buckets 1\n"
+ "properties('replication_num' = '1');");
+ createTables("CREATE TABLE `test`.`test_tt` (\n"
+ + "`key` varchar(*) NOT NULL,\n"
+ + " `value` varchar(*) NULL\n"
+ + ") ENGINE=OLAP\n"
+ + "DISTRIBUTED BY HASH(`key`) BUCKETS 1\n"
+ + "PROPERTIES ('replication_allocation' =
'tag.location.default: 1');");
+
connectContext.setDatabase("default_cluster:test");
}
@@ -627,4 +634,42 @@ class InferPredicatesTest extends TestWithFeService
implements MemoPatternMatchS
).when(join -> join.getJoinType() ==
JoinType.LEFT_OUTER_JOIN)
);
}
+
+ @Test
+ void testAggMultiAliasWithSameChild() {
+ String sql = "SELECT t.*\n"
+ + "FROM (\n"
+ + " SELECT `key`, a , b \n"
+ + " FROM (\n"
+ + " SELECT `key`,\n"
+ + " any_value(value) AS a,\n"
+ + " any_value(CAST(value AS double)) AS
b\n"
+ + " FROM (\n"
+ + " SELECT `key`, CAST(value AS double)
AS value\n"
+ + " FROM test_tt\n"
+ + " WHERE `key` = '1'\n"
+ + " ) agg\n"
+ + " GROUP BY `key`\n"
+ + " ) proj\n"
+ + ") t\n"
+ + "LEFT JOIN\n"
+ + "( SELECT id, name FROM student) t2\n"
+ + "ON t.`key`=t2.`name`";
+ PlanChecker.from(connectContext).analyze(sql).rewrite().printlnTree();
+ PlanChecker.from(connectContext)
+ .analyze(sql)
+ .rewrite()
+ .matches(
+ logicalJoin(
+ any(),
+ logicalProject(
+ logicalFilter(
+ logicalOlapScan()
+ ).when(filter ->
filter.getConjuncts().size() == 1
+ &&
filter.getPredicate().toSql().contains("name = '1'"))
+ )
+ ).when(join -> join.getJoinType() ==
JoinType.LEFT_OUTER_JOIN)
+ );
+
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]