fix
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownProject.java index 8b1fbaa..e20a51d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownProject.java
@@ -47,6 +47,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Optional; import java.util.Set; import java.util.function.Function; @@ -179,20 +180,30 @@ LogicalProject<C> project = ctx.root; C child = project.child(); - PushdownProjectHelper pushdownProjectHelper - = new PushdownProjectHelper(ctx.statementContext, child); - Pair<Boolean, List<NamedExpression>> pushProjects - = pushdownProjectHelper.pushDownExpressions(project.getProjects()); + Optional<Pair<List<Expression>, Map<Integer, List<NamedExpression>>>> pushedResult + = pushDownProjectInExpressions(child, (Collection) project.getProjects(), ctx.statementContext); - if (pushProjects.first) { - List<Plan> newJoinChildren = pushdownProjectHelper.buildNewChildren(); - return new LogicalProject<>( - pushProjects.second, - child.withChildren(newJoinChildren) - ); + if (!pushedResult.isPresent()) { + return project; } - return project; + + List<NamedExpression> remainProjects = (List) pushedResult.get().first; + Map<Integer, List<NamedExpression>> childToPushedExpressions = pushedResult.get().second; + + List<Plan> childNewChildren = new ArrayList<>(child.children()); + for (Entry<Integer, List<NamedExpression>> kv : childToPushedExpressions.entrySet()) { + Integer childIndex = kv.getKey(); + List<NamedExpression> pushedExpression = kv.getValue(); + Plan childOfChild = child.child(childIndex); + List<NamedExpression> newProject = ImmutableList.<NamedExpression>builder() + .addAll(childOfChild.getOutput()) + .addAll(pushedExpression) + .build(); + childNewChildren.set(childIndex, new LogicalProject<>(newProject, childOfChild)); + } + + return project.withProjectsAndChild(remainProjects, child.withChildren(childNewChildren)); } private Plan pushThroughUnion(MatchingContext<LogicalProject<LogicalUnion>> ctx) {