This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 56cdfda427c [fix](nestedtype) support change order in table for nested
type #39210 (#41642)
56cdfda427c is described below
commit 56cdfda427c773c39143fbf3b598ce5428a0a349
Author: amory <[email protected]>
AuthorDate: Mon Oct 14 08:26:56 2024 +0800
[fix](nestedtype) support change order in table for nested type #39210
(#41642)
---
.../main/java/org/apache/doris/catalog/Column.java | 5 ++
.../java/org/apache/doris/catalog/ColumnType.java | 6 +-
.../ddl/create_nestedtypes_with_schemachange.out | 46 +++++++++++++++
.../create_nestedtypes_with_schemachange.groovy | 65 ++++++++++++++++++++++
4 files changed, 119 insertions(+), 3 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java
index 527e22cbecd..cdeef303eba 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Column.java
@@ -592,6 +592,11 @@ public class Column implements Writable,
GsonPostProcessable {
throw new DdlException("Dest column name is empty");
}
+ // now nested type can only support change order
+ if (type.isComplexType() && !type.equals(other.type)) {
+ throw new DdlException("Can not change " + type + " to " + other);
+ }
+
if (!ColumnType.isSchemaChangeAllowed(type, other.type)) {
throw new DdlException("Can not change " + getDataType() + " to "
+ other.getDataType());
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java
b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java
index d4813dbc820..7f26daf86f8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColumnType.java
@@ -156,9 +156,9 @@ public abstract class ColumnType {
schemaChangeMatrix[PrimitiveType.DATETIMEV2.ordinal()][PrimitiveType.DATETIMEV2.ordinal()]
= true;
// Currently, we do not support schema change between complex types
with subtypes.
-
schemaChangeMatrix[PrimitiveType.ARRAY.ordinal()][PrimitiveType.ARRAY.ordinal()]
= false;
-
schemaChangeMatrix[PrimitiveType.STRUCT.ordinal()][PrimitiveType.STRUCT.ordinal()]
= false;
-
schemaChangeMatrix[PrimitiveType.MAP.ordinal()][PrimitiveType.MAP.ordinal()] =
false;
+
schemaChangeMatrix[PrimitiveType.ARRAY.ordinal()][PrimitiveType.ARRAY.ordinal()]
= true;
+
schemaChangeMatrix[PrimitiveType.STRUCT.ordinal()][PrimitiveType.STRUCT.ordinal()]
= true;
+
schemaChangeMatrix[PrimitiveType.MAP.ordinal()][PrimitiveType.MAP.ordinal()] =
true;
}
static boolean isSchemaChangeAllowed(Type lhs, Type rhs) {
diff --git
a/regression-test/data/datatype_p0/nested_types/ddl/create_nestedtypes_with_schemachange.out
b/regression-test/data/datatype_p0/nested_types/ddl/create_nestedtypes_with_schemachange.out
new file mode 100644
index 00000000000..af88eb6b9bb
--- /dev/null
+++
b/regression-test/data/datatype_p0/nested_types/ddl/create_nestedtypes_with_schemachange.out
@@ -0,0 +1,46 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !sql --
+col0 bigint No true \N
+col_array array<text> Yes false \N NONE
+col2 int No false \N NONE
+col3 array<int> Yes false \N NONE
+col4 map<int,int> Yes false \N NONE
+col5 struct<f1:int> Yes false \N NONE
+
+-- !sql --
+col0 bigint No true \N
+col_map map<char(32),text> Yes false \N NONE
+col2 int No false \N NONE
+col3 array<int> Yes false \N NONE
+col4 map<int,int> Yes false \N NONE
+col5 struct<f1:int> Yes false \N NONE
+
+-- !sql --
+col0 bigint No true \N
+col_struct struct<f1:varchar(1)> Yes false \N NONE
+col2 int No false \N NONE
+col3 array<int> Yes false \N NONE
+col4 map<int,int> Yes false \N NONE
+col5 struct<f1:int> Yes false \N NONE
+
+-- !sql --
+col0 bigint No true \N
+col2 int No false \N NONE
+col3 array<int> Yes false \N NONE
+col4 map<int,int> Yes false \N NONE
+col5 struct<f1:int> Yes false \N NONE
+
+-- !sql --
+col0 bigint No true \N
+col2 int No false \N NONE
+col3 array<int> Yes false \N NONE
+col4 map<int,int> Yes false \N NONE
+col5 struct<f1:int> Yes false \N NONE
+
+-- !sql --
+col0 bigint No true \N
+col2 int No false \N NONE
+col3 array<int> Yes false \N NONE
+col4 map<int,int> Yes false \N NONE
+col5 struct<f1:int> Yes false \N NONE
+
diff --git
a/regression-test/suites/datatype_p0/nested_types/ddl/create_nestedtypes_with_schemachange.groovy
b/regression-test/suites/datatype_p0/nested_types/ddl/create_nestedtypes_with_schemachange.groovy
new file mode 100644
index 00000000000..ec0f163821d
--- /dev/null
+++
b/regression-test/suites/datatype_p0/nested_types/ddl/create_nestedtypes_with_schemachange.groovy
@@ -0,0 +1,65 @@
+// 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("create_nestedtypes_with_schemachange", "p0") {
+
+ def create_nested_table_and_schema_change = {testTablex, nested_type,
column_name, error ->
+ // create basic type
+ sql "DROP TABLE IF EXISTS $testTablex"
+ sql """ CREATE TABLE $testTablex (
+ col0 BIGINT NOT NULL, col2 int NOT NULL, col3 array<int>
NULL, col4 map<int, int> NULL, col5 struct<f1: int> NULL
+ )
+ /* mow */
+ UNIQUE KEY(col0) DISTRIBUTED BY HASH(col0) BUCKETS 4
PROPERTIES (
+ "enable_unique_key_merge_on_write" = "true",
+ "replication_num" = "1"
+ ); """
+ // alter table add nested type
+ if (error != '') {
+ // check nested type do not support other type
+ test {
+ sql "ALTER TABLE $testTablex MODIFY COLUMN $column_name
$nested_type AFTER col0"
+ exception (error)
+ }
+ } else {
+ // check nested type can only support change order
+ sql "ALTER TABLE $testTablex ADD COLUMN $column_name $nested_type"
+ sql "ALTER TABLE $testTablex MODIFY COLUMN $column_name
$nested_type AFTER col0"
+ waitForSchemaChangeDone {
+ sql """ SHOW ALTER TABLE COLUMN WHERE IndexName='$testTablex'
ORDER BY createtime DESC LIMIT 1 """
+ time 600
+ }
+ }
+ // desc table
+ qt_sql "DESC $testTablex"
+ }
+
+ // array
+ create_nested_table_and_schema_change.call("test_array_schemachange",
"ARRAY<STRING>", "col_array", '')
+ // map
+ create_nested_table_and_schema_change.call("test_map_schemachange",
"MAP<char(32), string>", "col_map", '')
+ // struct
+ create_nested_table_and_schema_change.call("test_struct_schemachange",
"STRUCT<f1: varchar(1)>", "col_struct", '')
+
+ // array with other type
+ create_nested_table_and_schema_change.call("test_array_schemachange_1",
"ARRAY<STRING>", "col3", "errCode = 2");
+ // map with other type
+ create_nested_table_and_schema_change.call("test_map_schemachange_1",
"MAP<char(32), string>", "col4", "errCode = 2");
+ // struct with other type
+ create_nested_table_and_schema_change.call("test_struct_schemachange_1",
"STRUCT<f1: varchar(1)>", "col5", "errCode = 2");
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]