diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckAfterRewrite.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckAfterRewrite.java index d923444e84ff89..b91ee63f031867 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckAfterRewrite.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/CheckAfterRewrite.java @@ -94,6 +94,18 @@ private void checkUnexpectedExpression(Plan plan) { } } + /** + * + * used for test + * after applying a rule, use this method to check whether all slots are from children + */ + public void checkTreeAllSlotReferenceFromChildren(Plan plan) { + checkAllSlotReferenceFromChildren(plan); + for (Plan child : plan.children()) { + checkTreeAllSlotReferenceFromChildren(child); + } + } + private void checkAllSlotReferenceFromChildren(Plan plan) { Set inputSlots = plan.getInputSlots(); RoaringBitmap childrenOutput = plan.getChildrenOutputExprIdBitSet(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOnAssertNumRows.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOnAssertNumRows.java index 3300bce5447e7a..ef696d1f3bca63 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOnAssertNumRows.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOnAssertNumRows.java @@ -216,8 +216,21 @@ private Plan pushDownAssertNumRowsJoin(LogicalJoin topJoin) { @VisibleForTesting LogicalProject projectAliasOnPlan(List projections, Plan child) { - List newProjections = Lists.newArrayList(child.getOutput()); - newProjections.addAll(projections); - return new LogicalProject<>(newProjections, child); + if (child instanceof LogicalProject) { + LogicalProject project = (LogicalProject) child; + List newProjections = + Lists.newArrayList(project.getProjects()); + for (Alias alias : projections) { + if (!project.getOutput().contains(alias.toSlot())) { + NamedExpression expr = (NamedExpression) project.pushDownExpressionPastProject(alias); + newProjections.add(expr); + } + } + return project.withProjects(newProjections); + } else { + List newProjections = Lists.newArrayList(child.getOutput()); + newProjections.addAll(projections); + return new LogicalProject<>(newProjections, child); + } } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOnAssertNumRowsTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOnAssertNumRowsTest.java index a38d38b833f543..aded31bd18fcbf 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOnAssertNumRowsTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushDownJoinOnAssertNumRowsTest.java @@ -470,7 +470,6 @@ void testProjectAliasOnPlan() { Assertions.assertTrue(newPlan instanceof LogicalProject && newPlan.getOutput().size() == 2 && ((LogicalProject) newPlan).getOutputs().get(0).equals(slot) - && ((LogicalProject) newPlan).getOutputs().get(1).equals(alias) - && newPlan.child(0) instanceof LogicalProject); + && ((LogicalProject) newPlan).getOutputs().get(1).equals(alias)); } }