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..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 @@ -1478,16 +1478,13 @@ 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) { // 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 07276608815e1..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 @@ -227,6 +227,37 @@ 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)"); + + 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); + }); + Assert.assertTrue(exception.getMessage(), exception.getMessage().contains("Column v4 is ambiguous")); + } + private void testSqlRewrite(String sql, String expected) { testSqlRewrite(sql, expected, true); }