You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by sh...@apache.org on 2024/01/19 03:16:33 UTC
(flink) branch master updated: [FLINK-33928][table-planner] Should not throw exception while creating view with specify field names (#24096)
This is an automated email from the ASF dual-hosted git repository.
shengkai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/master by this push:
new 82fcdfe5634 [FLINK-33928][table-planner] Should not throw exception while creating view with specify field names (#24096)
82fcdfe5634 is described below
commit 82fcdfe5634fb82d3ab4a183818d852119dc68a9
Author: yunhong <33...@qq.com>
AuthorDate: Fri Jan 19 11:16:25 2024 +0800
[FLINK-33928][table-planner] Should not throw exception while creating view with specify field names (#24096)
Co-authored-by: zhengyunhong.zyh <zh...@alibaba-inc.com>
---
.../operations/converters/SqlNodeConvertUtils.java | 23 ++++++++++++++++------
.../operations/SqlDdlToOperationConverterTest.java | 13 ++++++++++++
2 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlNodeConvertUtils.java b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlNodeConvertUtils.java
index 43e3937392e..991bbf744b5 100644
--- a/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlNodeConvertUtils.java
+++ b/flink-table/flink-table-planner/src/main/java/org/apache/flink/table/planner/operations/converters/SqlNodeConvertUtils.java
@@ -81,7 +81,7 @@ class SqlNodeConvertUtils {
// index to identify the duplicate names.
SqlValidatorNamespace validatedNamespace =
context.getSqlValidator().getNamespace(validateQuery);
- validateDuplicatedColumnNames(query, validatedNamespace);
+ validateDuplicatedColumnNames(query, viewFields, validatedNamespace);
// The LATERAL operator was eliminated during sql validation, thus the unparsed SQL
// does not contain LATERAL which is problematic,
@@ -142,12 +142,23 @@ class SqlNodeConvertUtils {
}
private static void validateDuplicatedColumnNames(
- SqlNode query, SqlValidatorNamespace namespace) {
+ SqlNode query, List<SqlNode> viewFields, SqlValidatorNamespace namespace) {
+
+ // If view fields is not empty, means the view column list is specified by user use syntax
+ // 'CREATE VIEW viewName(x,x,x) AS SELECT x,x,x FROM table'. For this syntax, we need
+ // validate whether the column name in the view column list is unique.
+ List<String> columnNameList;
+ if (!viewFields.isEmpty()) {
+ columnNameList =
+ viewFields.stream().map(SqlNode::toString).collect(Collectors.toList());
+ } else {
+ Objects.requireNonNull(namespace);
+ columnNameList = namespace.getType().getFieldNames();
+ }
+
Map<String, Integer> nameToPos = new HashMap<>();
- for (int i = 0;
- i < Objects.requireNonNull(namespace).getType().getFieldList().size();
- i++) {
- String columnName = namespace.getType().getFieldList().get(i).getName();
+ for (int i = 0; i < columnNameList.size(); i++) {
+ String columnName = columnNameList.get(i);
if (nameToPos.containsKey(columnName)) {
SqlSelect select = extractSelect(query);
// Can not get the origin schema.
diff --git a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlDdlToOperationConverterTest.java b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlDdlToOperationConverterTest.java
index 1de2d72583a..c88140e5780 100644
--- a/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlDdlToOperationConverterTest.java
+++ b/flink-table/flink-table-planner/src/test/java/org/apache/flink/table/planner/operations/SqlDdlToOperationConverterTest.java
@@ -2229,6 +2229,19 @@ public class SqlDdlToOperationConverterTest extends SqlNodeToOperationConversion
catalogManager.createTable(
catalogTable, ObjectIdentifier.of("builtin", "default", "id_table"), false);
+ Operation operation =
+ parse("CREATE VIEW id_view(a, b) AS SELECT id, uid AS id FROM id_table");
+ assertThat(operation).isInstanceOf(CreateViewOperation.class);
+
+ assertThatThrownBy(
+ () ->
+ parse(
+ "CREATE VIEW id_view(a, a) AS SELECT id, uid AS id FROM id_table"))
+ .satisfies(
+ FlinkAssertions.anyCauseMatches(
+ SqlValidateException.class,
+ "A column with the same name `a` has been defined at line 1, column 37."));
+
assertThatThrownBy(
() -> parse("CREATE VIEW id_view AS\nSELECT id, uid AS id FROM id_table"))
.satisfies(