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 af475b42c5..be939ba2f6 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 @@ -29,6 +29,7 @@ import org.apache.doris.nereids.types.MapType; import org.apache.doris.nereids.types.StructField; import org.apache.doris.nereids.types.StructType; import org.apache.doris.nereids.types.coercion.CharacterType; +import org.apache.doris.nereids.types.coercion.PrimitiveType; import java.util.List; @@ -57,6 +58,9 @@ public class CheckCast extends AbstractExpressionRewriteRule { if (originalType.equals(targetType)) { return true; } + if (originalType instanceof CharacterType && !(targetType instanceof PrimitiveType)) { + return true; + } if (originalType instanceof ArrayType && targetType instanceof ArrayType) { return check(((ArrayType) originalType).getItemType(), ((ArrayType) targetType).getItemType()); } else if (originalType instanceof MapType && targetType instanceof MapType) { @@ -77,8 +81,6 @@ public class CheckCast extends AbstractExpressionRewriteRule { } } return true; - } else if (originalType instanceof CharacterType && targetType instanceof StructType) { - return true; } else if (originalType instanceof JsonType || targetType instanceof JsonType) { return true; } else { diff --git a/regression-test/data/nereids_syntax_p0/cast.out b/regression-test/data/nereids_syntax_p0/cast.out index 8be6228e0f..3606adc1fc 100644 --- a/regression-test/data/nereids_syntax_p0/cast.out +++ b/regression-test/data/nereids_syntax_p0/cast.out @@ -349,3 +349,12 @@ true 0.1 -- !string -- 00:00:01 +-- !string_to_array -- +[1, 2, 3] + +-- !string_to_map -- +{1:1, 2:2, 3:3} + +-- !string_to_struct -- +{1, 2, 3} + diff --git a/regression-test/suites/nereids_syntax_p0/cast.groovy b/regression-test/suites/nereids_syntax_p0/cast.groovy index 24dc63628d..0589ec5275 100644 --- a/regression-test/suites/nereids_syntax_p0/cast.groovy +++ b/regression-test/suites/nereids_syntax_p0/cast.groovy @@ -219,6 +219,10 @@ suite("cast") { qt_varchar """select cast(cast("1" as varchar(1)) as time)""" qt_string """select cast(cast("1" as string) as time)""" + qt_string_to_array "select cast('[1, 2, 3]' as array)" + qt_string_to_map "select cast('{1:1,2:2,3:3}' as map)" + qt_string_to_struct "select cast('{1,2,3}' as struct)" + // boolean test { sql """select cast(k0 as time) ct from test order by ct;"""