This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new e7a1cf7c351 branch-3.1: [fix](variant) Prohibit older versions of 
variant from using the schema templates feature (#55093)
e7a1cf7c351 is described below

commit e7a1cf7c351edb0d471fbfa9bd39245428680194
Author: Sun Chenyang <[email protected]>
AuthorDate: Fri Aug 22 10:43:43 2025 +0800

    branch-3.1: [fix](variant) Prohibit older versions of variant from using 
the schema templates feature (#55093)
    
    ### What problem does this PR solve?
    In the master branch, we removed the write code for the old version of
    variant。
    In the branch-3.1, we prohibited the old version of variant from using
    the new schema templates feature.
---
 .../java/org/apache/doris/analysis/TypeDef.java    |  5 +++++
 .../doris/nereids/parser/LogicalPlanBuilder.java   |  5 +++++
 .../suites/variant_p0/delete_update.groovy         |  5 +++--
 .../variant_p0/predefine/delete_update.groovy      |  2 +-
 .../variant_p0/predefine/element_function.groovy   |  5 +++--
 .../variant_p0/predefine/test_predefine_ddl.groovy | 24 ++++++++++++++++++++++
 regression-test/suites/variant_p0/tpch/load.groovy |  4 ++--
 .../suites/variant_p0/with_index/var_index.groovy  |  4 +++-
 8 files changed, 46 insertions(+), 8 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java
index 0fe0e0d38ca..60af594b386 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TypeDef.java
@@ -360,6 +360,11 @@ public class TypeDef implements ParseNode {
                             + 
PropertyAnalyzer.PROPERTIES_VARIANT_ENABLE_TYPED_PATHS_TO_SPARSE
                             + " and " + 
PropertyAnalyzer.PROPERTIES_VARIANT_MAX_SUBCOLUMNS_COUNT);
                 }
+
+                if (variantMaxSubcolumnsCount == 0 && 
!variantType.getPredefinedFields().isEmpty()) {
+                    throw new AnalysisException("variant_max_subcolumns_count 
must be greater than 0 "
+                            + "when variant has fields, but got " + 
variantMaxSubcolumnsCount);
+                }
                 break;
             }
             case INVALID_TYPE:
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 8347c1f5368..6c9b5ba2504 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -3610,6 +3610,11 @@ public class LogicalPlanBuilder extends 
DorisParserBaseVisitor<Object> {
                     + " and " + 
PropertyAnalyzer.PROPERTIES_VARIANT_MAX_SUBCOLUMNS_COUNT);
         }
 
+        if (variantMaxSubcolumnsCount == 0 && !fields.isEmpty()) {
+            throw new NotSupportedException("variant_max_subcolumns_count must 
be greater than 0 "
+                    + "when variant has fields, but got " + 
variantMaxSubcolumnsCount);
+        }
+
         return new VariantType(fields, variantMaxSubcolumnsCount, 
enableTypedPathsToSparse);
     }
 
