This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new fb7d0301d55 [fix](nereids) Fix not check when duplicated column names
are in cte select list (#42400)
fb7d0301d55 is described below
commit fb7d0301d554f18221df2b0943a984e48b606135
Author: seawinde <[email protected]>
AuthorDate: Thu Oct 31 17:17:24 2024 +0800
[fix](nereids) Fix not check when duplicated column names are in cte
select list (#42400)
This is brought by #21727
If you run query as following:
Should throw analyze exception,
because the duplicated column name in `tmp1` but now not.
this pr fix this
with tmp1 as (
select unique_id, unique_id from test_table
)
select * from tmp1;
---
.../doris/nereids/rules/analysis/AnalyzeCTE.java | 2 +
.../nereids/rules/analysis/BindExpression.java | 6 +-
.../cte/test_cte_with_duplicate_consumer.groovy | 14 ++-
.../query_p0/cte/query_with_dup_column.groovy | 112 +++++++++++++++++++++
4 files changed, 131 insertions(+), 3 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AnalyzeCTE.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AnalyzeCTE.java
index 129b0860a74..36a0459375b 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AnalyzeCTE.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/AnalyzeCTE.java
@@ -101,6 +101,8 @@ public class AnalyzeCTE extends OneAnalysisRuleFactory {
CTEId cteId = StatementScopeIdGenerator.newCTEId();
LogicalSubQueryAlias<Plan> logicalSubQueryAlias =
aliasQuery.withChildren(ImmutableList.of(analyzedCtePlan));
+
BindExpression.checkSameNameSlot(logicalSubQueryAlias.child(0).getOutput(),
+ logicalSubQueryAlias.getAlias());
outerCteCtx = new CTEContext(cteId, logicalSubQueryAlias,
outerCteCtx);
outerCteCtx.setAnalyzedPlan(logicalSubQueryAlias);
cteProducerPlans.add(new LogicalCTEProducer<>(cteId,
logicalSubQueryAlias));
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
index 9cdda51e476..cde659b9102 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindExpression.java
@@ -1142,7 +1142,11 @@ public class BindExpression implements
AnalysisRuleFactory {
return new LogicalTVFRelation(unboundTVFRelation.getRelationId(),
(TableValuedFunction) bindResult.first);
}
- private void checkSameNameSlot(List<Slot> childOutputs, String
subQueryAlias) {
+ /**
+ * Check the slot in childOutputs is duplicated or not
+ * If childOutputs has duplicated column name, would throw analysis
exception
+ */
+ public static void checkSameNameSlot(List<Slot> childOutputs, String
subQueryAlias) {
Set<String> nameSlots = new HashSet<>(childOutputs.size() * 2);
for (Slot s : childOutputs) {
if (!nameSlots.add(s.getInternalName())) {
diff --git
a/regression-test/suites/nereids_p0/cte/test_cte_with_duplicate_consumer.groovy
b/regression-test/suites/nereids_p0/cte/test_cte_with_duplicate_consumer.groovy
index 4064efcfc6e..b5cb03ea174 100644
---
a/regression-test/suites/nereids_p0/cte/test_cte_with_duplicate_consumer.groovy
+++
b/regression-test/suites/nereids_p0/cte/test_cte_with_duplicate_consumer.groovy
@@ -14,12 +14,22 @@
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
+import org.junit.Assert;
suite("test_cte_with_duplicate_consumer") {
- test {
+ try {
sql """
WITH cte1(col1) AS (SELECT 1), cte2(col2_1, col2_2) AS (SELECT
col1, col1 FROM cte1) SELECT * FROM cte2
"""
+ } catch (Exception e) {
+ // Duplicated inline view column alias: 'col1' in inline view: 'cte2''
+ assertTrue(e.message.contains(" Duplicated inline view column alias"))
+ }
+
+ test {
+ sql """
+ WITH cte1(col1) AS (SELECT 1), cte2(col2_1) AS (SELECT col1 FROM
cte1) SELECT * FROM cte2
+ """
- result([[1, 1]])
+ result([[1]])
}
}
diff --git a/regression-test/suites/query_p0/cte/query_with_dup_column.groovy
b/regression-test/suites/query_p0/cte/query_with_dup_column.groovy
new file mode 100644
index 00000000000..be88cb44bab
--- /dev/null
+++ b/regression-test/suites/query_p0/cte/query_with_dup_column.groovy
@@ -0,0 +1,112 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.junit.Assert;
+
+suite("query_with_dup_column") {
+ String db = context.config.getDbNameByFile(context.file)
+ sql "use ${db}"
+ sql "set runtime_filter_mode=OFF";
+ sql "SET ignore_shape_nodes='PhysicalDistribute,PhysicalProject'"
+
+ sql """
+ drop table if exists test_table;
+ """
+
+ sql """
+ CREATE TABLE `test_table` (
+ `unique_id` varchar(256) NULL,
+ `name` varchar(256) NULL
+ )
+ PROPERTIES (
+ "replication_num" = "1"
+ );
+ """
+
+ sql """
+ insert into test_table values ("yyyxxxzzz", "abc000000")
+ """
+
+ // should fail
+ try {
+ sql """
+ with tmp1 as (
+ select unique_id, unique_id from test_table
+ )
+ select * from tmp1;
+ """
+ } catch (Exception e) {
+ assertTrue(e.message.contains("Duplicated inline view column alias"))
+ }
+
+ // should fail
+ try {
+ sql """
+ with tmp1 as (
+ select unique_id, unique_id from test_table
+ )
+ select * from tmp1 t;
+ """
+ } catch (Exception e) {
+ assertTrue(e.message.contains("Duplicated inline view column alias"))
+ }
+
+
+ try {
+ sql """
+ with tmp1 as (
+ select *, unique_id from test_table
+ )
+ select * from tmp1;
+ """
+ } catch (Exception e) {
+ assertTrue(e.message.contains("Duplicated inline view column alias"))
+ }
+
+ // should fail
+ try {
+ sql """
+ with tmp1 as (
+ select *, unique_id from test_table
+ )
+ select * from tmp1 t;
+ """
+ } catch (Exception e) {
+ assertTrue(e.message.contains("Duplicated inline view column alias"))
+ }
+
+ // should success
+ sql """
+ select *, unique_id from test_table;
+ """
+
+ // should success
+ sql """
+ select *, unique_id from test_table t;
+ """
+
+ // should success
+ sql """
+ select unique_id, unique_id from test_table
+ """
+
+ // should success
+ sql """
+ select unique_id, unique_id from test_table t
+ """
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]