diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ColumnPruningPostProcessor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ColumnPruningPostProcessor.java index ff362b7bc9..e8c3cf4a6a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ColumnPruningPostProcessor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/post/ColumnPruningPostProcessor.java @@ -40,9 +40,16 @@ import java.util.stream.Collectors; }) public class ColumnPruningPostProcessor extends PlanPostProcessor { @Override - public PhysicalProject visitPhysicalProject(PhysicalProject project, CascadesContext ctx) { + public Plan visitPhysicalProject(PhysicalProject project, CascadesContext ctx) { Plan child = project.child(); Plan newChild = child.accept(this, ctx); + if (project.isAllSlots()) { + Set projects = project.getProjects().stream().map(Slot.class::cast).collect(Collectors.toSet()); + Set outputSet = newChild.getOutputSet(); + if (outputSet.equals(projects)) { + return ((AbstractPhysicalPlan) newChild).copyStatsAndGroupIdFrom(project); + } + } if (newChild instanceof AbstractPhysicalJoin) { AbstractPhysicalJoin join = (AbstractPhysicalJoin) newChild; Plan left = join.left(); @@ -91,7 +98,7 @@ public class ColumnPruningPostProcessor extends PlanPostProcessor { } if (newLeft != left || newRight != right) { - return (PhysicalProject) project.withChildren(join.withChildren(newLeft, newRight)); + return project.withChildren(join.withChildren(newLeft, newRight)); } else { return project; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Project.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Project.java index 7fa62f7628..15b095bee3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Project.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/algebra/Project.java @@ -117,4 +117,14 @@ public interface Project { return expr; }); } + + /** isAllSlots */ + default boolean isAllSlots() { + for (NamedExpression project : getProjects()) { + if (!project.isSlot()) { + return false; + } + } + return true; + } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java index de23bc6f5b..24d938636a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalProject.java @@ -114,16 +114,6 @@ public class LogicalProject extends LogicalUnary computeOutput() { Builder slots = ImmutableList.builderWithExpectedSize(projects.size());