diff --git a/regression-test/suites/variant_p0/delete_update.groovy 
b/regression-test/suites/variant_p0/delete_update.groovy
index 3f6841ccfe1..504f6b654cf 100644
--- a/regression-test/suites/variant_p0/delete_update.groovy
+++ b/regression-test/suites/variant_p0/delete_update.groovy
@@ -22,10 +22,11 @@ suite("regression_test_variant_delete_and_update", 
"variant_type"){
     def table_name = "var_delete_update"
     sql "DROP TABLE IF EXISTS ${table_name}"
     sql """ set enable_variant_flatten_nested = true """
+    def max_subcolumns_count = new Random().nextInt(10) + 1
     sql """
         CREATE TABLE IF NOT EXISTS ${table_name} (
             k bigint,
-            v variant<'a' : int, 'b' : array<int>, 'c' : double>
+            v variant<'a' : int, 'b' : array<int>, 'c' : double, 
properties("variant_max_subcolumns_count" = "${max_subcolumns_count}")>
         )
         UNIQUE KEY(`k`)
         DISTRIBUTED BY HASH(k) BUCKETS 3
@@ -51,7 +52,7 @@ suite("regression_test_variant_delete_and_update", 
"variant_type"){
     sql """
         CREATE TABLE IF NOT EXISTS ${table_name} (
             k bigint,
-            v  variant<'a' : int, 'b' : array<int>, 'c' : double>,
+            v  variant<'a' : int, 'b' : array<int>, 'c' : double, 
properties("variant_max_subcolumns_count" = "${max_subcolumns_count}")>,
             vs string 
         )
         UNIQUE KEY(`k`)
diff --git a/regression-test/suites/variant_p0/predefine/delete_update.groovy 
b/regression-test/suites/variant_p0/predefine/delete_update.groovy
index bd1c917862b..1eb13321cd5 100644
--- a/regression-test/suites/variant_p0/predefine/delete_update.groovy
+++ b/regression-test/suites/variant_p0/predefine/delete_update.groovy
@@ -111,7 +111,7 @@ 
suite("regression_test_variant_predefine_delete_and_update", "variant_type"){
                 `score` int(11) NOT NULL COMMENT "用户得分",
                 `test` int(11) NULL COMMENT "null test",
                 `dft` int(11) DEFAULT "4321",
-                `var` variant<'id' : int, 'name' : string, 'score' : int, 
'test' : int, 'dft' : int> NULL)
+                `var` variant<'id' : int, 'name' : string, 'score' : int, 
'test' : int, 'dft' : int, properties("variant_max_subcolumns_count" = 
"${max_subcolumns_count}")> NULL)
                 UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 1
                 PROPERTIES("replication_num" = "1", 
"enable_unique_key_merge_on_write" = "true", "disable_auto_compaction" = 
"true", "store_row_column" = "true")
     """
diff --git 
a/regression-test/suites/variant_p0/predefine/element_function.groovy 
b/regression-test/suites/variant_p0/predefine/element_function.groovy
index e7dbdfc9b13..a5d1ec2139c 100644
--- a/regression-test/suites/variant_p0/predefine/element_function.groovy
+++ b/regression-test/suites/variant_p0/predefine/element_function.groovy
@@ -17,11 +17,12 @@
 
 suite("regression_test_variant_predefine_element_at", "p0")  {
     sql """ DROP TABLE IF EXISTS element_fn_test """
+    def max_subcolumns_count = new Random().nextInt(10) + 1
     sql """
         CREATE TABLE IF NOT EXISTS element_fn_test(
             k bigint,
-            v variant<'arr1' : array<int>, 'arr2' : array<int>>,
-            v1 variant<'arr1' : array<int>, 'arr2' : array<int>> not null,
+            v variant<'arr1' : array<int>, 'arr2' : array<int>, 
properties("variant_max_subcolumns_count" = "${max_subcolumns_count}")>,
+            v1 variant<'arr1' : array<int>, 'arr2' : array<int>, 
properties("variant_max_subcolumns_count" = "${max_subcolumns_count}")> not 
null,
         )
         UNIQUE KEY(`k`)
         DISTRIBUTED BY HASH(k) BUCKETS 4
