From e9fac3cc2f7f81d390f65a86875c8dff4e4766c4 Mon Sep 17 00:00:00 2001 From: yujun Date: Mon, 12 May 2025 17:26:55 +0800 Subject: [PATCH 1/4] fix parse date time exception --- .../nereids/parser/LogicalPlanBuilder.java | 32 ++++++++++++++++--- .../test_cast_datetime.groovy | 4 +++ 2 files changed, 31 insertions(+), 5 deletions(-) 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 738b4fde79dfc2..73bb7bdcfd3950 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 @@ -890,6 +890,10 @@ import org.apache.doris.nereids.types.BigIntType; import org.apache.doris.nereids.types.BooleanType; import org.apache.doris.nereids.types.DataType; +import org.apache.doris.nereids.types.DateTimeType; +import org.apache.doris.nereids.types.DateTimeV2Type; +import org.apache.doris.nereids.types.DateType; +import org.apache.doris.nereids.types.DateV2Type; import org.apache.doris.nereids.types.LargeIntType; import org.apache.doris.nereids.types.MapType; import org.apache.doris.nereids.types.StructField; @@ -2941,19 +2945,37 @@ public String visitUnitIdentifier(UnitIdentifierContext ctx) { } @Override - public Literal visitTypeConstructor(TypeConstructorContext ctx) { + public Expression visitTypeConstructor(TypeConstructorContext ctx) { String value = ctx.STRING_LITERAL().getText(); value = value.substring(1, value.length() - 1); String type = ctx.type.getText().toUpperCase(); switch (type) { case "DATE": - return Config.enable_date_conversion ? new DateV2Literal(value) : new DateLiteral(value); + try { + return Config.enable_date_conversion ? new DateV2Literal(value) : new DateLiteral(value); + } catch (Exception e) { + return new Cast(Literal.of(value), + Config.enable_date_conversion ? DateV2Type.INSTANCE : DateType.INSTANCE); + } case "TIMESTAMP": - return Config.enable_date_conversion ? new DateTimeV2Literal(value) : new DateTimeLiteral(value); + try { + return Config.enable_date_conversion ? new DateTimeV2Literal(value) : new DateTimeLiteral(value); + } catch (Exception e) { + return new Cast(Literal.of(value), + Config.enable_date_conversion ? DateTimeV2Type.MAX: DateTimeType.INSTANCE); + } case "DATEV2": - return new DateV2Literal(value); + try { + return new DateV2Literal(value); + } catch (Exception e) { + return new Cast(Literal.of(value), DateV2Type.INSTANCE); + } case "DATEV1": - return new DateLiteral(value); + try { + return new DateLiteral(value); + } catch (Exception e) { + return new Cast(Literal.of(value), DateType.INSTANCE); + } default: throw new ParseException("Unsupported data type : " + type, ctx); } diff --git a/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy b/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy index 32eb0da90ebc20..bbc371e1756f83 100644 --- a/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy +++ b/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy @@ -53,6 +53,10 @@ suite("test_cast_datetime") { qt_3 "select a, '' = mydate, '' = mydatev2, '' = mydatetime, '' = mydatetimev2 from casttbl" def wrong_date_strs = [ + "date '2020-01'", + "datev1 '2020-01'", + "datev2 '2020-01'", + "timestamp '2020-01'", "'' > date '2019-06-01'", "'' > date_sub('2019-06-01', -10)", "'' > cast('2019-06-01 00:00:00' as datetime)", From ed7ef2aaf77a11c42ef1d49a4fb504b695a50b6d Mon Sep 17 00:00:00 2001 From: yujun Date: Mon, 12 May 2025 17:35:46 +0800 Subject: [PATCH 2/4] update --- .../suites/nereids_syntax_p0/test_cast_datetime.groovy | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy b/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy index bbc371e1756f83..c56a4272e5468e 100644 --- a/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy +++ b/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy @@ -576,5 +576,15 @@ suite("test_cast_datetime") { sql "select date_add('2023-11-05 01:30:00 America/New_York', INTERVAL 1 DAY)" result([[LocalDateTime.parse('2023-11-06T01:30:00')]]) } + + test { + sql "select date '2025年1月20日'" + result([[Date.valueOf('2025-01-20')]]) + } + + test { + sql "select timestamp '2025年1月20日10时20分5秒'" + result([[LocalDateTime.parse('2025-01-20T10:20:05')]]) + } } } From 6f9407b5aac8024ad8c3701992109fe2289f6bf9 Mon Sep 17 00:00:00 2001 From: yujun Date: Tue, 13 May 2025 16:00:36 +0800 Subject: [PATCH 3/4] fix --- .../org/apache/doris/nereids/parser/LogicalPlanBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 73bb7bdcfd3950..2d15a58e767566 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 @@ -2962,7 +2962,7 @@ public Expression visitTypeConstructor(TypeConstructorContext ctx) { return Config.enable_date_conversion ? new DateTimeV2Literal(value) : new DateTimeLiteral(value); } catch (Exception e) { return new Cast(Literal.of(value), - Config.enable_date_conversion ? DateTimeV2Type.MAX: DateTimeType.INSTANCE); + Config.enable_date_conversion ? DateTimeV2Type.MAX : DateTimeType.INSTANCE); } case "DATEV2": try { From 12237a06f6be695e60325407b32896936f277ec7 Mon Sep 17 00:00:00 2001 From: yujun Date: Wed, 14 May 2025 08:56:19 +0800 Subject: [PATCH 4/4] fix --- .../apache/doris/nereids/parser/LogicalPlanBuilder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 2d15a58e767566..10a7c349e92c53 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 @@ -2954,27 +2954,27 @@ public Expression visitTypeConstructor(TypeConstructorContext ctx) { try { return Config.enable_date_conversion ? new DateV2Literal(value) : new DateLiteral(value); } catch (Exception e) { - return new Cast(Literal.of(value), + return new Cast(new StringLiteral(value), Config.enable_date_conversion ? DateV2Type.INSTANCE : DateType.INSTANCE); } case "TIMESTAMP": try { return Config.enable_date_conversion ? new DateTimeV2Literal(value) : new DateTimeLiteral(value); } catch (Exception e) { - return new Cast(Literal.of(value), + return new Cast(new StringLiteral(value), Config.enable_date_conversion ? DateTimeV2Type.MAX : DateTimeType.INSTANCE); } case "DATEV2": try { return new DateV2Literal(value); } catch (Exception e) { - return new Cast(Literal.of(value), DateV2Type.INSTANCE); + return new Cast(new StringLiteral(value), DateV2Type.INSTANCE); } case "DATEV1": try { return new DateLiteral(value); } catch (Exception e) { - return new Cast(Literal.of(value), DateType.INSTANCE); + return new Cast(new StringLiteral(value), DateType.INSTANCE); } default: throw new ParseException("Unsupported data type : " + type, ctx);