From 5df2c7fb39b9b1e1887fac5558dfb66ccb9d4a3a Mon Sep 17 00:00:00 2001 From: packy92 Date: Mon, 2 Sep 2024 18:57:26 +0800 Subject: [PATCH 1/2] [BugFix] fix wrong plan when duplicate alias is same as column name Signed-off-by: packy92 --- .../starrocks/sql/analyzer/QueryAnalyzer.java | 6 +----- .../sql/plan/SelectUsingAliasTest.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java b/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java index fdaba853272ad..7da1c5d29db5d 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java @@ -1478,11 +1478,7 @@ public Expr visitSelect(SelectRelation selectRelation, Void context) { if (item.getAlias() == null) { continue; } - // Ignore c1 as c1 - if (item.getExpr() instanceof SlotRef && - alias.equalsIgnoreCase(((SlotRef) item.getExpr()).getColumnName())) { - continue; - } + // Alias is case-insensitive Expr lastAssociatedExpr = aliases.putIfAbsent(alias.toLowerCase(), item.getExpr()); if (lastAssociatedExpr != null) { diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/plan/SelectUsingAliasTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/plan/SelectUsingAliasTest.java index 07276608815e1..9ffcf3cb657d3 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/plan/SelectUsingAliasTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/plan/SelectUsingAliasTest.java @@ -227,6 +227,24 @@ public void testAmbiguous() { "FROM test.t0"); } + @Test + public void testAliasSameAsColumnName() throws Exception { + // test duplicate alias is same as column name + String sql = "select v1 v1, v2 + 1 v1, abs(v1) from t0"; + String plan = getFragmentPlan(sql); + assertContains(plan, "1:Project\n" + + " | : 1: v1\n" + + " | : 2: v2 + 1\n" + + " | : abs(1: v1)"); + + Exception exception = Assert.assertThrows(SemanticException.class, () -> { + // test duplicate alias is different from column name + String duplicateAlias = "select v1 v4, v2 + 1 v4, abs(v4) from t0"; + getFragmentPlan(duplicateAlias); + }); + Assert.assertTrue(exception.getMessage(), exception.getMessage().contains("Column v4 is ambiguous")); + } + private void testSqlRewrite(String sql, String expected) { testSqlRewrite(sql, expected, true); } From 6d5a07a67f59471bc5d81e9fcc28c57f2557bfac Mon Sep 17 00:00:00 2001 From: packy92 Date: Mon, 2 Sep 2024 19:14:31 +0800 Subject: [PATCH 2/2] [BugFix] fix wrong plan when duplicate alias is same as column name Signed-off-by: packy92 --- .../com/starrocks/sql/analyzer/QueryAnalyzer.java | 3 ++- .../starrocks/sql/plan/SelectUsingAliasTest.java | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java b/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java index 7da1c5d29db5d..91ffbbc996656 100644 --- a/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java +++ b/fe/fe-core/src/main/java/com/starrocks/sql/analyzer/QueryAnalyzer.java @@ -1483,7 +1483,8 @@ public Expr visitSelect(SelectRelation selectRelation, Void context) { Expr lastAssociatedExpr = aliases.putIfAbsent(alias.toLowerCase(), item.getExpr()); if (lastAssociatedExpr != null) { // Duplicate alias is allowed, eg: select a.v1 as v, a.v2 as v from t0 a, - // But it should not be ambiguous, eg: select a.v1 as v, a.v2 as v from t0 a order by v + // But it should be ambiguous when the alias is used in the order by expr, + // eg: select a.v1 as v, a.v2 as v from t0 a order by v aliasesMaybeAmbiguous.add(alias.toLowerCase()); } } diff --git a/fe/fe-core/src/test/java/com/starrocks/sql/plan/SelectUsingAliasTest.java b/fe/fe-core/src/test/java/com/starrocks/sql/plan/SelectUsingAliasTest.java index 9ffcf3cb657d3..324b3f9c8fae8 100644 --- a/fe/fe-core/src/test/java/com/starrocks/sql/plan/SelectUsingAliasTest.java +++ b/fe/fe-core/src/test/java/com/starrocks/sql/plan/SelectUsingAliasTest.java @@ -237,7 +237,20 @@ public void testAliasSameAsColumnName() throws Exception { " | : 2: v2 + 1\n" + " | : abs(1: v1)"); + sql = "select v1 v1, v1 v1, abs(v1) from t0"; + plan = getFragmentPlan(sql); + assertContains(plan, "1:Project\n" + + " | : 1: v1\n" + + " | : abs(1: v1)"); + Exception exception = Assert.assertThrows(SemanticException.class, () -> { + // test duplicate alias is different from column name + String duplicateAlias = "select v1 v1, v2 v1, abs(v1) from t0 order by v1"; + getFragmentPlan(duplicateAlias); + }); + Assert.assertTrue(exception.getMessage(), exception.getMessage().contains("Column 'v1' is ambiguous.")); + + exception = Assert.assertThrows(SemanticException.class, () -> { // test duplicate alias is different from column name String duplicateAlias = "select v1 v4, v2 + 1 v4, abs(v4) from t0"; getFragmentPlan(duplicateAlias);