You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by kx...@apache.org on 2023/06/06 15:15:18 UTC
[doris] 16/36: [Fix](Nereids) Fix duplicated name in view does not throw exception (#20374)
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0-beta
in repository https://gitbox.apache.org/repos/asf/doris.git
commit e64ab13b45b102b87f7e4fb68b792f181ef6e4ab
Author: LiBinfeng <46...@users.noreply.github.com>
AuthorDate: Mon Jun 5 16:10:54 2023 +0800
[Fix](Nereids) Fix duplicated name in view does not throw exception (#20374)
When using nereids, if we have duplicated name in output of view, we need to throw an exception. A check rule was added in bindExpression rule set
---
.../nereids/rules/analysis/BindExpression.java | 20 +++++++
.../trees/plans/ExplainInsertCommandTest.java | 6 --
.../subquery/test_duplicate_name_in_view.groovy | 69 ++++++++++++++++++++++
3 files changed, 89 insertions(+), 6 deletions(-)
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 f1bd3802c7..286dbebfc1 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
@@ -67,6 +67,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
import org.apache.doris.nereids.trees.plans.logical.LogicalRepeat;
import org.apache.doris.nereids.trees.plans.logical.LogicalSetOperation;
import org.apache.doris.nereids.trees.plans.logical.LogicalSort;
+import org.apache.doris.nereids.trees.plans.logical.LogicalSubQueryAlias;
import org.apache.doris.nereids.trees.plans.logical.LogicalTVFRelation;
import org.apache.doris.nereids.trees.plans.logical.UsingJoin;
import org.apache.doris.nereids.util.TypeCoercionUtils;
@@ -538,6 +539,13 @@ public class BindExpression implements AnalysisRuleFactory {
UnboundTVFRelation relation = ctx.root;
return bindTableValuedFunction(relation, ctx.statementContext);
})
+ ),
+ RuleType.BINDING_SUBQUERY_ALIAS_SLOT.build(
+ logicalSubQueryAlias().thenApply(ctx -> {
+ LogicalSubQueryAlias<Plan> subQueryAlias = ctx.root;
+ checkSameNameSlot(subQueryAlias.child(0).getOutput(), subQueryAlias.getAlias());
+ return subQueryAlias;
+ })
)
).stream().map(ruleCondition).collect(ImmutableList.toImmutableList());
}
@@ -677,6 +685,18 @@ public class BindExpression implements AnalysisRuleFactory {
return new LogicalTVFRelation(unboundTVFRelation.getId(), (TableValuedFunction) function);
}
+ private void checkSameNameSlot(List<Slot> childOutputs, String subQueryAlias) {
+ Set<String> nameSlots = new HashSet<>();
+ for (Slot s : childOutputs) {
+ if (nameSlots.contains(s.getName())) {
+ throw new AnalysisException("Duplicated inline view column alias: '" + s.getName()
+ + "'" + " in inline view: '" + subQueryAlias + "'");
+ } else {
+ nameSlots.add(s.getName());
+ }
+ }
+ }
+
private BoundFunction bindTableGeneratingFunction(UnboundFunction unboundFunction,
CascadesContext cascadesContext) {
List<Expression> boundArguments = unboundFunction.getArguments().stream()
diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/ExplainInsertCommandTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/ExplainInsertCommandTest.java
index 7eda6fae58..d82dd209b4 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/ExplainInsertCommandTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/plans/ExplainInsertCommandTest.java
@@ -104,12 +104,6 @@ public class ExplainInsertCommandTest extends TestWithFeService {
}
- @Test
- public void testInsertIntoDuplicateKeyTableWithCast() throws Exception {
- String sql = "explain insert into t1 select * from (select cast(k1 as varchar), 1, 1, 1 from src) t";
- Assertions.assertEquals(4, getOutputFragment(sql).getOutputExprs().size());
- }
-
@Test
public void testInsertIntoSomeColumns() throws Exception {
String sql = "explain insert into t1 (v1, v2) select v1 + 1, v2 + 4 from src";
diff --git a/regression-test/suites/nereids_p0/subquery/test_duplicate_name_in_view.groovy b/regression-test/suites/nereids_p0/subquery/test_duplicate_name_in_view.groovy
new file mode 100644
index 0000000000..fd5f093a3e
--- /dev/null
+++ b/regression-test/suites/nereids_p0/subquery/test_duplicate_name_in_view.groovy
@@ -0,0 +1,69 @@
+// 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.
+
+suite("inlineview_with_project") {
+ sql "SET enable_nereids_planner=true"
+ sql "SET enable_fallback_to_original_planner=false"
+ sql """
+ drop table if exists issue_19611_t0;
+ """
+
+ sql """
+ drop table if exists issue_19611_t1;
+ """
+
+ sql """
+ create table issue_19611_t0 (c0 int)
+ ENGINE=OLAP
+ DISTRIBUTED BY HASH(c0) BUCKETS 5
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "in_memory" = "false",
+ "storage_format" = "V2"
+ );
+ """
+
+ sql """
+ create table issue_19611_t1 (c0 int)
+ ENGINE=OLAP
+ DISTRIBUTED BY HASH(c0) BUCKETS 5
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "in_memory" = "false",
+ "storage_format" = "V2"
+ );
+ """
+
+ test {
+ sql """
+ select * from (
+ select * from issue_19611_t0, issue_19611_t1 where issue_19611_t1.c0 != 0
+ union select * from issue_19611_t0, issue_19611_t1 where issue_19611_t1.c0 = 0) tmp;
+ """
+ exception "errCode = 2, detailMessage = Unexpected exception: Duplicated inline view column alias: 'c0' in inline view: 'tmp'"
+
+ }
+
+
+ sql """
+ drop table if exists issue_19611_t0;
+ """
+
+ sql """
+ drop table if exists issue_19611_t1;
+ """
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org