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

Reply via email to