diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoin.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoin.java index 7839fcfe95..abe707b260 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoin.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoin.java @@ -37,6 +37,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Pushdown Alias (inside must be Slot) through Join. @@ -112,9 +113,11 @@ public class PushdownAliasThroughJoin extends OneRewriteRuleFactory { } private List createNewOutput(List oldOutput, - Map> aliasMap) { - List output = oldOutput.stream() - .flatMap(slot -> aliasMap.getOrDefault(slot, Collections.singletonList(slot)).stream()) + Map> aliasMap) { + // we should keep all original outputs and add new alias in the output list + // because the upper node may require both col#1 and col#1 as colAlias#2 + List output = Stream.concat(oldOutput.stream(), oldOutput.stream() + .flatMap(slot -> aliasMap.getOrDefault(slot, Collections.emptyList()).stream())) .collect(Collectors.toList()); return output; } diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoinTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoinTest.java index 5a98b07bcf..543ff0933b 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoinTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/rewrite/PushdownAliasThroughJoinTest.java @@ -53,8 +53,8 @@ class PushdownAliasThroughJoinTest implements MemoPatternMatchSupported { .matches( logicalProject( logicalJoin( - logicalProject().when(project -> project.getProjects().get(1).toSql().equals("name AS `1name`")), - logicalProject().when(project -> project.getProjects().get(1).toSql().equals("name AS `2name`")) + logicalProject().when(project -> project.getProjects().get(1).toSql().equals("name") && project.getProjects().get(2).toSql().equals("name AS `1name`")), + logicalProject().when(project -> project.getProjects().get(1).toSql().equals("name") && project.getProjects().get(2).toSql().equals("name AS `2name`")) ) ).when(project -> project.getProjects().get(0).toSql().equals("1name") && project.getProjects().get(1).toSql().equals("2name")) ); @@ -74,10 +74,10 @@ class PushdownAliasThroughJoinTest implements MemoPatternMatchSupported { logicalProject( logicalJoin( logicalProject().when( - project -> project.getProjects().get(0).toSql().equals("id AS `1id`") - && project.getProjects().get(1).toSql().equals("name AS `1name`")), + project -> project.getProjects().get(2).toSql().equals("id AS `1id`") + && project.getProjects().get(3).toSql().equals("name AS `1name`")), logicalProject().when( - project -> project.getProjects().get(1).toSql().equals("name AS `2name`")) + project -> project.getProjects().get(2).toSql().equals("name AS `2name`")) ).when(join -> join.getHashJoinConjuncts().get(0).toSql().equals("(1id = id)")) ).when(project -> project.getProjects().get(0).toSql().equals("1id") && project.getProjects().get(1).toSql().equals("1name")