From f322ad277d5db92ec7bf49d19298c0659c4dc4c4 Mon Sep 17 00:00:00 2001 From: starocean999 <40539150+starocean999@users.noreply.github.com> Date: Thu, 26 Oct 2023 11:03:41 +0800 Subject: [PATCH] [fix](nereids) PushdownAliasThroughJoin may lost required columns from parent node (#25835) --- .../rules/rewrite/PushdownAliasThroughJoin.java | 9 ++++++--- .../rules/rewrite/PushdownAliasThroughJoinTest.java | 10 +++++----- 2 files changed, 11 insertions(+), 8 deletions(-) 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")