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

lijibing 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 e7e2b5bdc31 [fix](cast)Allow cast array, struct and map type to 
stringlike type. (#57326)
e7e2b5bdc31 is described below

commit e7e2b5bdc3150b41779a23c6d67f4506083add82
Author: James <[email protected]>
AuthorDate: Sun Oct 26 19:17:46 2025 +0800

    [fix](cast)Allow cast array, struct and map type to stringlike type. 
(#57326)
    
    Allow cast array, struct and map type to stringlike type.
---
 .../nereids/rules/expression/check/CheckCast.java  | 29 -------------
 .../rules/expression/check/CheckCastTest.java      | 48 +++++++++++-----------
 .../basic-elements/data-types/array-md.groovy      |  8 ++--
 .../basic-elements/data-types/map-md.groovy        |  8 ++--
 .../basic-elements/data-types/struct-md.groovy     |  8 ++--
 .../test_cast_array_functions_by_literal.groovy    | 36 ++++++++--------
 .../cast_function/test_cast_struct.groovy          |  8 ++--
 7 files changed, 58 insertions(+), 87 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java
index 73ea7d93fdd..a6713aed15c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/check/CheckCast.java
@@ -401,37 +401,8 @@ public class CheckCast implements 
ExpressionPatternRuleFactory {
         } else if (originalType.isComplexType() && targetType.isJsonType()) {
             return !checkTypeContainsType(originalType, MapType.class);
         } else {
-            return checkPrimitiveType(originalType, targetType);
-        }
-    }
-
-    /**
-     * forbid this original and target type
-     *   1. original type is object type
-     *   2. target type is object type
-     *   3. original type is same with target type
-     *   4. target type is null type
-     */
-    private static boolean checkPrimitiveType(DataType originalType, DataType 
targetType) {
-        if (originalType.isJsonType() || targetType.isJsonType()) {
             return true;
         }
-        if (!originalType.isPrimitive() || !targetType.isPrimitive()) {
-            return false;
-        }
-        if (originalType.equals(targetType)) {
-            return false;
-        }
-        if (originalType.isNullType()) {
-            return true;
-        }
-        if (originalType.isObjectType() || targetType.isObjectType()) {
-            return false;
-        }
-        if (targetType.isNullType()) {
-            return false;
-        }
-        return true;
     }
 
     /**
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/check/CheckCastTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/check/CheckCastTest.java
index 080119d3297..7a6cd31fa23 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/check/CheckCastTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/rules/expression/check/CheckCastTest.java
@@ -1613,11 +1613,11 @@ public class CheckCastTest {
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
TimeV2Type.MAX, true));
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
IPv4Type.INSTANCE, true));
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
IPv6Type.INSTANCE, true));
-        Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, true));
-        Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, true));
-        Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
StringType.INSTANCE, true));
+        Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, true));
+        Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, true));
+        Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
StringType.INSTANCE, true));
         Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
JsonType.INSTANCE, true));
-        Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, false));
+        Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, true));
         Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
ArrayType.SYSTEM_DEFAULT, true));
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
MapType.SYSTEM_DEFAULT, true));
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
StructType.SYSTEM_DEFAULT, true));
@@ -1645,11 +1645,11 @@ public class CheckCastTest {
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
TimeV2Type.MAX, false));
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
IPv4Type.INSTANCE, false));
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
IPv6Type.INSTANCE, false));
-        Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, false));
-        Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, false));
-        Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
StringType.INSTANCE, false));
+        Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, false));
+        Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, false));
+        Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
StringType.INSTANCE, false));
         Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
JsonType.INSTANCE, false));
-        Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, false));
+        Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, false));
         Assertions.assertTrue(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
ArrayType.SYSTEM_DEFAULT, false));
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
MapType.SYSTEM_DEFAULT, false));
         Assertions.assertFalse(CheckCast.check(ArrayType.SYSTEM_DEFAULT, 
StructType.SYSTEM_DEFAULT, false));
@@ -1679,11 +1679,11 @@ public class CheckCastTest {
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
TimeV2Type.MAX, true));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
IPv4Type.INSTANCE, true));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
IPv6Type.INSTANCE, true));
-        Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, true));
-        Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, true));
-        Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
StringType.INSTANCE, true));
+        Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, true));
+        Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, true));
+        Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
StringType.INSTANCE, true));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
JsonType.INSTANCE, true));
-        Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, false));
+        Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, true));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
ArrayType.SYSTEM_DEFAULT, true));
         Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
MapType.SYSTEM_DEFAULT, true));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
StructType.SYSTEM_DEFAULT, true));
@@ -1712,11 +1712,11 @@ public class CheckCastTest {
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
TimeV2Type.MAX, false));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
IPv4Type.INSTANCE, false));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
IPv6Type.INSTANCE, false));
-        Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, false));
-        Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, false));
-        Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
StringType.INSTANCE, false));
+        Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, false));
+        Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, false));
+        Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
StringType.INSTANCE, false));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
JsonType.INSTANCE, false));
-        Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, false));
+        Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, false));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
ArrayType.SYSTEM_DEFAULT, false));
         Assertions.assertTrue(CheckCast.check(MapType.SYSTEM_DEFAULT, 
MapType.SYSTEM_DEFAULT, false));
         Assertions.assertFalse(CheckCast.check(MapType.SYSTEM_DEFAULT, 
StructType.SYSTEM_DEFAULT, false));
@@ -1747,11 +1747,11 @@ public class CheckCastTest {
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
TimeV2Type.MAX, true));
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
IPv4Type.INSTANCE, true));
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
IPv6Type.INSTANCE, true));
-        Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, true));
-        Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, true));
-        Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
StringType.INSTANCE, true));
+        Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, true));
+        Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, true));
+        Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
StringType.INSTANCE, true));
         Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
JsonType.INSTANCE, true));
-        Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, true));
+        Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, true));
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
ArrayType.SYSTEM_DEFAULT, true));
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
MapType.SYSTEM_DEFAULT, true));
         Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
StructType.SYSTEM_DEFAULT, true));
@@ -1795,11 +1795,11 @@ public class CheckCastTest {
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
TimeV2Type.MAX, false));
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
IPv4Type.INSTANCE, false));
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
IPv6Type.INSTANCE, false));
-        Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, false));
-        Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, false));
-        Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
StringType.INSTANCE, false));
+        Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
CharType.SYSTEM_DEFAULT, false));
+        Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT, false));
+        Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
StringType.INSTANCE, false));
         Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
JsonType.INSTANCE, false));
-        Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, false));
+        Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
VariantType.INSTANCE, false));
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
ArrayType.SYSTEM_DEFAULT, false));
         Assertions.assertFalse(CheckCast.check(StructType.SYSTEM_DEFAULT, 
MapType.SYSTEM_DEFAULT, false));
         Assertions.assertTrue(CheckCast.check(StructType.SYSTEM_DEFAULT, 
StructType.SYSTEM_DEFAULT, false));
diff --git 
a/regression-test/suites/doc/sql-manual/basic-elements/data-types/array-md.groovy
 
b/regression-test/suites/doc/sql-manual/basic-elements/data-types/array-md.groovy
index 0f2b925c6e1..ee0fdcf38e6 100644
--- 
a/regression-test/suites/doc/sql-manual/basic-elements/data-types/array-md.groovy
+++ 
b/regression-test/suites/doc/sql-manual/basic-elements/data-types/array-md.groovy
@@ -81,10 +81,10 @@ suite("array-md", "p0, nonConcurrent") {
         exception "Type exceeds the maximum nesting depth of 9"
     }
     
-    test {
-        sql """ SELECT CAST(ARRAY(1, 2, 3) AS STRING) """
-        exception "can not cast from origin type ARRAY<TINYINT> to target 
type=TEXT"
-    }
+    //    test {
+    //        sql """ SELECT CAST(ARRAY(1, 2, 3) AS STRING) """
+    //        exception "can not cast from origin type ARRAY<TINYINT> to 
target type=TEXT"
+    //    }
 
     qt_sql """ SELECT CAST("[1,2,3]" AS ARRAY<INT>) """
 
diff --git 
a/regression-test/suites/doc/sql-manual/basic-elements/data-types/map-md.groovy 
b/regression-test/suites/doc/sql-manual/basic-elements/data-types/map-md.groovy
index 7474264fa20..63b8298ef9e 100644
--- 
a/regression-test/suites/doc/sql-manual/basic-elements/data-types/map-md.groovy
+++ 
b/regression-test/suites/doc/sql-manual/basic-elements/data-types/map-md.groovy
@@ -150,10 +150,10 @@ suite("map-md", "p0") {
         exception "Type exceeds the maximum nesting depth of 9"
     }
     
-    test {
-        sql """ SELECT CAST(MAP('key1', 1, 'key2', 2) AS STRING) """
-        exception "can not cast from origin type MAP<VARCHAR(4),TINYINT> to 
target type=TEXT"
-    }
+    //    test {
+    //        sql """ SELECT CAST(MAP('key1', 1, 'key2', 2) AS STRING) """
+    //        exception "can not cast from origin type MAP<VARCHAR(4),TINYINT> 
to target type=TEXT"
+    //    }
 
     qt_sql """ SELECT CAST(MAP('key1', 1, 'key2', 2) AS MAP<STRING, STRING>) 
"""
 
diff --git 
a/regression-test/suites/doc/sql-manual/basic-elements/data-types/struct-md.groovy
 
b/regression-test/suites/doc/sql-manual/basic-elements/data-types/struct-md.groovy
index e7a62362310..7ba531ee9fd 100644
--- 
a/regression-test/suites/doc/sql-manual/basic-elements/data-types/struct-md.groovy
+++ 
b/regression-test/suites/doc/sql-manual/basic-elements/data-types/struct-md.groovy
@@ -148,10 +148,10 @@ suite("struct-md", "p0") {
         exception "Type exceeds the maximum nesting depth of 9"
     }
     
-    test {
-        sql """ SELECT CAST(STRUCT(1, 'John') AS STRING) """
-        exception "can not cast from origin type STRUCT<StructField ( 
name=col1, dataType=TINYINT, nullable=true ),StructField ( name=col2, 
dataType=VARCHAR(4), nullable=true )> to target type=TEXT"
-    }
+    //    test {
+    //        sql """ SELECT CAST(STRUCT(1, 'John') AS STRING) """
+    //        exception "can not cast from origin type STRUCT<StructField ( 
name=col1, dataType=TINYINT, nullable=true ),StructField ( name=col2, 
dataType=VARCHAR(4), nullable=true )> to target type=TEXT"
+    //    }
 
     qt_sql """ SELECT CAST(STRUCT(1, 'John') AS STRUCT<id: INT, name: STRING>) 
"""
 
diff --git 
a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_array_functions_by_literal.groovy
 
b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_array_functions_by_literal.groovy
index ae37e308e1b..4c06d2f66fa 100644
--- 
a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_array_functions_by_literal.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_array_functions_by_literal.groovy
@@ -67,24 +67,24 @@ suite("test_cast_array_functions_by_literal") {
         exception "errCode = 2,"
     }
     //  ========== cast array to scalar ===========
-
-    test {
-        sql "select cast(['x'] as char)"
-        // check exception message contains
-        exception "errCode = 2,"
-    }
-
-    test {
-        sql "select cast(['x'] as varchar)"
-        // check exception message contains
-        exception "errCode = 2,"
-    }
-
-    test {
-        sql "select cast(['x'] as string)"
-        // check exception message contains
-        exception "errCode = 2,"
-    }
+    //
+    //    test {
+    //        sql "select cast(['x'] as char)"
+    //        // check exception message contains
+    //        exception "errCode = 2,"
+    //    }
+    //
+    //    test {
+    //        sql "select cast(['x'] as varchar)"
+    //        // check exception message contains
+    //        exception "errCode = 2,"
+    //    }
+    //
+    //    test {
+    //        sql "select cast(['x'] as string)"
+    //        // check exception message contains
+    //        exception "errCode = 2,"
+    //    }
 
     test {
         sql "select cast([0] as int)"
diff --git 
a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_struct.groovy
 
b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_struct.groovy
index 2d177154b49..f9bc7d9b811 100644
--- 
a/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_struct.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/cast_function/test_cast_struct.groovy
@@ -54,10 +54,10 @@ suite("test_cast_struct") {
     }
 
     // struct literal can not cast to basic types
-    test {
-        sql "select cast({1,2} as string)"
-        exception "errCode = 2,"
-    }
+    //    test {
+    //        sql "select cast({1,2} as string)"
+    //        exception "errCode = 2,"
+    //    }
 
     // struct literal cast to struct MUST with same field number
     test {


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

Reply via email to