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 <zhoumingh...@selectdb.com> --- .../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: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org