diff --git 
a/regression-test/suites/variant_p0/predefine/test_predefine_ddl.groovy 
b/regression-test/suites/variant_p0/predefine/test_predefine_ddl.groovy
index a88091dff70..02a29acae9f 100644
--- a/regression-test/suites/variant_p0/predefine/test_predefine_ddl.groovy
+++ b/regression-test/suites/variant_p0/predefine/test_predefine_ddl.groovy
@@ -367,4 +367,28 @@ suite("test_predefine_ddl", "p0"){
 
     sql "create index idx_ab4 on test_ddl_table (var2) using inverted 
properties(\"parser\"=\"unicode\")"
     wait_for_latest_op_on_table_finish("test_ddl_table", timeout)
+
+
+    sql "DROP TABLE IF EXISTS test_ddl_table"
+    test {
+        sql """CREATE TABLE test_ddl_table (
+            `id` bigint NULL,
+            `var` variant<'a' : int, 'b' : array<int>, 'c' : double, 
properties("variant_max_subcolumns_count" = "0")> NULL,
+            INDEX idx_ab (var) USING INVERTED PROPERTIES("parser"="unicode", 
"support_phrase" = "true") COMMENT ''
+        ) ENGINE=OLAP DUPLICATE KEY(`id`) DISTRIBUTED BY HASH(`id`)
+        BUCKETS 1 PROPERTIES ( "replication_allocation" = 
"tag.location.default: 1")"""
+        exception("variant_max_subcolumns_count must be greater than 0 when 
variant has fields, but got 0")
+    }
+
+    sql """ CREATE TABLE test_ddl_table (
+        `id` bigint NULL,
+        `var` variant<properties("variant_max_subcolumns_count" = "0")> NULL,
+        INDEX idx_ab (var) USING INVERTED PROPERTIES("parser"="unicode", 
"support_phrase" = "true") COMMENT ''
+    ) ENGINE=OLAP DUPLICATE KEY(`id`) DISTRIBUTED BY HASH(`id`)
+    BUCKETS 1 PROPERTIES ( "replication_allocation" = "tag.location.default: 
1")"""
+
+    test {
+        sql """ alter table test_ddl_table add column var2 variant<'a' : int, 
'b' : array<int>, 'c' : double, properties("variant_max_subcolumns_count" = 
"0")> NULL """
+        exception("variant_max_subcolumns_count must be greater than 0 when 
variant has fields, but got 0")
+    }
 }
\ No newline at end of file
diff --git a/regression-test/suites/variant_p0/tpch/load.groovy 
b/regression-test/suites/variant_p0/tpch/load.groovy
index b85ad0da5a8..9629f95c967 100644
--- a/regression-test/suites/variant_p0/tpch/load.groovy
+++ b/regression-test/suites/variant_p0/tpch/load.groovy
@@ -37,9 +37,9 @@ suite("load") {
 
     tables.forEach { tableName ->
         sql "DROP TABLE IF EXISTS ${tableName}"
-        int max_subcolumns_count = Math.floor(Math.random() * 7) 
+        int max_subcolumns_count = Math.floor(Math.random() * 7)
         def var_def = "variant"
-        if (max_subcolumns_count % 2 == 0) {
+        if (max_subcolumns_count % 2 == 0 && max_subcolumns_count > 0) {
             var_def = "variant<'O_CLERK' : string, 'C_COMMENT' : string, 
'L_RETURNFLAG' : string, 'S_COMMENT' : string, 'S_ACCTBAL' : double, 
properties(\"variant_max_subcolumns_count\" = \"${max_subcolumns_count}\", 
\"variant_enable_typed_paths_to_sparse\" = \"false\")>"
         }
         sql """
diff --git a/regression-test/suites/variant_p0/with_index/var_index.groovy 
b/regression-test/suites/variant_p0/with_index/var_index.groovy
index 6758314ba59..4bac3f6ac1c 100644
--- a/regression-test/suites/variant_p0/with_index/var_index.groovy
+++ b/regression-test/suites/variant_p0/with_index/var_index.groovy
@@ -18,11 +18,13 @@
 suite("regression_test_variant_var_index", "p0, nonConcurrent"){
     def table_name = "var_index"
     sql """ set default_variant_enable_typed_paths_to_sparse = false """
+
+    def max_subcolumns_count = new Random().nextInt(10) + 1
     sql "DROP TABLE IF EXISTS var_index"
     sql """
         CREATE TABLE IF NOT EXISTS var_index (
             k bigint,
-            v variant<'timestamp' : double, 'a' : int, 'b' : string, 'c' : 
int>,
+            v variant<'timestamp' : double, 'a' : int, 'b' : string, 'c' : 
int, properties("variant_max_subcolumns_count" = "${max_subcolumns_count}")>,
             INDEX idx_var(v) USING INVERTED  PROPERTIES("parser" = "english") 
COMMENT ''
         )
         DUPLICATE KEY(`k`)


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to