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]