This is an automated email from the ASF dual-hosted git repository.
dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new c3fc9eab5ae branch-3.0: [opt](nereids)prune unused column after push
down common column from agg #46627 (#47029)
c3fc9eab5ae is described below
commit c3fc9eab5ae215b3601799de5d178df5cbc191ce
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Feb 25 19:01:58 2025 +0800
branch-3.0: [opt](nereids)prune unused column after push down common column
from agg #46627 (#47029)
Cherry-picked from #46627
Co-authored-by: minghong <[email protected]>
---
.../glue/translator/PhysicalPlanTranslator.java | 8 +++++-
.../post/ProjectAggregateExpressionsForCse.java | 33 +++++++++++++++++++++-
2 files changed, 39 insertions(+), 2 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 7336d244957..9237e7104c8 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -964,7 +964,13 @@ public class PhysicalPlanTranslator extends
DefaultPlanVisitor<PlanFragment, Pla
// 1. generate slot reference for each group expression
List<SlotReference> groupSlots =
collectGroupBySlots(groupByExpressions, outputExpressions);
ArrayList<Expr> execGroupingExpressions = groupByExpressions.stream()
- .map(e -> ExpressionTranslator.translate(e, context))
+ .map(e -> {
+ Expr result = ExpressionTranslator.translate(e, context);
+ if (result == null) {
+ throw new RuntimeException("translate " + e + "
failed");
+ }
+ return result;
+ })
.collect(Collectors.toCollection(ArrayList::new));
// 2. collect agg expressions and generate agg function to slot
reference map
List<Slot> aggFunctionOutput = Lists.newArrayList();
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ProjectAggregateExpressionsForCse.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ProjectAggregateExpressionsForCse.java
index a8038ab30b0..d7a13148c10 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ProjectAggregateExpressionsForCse.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ProjectAggregateExpressionsForCse.java
@@ -46,6 +46,7 @@ import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
+import java.util.stream.Collectors;
/**
* create project under aggregate to enable CSE
@@ -102,8 +103,38 @@ public class ProjectAggregateExpressionsForCse extends
PlanPostProcessor {
}
if (aggregate.child() instanceof PhysicalProject) {
+ List<NamedExpression> newProjections = Lists.newArrayList();
+ // do column prune
+ // case 1:
+ // original plan
+ // agg(groupKey[C+1, abs(C+1)]
+ // -->project(A+B as C)
+ //
+ // "A+B as C" should be reserved
+ // new plan
+ // agg(groupKey=[D, abs(D)])
+ // -->project(A+B as C, C+1 as D)
+ // case 2:
+ // original plan
+ // agg(groupKey[A+1, abs(A+1)], output[sum(B)])
+ // --> project(A, B)
+ // "A+1" is extracted, we have
+ // plan1:
+ // agg(groupKey[X, abs(X)], output[sum(B)])
+ // --> project(A, B, A+1 as X)
+ // then column prune(A should be pruned, because it is not used
directly by AGG)
+ // we have plan2:
+ // agg(groupKey[X, abs(X)], output[sum(B)])
+ // -->project(B, A+1 as X)
PhysicalProject<? extends Plan> project = (PhysicalProject<?
extends Plan>) aggregate.child();
- List<NamedExpression> newProjections =
Lists.newArrayList(project.getProjects());
+ Set<Slot> newInputSlots = aggOutputReplaced.stream()
+ .flatMap(expr -> expr.getInputSlots().stream())
+ .collect(Collectors.toSet());
+ for (NamedExpression expr : project.getProjects()) {
+ if (!(expr instanceof SlotReference) ||
newInputSlots.contains(expr)) {
+ newProjections.add(expr);
+ }
+ }
newProjections.addAll(cseCandidates.values());
project = project.withProjectionsAndChild(newProjections, (Plan)
project.child());
aggregate = (PhysicalHashAggregate<? extends Plan>) aggregate
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]