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

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


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 1eff4538aa3 branch-2.1: [fix](nereids) fix convert to date literal 
throw exception #48980 (#48985)
1eff4538aa3 is described below

commit 1eff4538aa30966e0ec5c3bec8c1c24d0d88f912
Author: yujun <yu...@selectdb.com>
AuthorDate: Sat Mar 15 10:44:40 2025 +0800

    branch-2.1: [fix](nereids) fix convert to date literal throw exception 
#48980 (#48985)
---
 .../expression/rules/FoldConstantRuleOnFE.java     |  19 +-
 .../doris/nereids/stats/ExpressionEstimation.java  |   3 +-
 .../trees/expressions/literal/DateLiteral.java     |  28 +-
 .../trees/expressions/literal/DateTimeLiteral.java |   4 +-
 .../apache/doris/nereids/types/DateTimeV2Type.java |  10 +-
 .../doris/nereids/util/TypeCoercionUtils.java      |   5 +-
 .../trees/expressions/literal/DateLiteralTest.java |   9 +-
 .../data/nereids_syntax_p0/test_cast_datetime.out  | Bin 351 -> 258 bytes
 .../nereids_syntax_p0/test_cast_datetime.groovy    | 504 ++++++++++++++++++++-
 9 files changed, 535 insertions(+), 47 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
index cb4bdc07e98..6014cbbcf35 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/FoldConstantRuleOnFE.java
@@ -83,6 +83,7 @@ import 
org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.StringLikeLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.StringLiteral;
 import org.apache.doris.nereids.trees.expressions.literal.VarcharLiteral;
+import 
org.apache.doris.nereids.trees.expressions.literal.format.DateTimeChecker;
 import org.apache.doris.nereids.types.BooleanType;
 import org.apache.doris.nereids.types.DataType;
 import org.apache.doris.nereids.types.coercion.DateLikeType;
@@ -98,7 +99,6 @@ import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.Lists;
 import org.apache.commons.codec.digest.DigestUtils;
 
-import java.time.DateTimeException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -452,17 +452,14 @@ public class FoldConstantRuleOnFE extends 
AbstractExpressionRewriteRule
         if (child.isNullLiteral()) {
             return new NullLiteral(dataType);
         } else if (child instanceof StringLikeLiteral && dataType instanceof 
DateLikeType) {
+            String dateStr = ((StringLikeLiteral) child).getStringValue();
+            if (!DateTimeChecker.isValidDateTime(dateStr)) {
+                return cast;
+            }
             try {
-                return ((DateLikeType) 
dataType).fromString(((StringLikeLiteral) child).getStringValue());
-            } catch (AnalysisException t) {
-                if (cast.isExplicitType()) {
-                    return cast;
-                } else {
-                    // If cast is from type coercion, we don't use NULL 
literal and will throw exception.
-                    throw t;
-                }
-            } catch (DateTimeException e) {
-                return new NullLiteral(dataType);
+                return ((DateLikeType) dataType).fromString(dateStr);
+            } catch (Exception t) {
+                return cast;
             }
         }
         try {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
index 39656b6636b..780c5922c6a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/stats/ExpressionEstimation.java
@@ -100,7 +100,6 @@ import org.apache.doris.statistics.Statistics;
 import com.google.common.base.Preconditions;
 import org.apache.commons.collections.CollectionUtils;
 
-import java.time.DateTimeException;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -223,7 +222,7 @@ public class ExpressionEstimation extends 
ExpressionVisitor<ColumnStatistic, Sta
                     long max = dateMaxLiteral.getValue();
                     builder.setMaxValue(max);
                     builder.setMaxExpr(dateMaxLiteral.toLegacyLiteral());
-                } catch (DateTimeException | AnalysisException e) {
+                } catch (AnalysisException e) {
                     convertSuccess = false;
                 }
             }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java
index 54a74944a22..56bbcb5ca96 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteral.java
@@ -30,7 +30,6 @@ import org.apache.doris.nereids.util.DateUtils;
 
 import com.google.common.collect.ImmutableSet;
 
-import java.time.DateTimeException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.Year;
@@ -274,8 +273,8 @@ public class DateLiteral extends Literal {
     }
 
     /** parseDateLiteral */
-    public static Result<DateLiteral, ? extends Exception> 
parseDateLiteral(String s) {
-        Result<TemporalAccessor, ? extends Exception> parseResult = 
parseDateTime(s);
+    public static Result<DateLiteral, AnalysisException> 
parseDateLiteral(String s) {
+        Result<TemporalAccessor, AnalysisException> parseResult = 
parseDateTime(s);
         if (parseResult.isError()) {
             return parseResult.cast();
         }
@@ -291,17 +290,17 @@ public class DateLiteral extends Literal {
     }
 
     /** parseDateTime */
-    public static Result<TemporalAccessor, ? extends Exception> 
parseDateTime(String s) {
-        // fast parse '2022-01-01'
-        if (s.length() == 10 && s.charAt(4) == '-' && s.charAt(7) == '-') {
-            TemporalAccessor date = fastParseDate(s);
-            if (date != null) {
-                return Result.ok(date);
-            }
-        }
-
+    public static Result<TemporalAccessor, AnalysisException> 
parseDateTime(String s) {
         String originalString = s;
         try {
+            // fast parse '2022-01-01'
+            if (s.length() == 10 && s.charAt(4) == '-' && s.charAt(7) == '-') {
+                TemporalAccessor date = fastParseDate(s);
+                if (date != null) {
+                    return Result.ok(date);
+                }
+            }
+
             TemporalAccessor dateTime;
 
             // remove suffix/prefix ' '
@@ -342,14 +341,11 @@ public class DateLiteral extends Literal {
             // if Year is not present, throw exception
             if (!dateTime.isSupported(ChronoField.YEAR)) {
                 return Result.err(
-                        () -> new DateTimeException("date/datetime literal [" 
+ originalString + "] is invalid")
+                        () -> new AnalysisException("date/datetime literal [" 
+ originalString + "] is invalid")
                 );
             }
 
             return Result.ok(dateTime);
-        } catch (DateTimeException e) {
-            return Result.err(() ->
-                    new DateTimeException("date/datetime literal [" + 
originalString + "] is invalid", e));
         } catch (Exception ex) {
             return Result.err(() -> new AnalysisException("date/datetime 
literal [" + originalString + "] is invalid"));
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java
index f056bed9169..17c5678b051 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteral.java
@@ -132,8 +132,8 @@ public class DateTimeLiteral extends DateLiteral {
     }
 
     /** parseDateTimeLiteral */
-    public static Result<DateTimeLiteral, ? extends Exception> 
parseDateTimeLiteral(String s, boolean isV2) {
-        Result<TemporalAccessor, ? extends Exception> parseResult = 
parseDateTime(s);
+    public static Result<DateTimeLiteral, AnalysisException> 
parseDateTimeLiteral(String s, boolean isV2) {
+        Result<TemporalAccessor, AnalysisException> parseResult = 
parseDateTime(s);
         if (parseResult.isError()) {
             return parseResult.cast();
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java
index 94de55aea61..c374ef87203 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/types/DateTimeV2Type.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.nereids.exceptions.AnalysisException;
 import org.apache.doris.nereids.trees.expressions.literal.DateTimeLiteral;
+import 
org.apache.doris.nereids.trees.expressions.literal.format.DateTimeChecker;
 import org.apache.doris.nereids.types.coercion.DateLikeType;
 import org.apache.doris.nereids.types.coercion.IntegralType;
 
@@ -87,7 +88,14 @@ public class DateTimeV2Type extends DateLikeType {
      * maybe we need to check for validity?
      */
     public static DateTimeV2Type forTypeFromString(String s) {
-        int scale = DateTimeLiteral.determineScale(s);
+        int scale = MAX_SCALE;
+        if (DateTimeChecker.isValidDateTime(s)) {
+            try {
+                scale = DateTimeLiteral.determineScale(s);
+            } catch (Exception e) {
+                // let be to process it
+            }
+        }
         if (scale > MAX_SCALE) {
             scale = MAX_SCALE;
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
index 29066b0c3b2..6c4cafa2517 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/TypeCoercionUtils.java
@@ -600,12 +600,11 @@ public class TypeCoercionUtils {
             } else if (dataType.isDateTimeType() && 
DateTimeChecker.isValidDateTime(value)) {
                 ret = DateTimeLiteral.parseDateTimeLiteral(value, 
false).orElse(null);
             } else if (dataType.isDateV2Type() && 
DateTimeChecker.isValidDateTime(value)) {
-                Result<DateLiteral, ? extends Exception> parseResult
-                        = DateV2Literal.parseDateLiteral(value);
+                Result<DateLiteral, AnalysisException> parseResult = 
DateV2Literal.parseDateLiteral(value);
                 if (parseResult.isOk()) {
                     ret = parseResult.get();
                 } else {
-                    Result<DateTimeLiteral, ? extends Exception> parseResult2
+                    Result<DateTimeLiteral, AnalysisException> parseResult2
                             = DateTimeV2Literal.parseDateTimeLiteral(value, 
true);
                     if (parseResult2.isOk()) {
                         ret = parseResult2.get();
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteralTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteralTest.java
index 1919238ac7e..f9455e5d623 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteralTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateLiteralTest.java
@@ -23,7 +23,6 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
-import java.time.DateTimeException;
 import java.util.function.Consumer;
 
 class DateLiteralTest {
@@ -68,8 +67,8 @@ class DateLiteralTest {
         new DateLiteral("2022-1-1");
         new DateLiteral("20220101");
 
-        Assertions.assertThrows(DateTimeException.class, () -> new 
DateLiteral("-01-01"));
-        Assertions.assertThrows(DateTimeException.class, () -> new 
DateLiteral("01-01"));
+        Assertions.assertThrows(AnalysisException.class, () -> new 
DateLiteral("-01-01"));
+        Assertions.assertThrows(AnalysisException.class, () -> new 
DateLiteral("01-01"));
     }
 
     @Test
@@ -130,8 +129,8 @@ class DateLiteralTest {
 
     @Test
     void testWrongPunctuationDate() {
-        Assertions.assertThrows(DateTimeException.class, () -> new 
DateTimeV2Literal("2020€02€01"));
-        Assertions.assertThrows(DateTimeException.class, () -> new 
DateTimeV2Literal("2020【02】01"));
+        Assertions.assertThrows(AnalysisException.class, () -> new 
DateTimeV2Literal("2020€02€01"));
+        Assertions.assertThrows(AnalysisException.class, () -> new 
DateTimeV2Literal("2020【02】01"));
     }
 
     @Test
diff --git a/regression-test/data/nereids_syntax_p0/test_cast_datetime.out 
b/regression-test/data/nereids_syntax_p0/test_cast_datetime.out
index a2a359c2c43..c0fec349189 100644
Binary files a/regression-test/data/nereids_syntax_p0/test_cast_datetime.out 
and b/regression-test/data/nereids_syntax_p0/test_cast_datetime.out differ
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 5e00ecd0789..5ffddd853bf 100644
--- a/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy
+++ b/regression-test/suites/nereids_syntax_p0/test_cast_datetime.groovy
@@ -15,6 +15,9 @@
 // specific language governing permissions and limitations
 // under the License.
 
+import java.sql.Date
+import java.time.LocalDateTime
+
 suite("test_cast_datetime") {
 
     sql "drop table if exists casttbl"
@@ -49,11 +52,498 @@ suite("test_cast_datetime") {
     qt_2 "select * from casttbl"
     qt_3 "select a, '' = mydate, '' = mydatev2, '' = mydatetime, '' = 
mydatetimev2 from casttbl"
 
-    qt_4 "select '' > date '2019-06-01'"
-    qt_5 "select '' > date_sub('2019-06-01', -10)"
-    qt_7 "select '' > cast('2019-06-01 00:00:00' as datetime)"
-    qt_8 "select date_add('', 10)"
-    qt_9 "select date_add('2020', 10)"
-    qt_10 "select date_add('08-09', 10)"
-    qt_12 "select date_add('abcd', 10)"
+    def wrong_date_strs = [
+        "'' > date '2019-06-01'",
+        "'' > date_sub('2019-06-01', -10)",
+        "'' > cast('2019-06-01 00:00:00' as datetime)",
+        "date_add('', 1)",
+        "date_add('2020',1)",
+        "date_add('08-09',1)",
+        "date_add('abcd',1)",
+        "date_add('2020-15-20',1)",
+        "date_add('2020-10-32',1)",
+        "date_add('2021-02-29',1)",
+        "date_add('99999-10-10',1)",
+        "date_add('10-30',1)",
+        "date_add('10-30 10:10:10',1)",
+        "date_add('2020-01 00:00:00', 1)",
+        "MICROSECOND('invalid_time')",
+        "MICROSECOND('12.34.56.123456')",
+        "MICROSECOND('12:34:56')",
+        "MICROSECOND('12:34:56.1234')",
+        "MICROSECOND('12345')",
+        "MICROSECOND('12:34:56.1')",
+        "MICROSECOND('12:34:56.01')",
+        "MICROSECOND('12:34:56.abcdef')",
+        "MICROSECOND('NaN')",
+        "MonthName('abcd-ef-gh')",
+        "DATE('2023-02-28 24:00:00')",
+        "DATE('2023-02-28 23:59:60')",
+        "DATE('170141183460469231731687303715884105727')",
+        "DATE('1月1日')",
+        "DATE('12345678')",
+        "DATE('2023-1-32')",
+        "DATE('1-1-2023')",
+        "DATE('January 32, 2023')",
+        "DATE('February 29, 2023')",
+        "DATE('April 31, 2023')",
+        "DATE('02/29/2023')",
+        "DATE('13/01/2023')",
+        "DATEV2('20230229')",
+        "DATEV2('abc')",
+        "DATEV2('日本語')",
+        "DATEV2('ññó')",
+        "DATEV2('')",
+        "DATEV2(' ')",
+        "DATEV2('12:34:56')",
+        "DATEV2('NaN')",
+        "DATEV2('infinity')",
+        "DATEV2('\$2023')",
+        "DATEV2('0xFF')",
+        "DATEV2('123,456')",
+        "DATEV2('12345')",
+        "DATEV2('1.2e+3')",
+        "DATEV2(' -2023 ')",
+        "DATEV2('3.1415π')",
+        "DATEV2('12/31/2023')",
+        "DATEV2('32-01-2023')",
+        "DATEV2('2023/02/29')",
+        "DATEV2('1.7976931348623157E308')",
+        "DATEV2('1E-30')",
+        "DATEV2('true')",
+        "DATEV2('false')",
+        "DATEV2('NULL')",
+        "DATEV2('123LATIN')",
+        "DATEV2('0x2023')",
+        "DATEV2('123.45test')",
+        "DATEV2('2023-W50-5')",
+        "DATEV2('2023-367')",
+        "DATEV2('3.14.15')",
+        "DATEV2('+-2023')",
+        "DATEV2('123.45')",
+        "DATEV2('2023-02-28 25:00')",
+        "DATEV2('2023-02-29T00:00:00')",
+        "DATEV2('0000-00-00 00:00:00')",
+        "DATEV2('January 32, 2023')",
+        "DATEV2('February 29, 2023')",
+        "DATEV2('April 31, 2023')",
+        "DATEV2('13/01/2023')",
+        "DATEV2('2023-1-32')",
+        "DATEV2('1-1-2023')",
+        "DATEV2('1月1日')",
+        "DATEV2('12345678')",
+        "DATEV2('2023-02-28 24:00:00')",
+        "DATEV2('2023-02-28 23:59:60')",
+        "DATEV2('170141183460469231731687303715884105727')",
+        "DATEV2('0')",
+        "DATEV2('123456789012345678901234567890')",
+        "DATEV2('1234567890')",
+        "QUARTER('20230229')",
+        "QUARTER('abc')",
+        "QUARTER('日本語')",
+        "QUARTER('ññó')",
+        "QUARTER('')",
+        "QUARTER(' ')",
+        "QUARTER('12:34:56')",
+        "QUARTER('NaN')",
+        "QUARTER('infinity')",
+        "QUARTER('\$2023')",
+        "QUARTER('0xFF')",
+        "QUARTER('123,456')",
+        "QUARTER('12345')",
+        "QUARTER('1.2e+3')",
+        "QUARTER(' -2023 ')",
+        "QUARTER('3.1415π')",
+        "QUARTER('12/31/2023')",
+        "QUARTER('32-01-2023')",
+        "QUARTER('2023/02/29')",
+        "QUARTER('1.7976931348623157E308')",
+        "QUARTER('1E-30')",
+        "QUARTER('true')",
+        "QUARTER('false')",
+        "QUARTER('NULL')",
+        "QUARTER('123LATIN')",
+        "QUARTER('0x2023')",
+        "QUARTER('123.45test')",
+        "QUARTER('2023-W50-5')",
+        "QUARTER('2023-367')",
+        "QUARTER('3.14.15')",
+        "QUARTER('+-2023')",
+        "QUARTER('123.45')",
+        "QUARTER('2023-02-28 25:00')",
+        "QUARTER('10000-01-01')",
+        "QUARTER('January 32, 2023')",
+        "QUARTER('February 29, 2023')",
+        "QUARTER('April 31, 2023')",
+        "QUARTER('13/01/2023')",
+        "QUARTER('1月1日')",
+        "QUARTER('170141183460469231731687303715884105727')",
+        "QUARTER('0')",
+        "QUARTER('123456789012345678901234567890')",
+        "QUARTER('999999999999999999999999999999-99-99')",
+        "QUARTER('1234567890')",
+        "QUARTER('2023-02-28 24:00:00')",
+        "QUARTER('2023-02-28 23:59:60')",
+        "QUARTER('2023-1-32')",
+        "QUARTER('1-1-2023')",
+        "QUARTER('9999999999999999-99-99')",
+        "QUARTER('123.456.789')",
+        "QUARTER('+-1.57')",
+        "QUARTER('0x1A')",
+        "QUARTER('3π/2')",
+        "QUARTER('2023-02-29T00:00:00')",
+        "QUARTER('2023年七月十五日')",
+        "QUARTER('12345六七八')",
+        "QUARTER('1/0')",
+        "QUARTER('Q4-2023')",
+        "QUARTER('2023-Q4')",
+        "QUARTER('2023Q4')",
+        "WEEK('invalid_date')",
+        "WEEK('12:34:56.789')",
+        "WEEK('')",
+        "WEEK('2023-W30-1')",
+        "WEEK('2023-06-15', WEEK('invalid_date'))",
+        "YEAR('20230229')",
+        "YEAR('abc')",
+        "YEAR('日本語')",
+        "YEAR('ññó')",
+        "YEAR('')",
+        "YEAR(' ')",
+        "YEAR('12:34:56')",
+        "YEAR('NaN')",
+        "YEAR('infinity')",
+        "YEAR('\$2023')",
+        "YEAR('0xFF')",
+        "YEAR('123,456')",
+        "YEAR('12345')",
+        "YEAR('1.2e+3')",
+        "YEAR(' -2023 ')",
+        "YEAR('3.1415π')",
+        "YEAR('12/31/2023')",
+        "YEAR('32-01-2023')",
+        "YEAR('2023/02/29')",
+        "YEAR('1.7976931348623157E308')",
+        "YEAR('1E-30')",
+        "YEAR('true')",
+        "YEAR('false')",
+        "YEAR('NULL')",
+        "YEAR('123LATIN')",
+        "YEAR('0x2023')",
+        "YEAR('123.45test')",
+        "YEAR('2023-W50-5')",
+        "YEAR('2023-367')",
+        "YEAR('3.14.15')",
+        "YEAR('+-2023')",
+        "YEAR('123.45')",
+        // "YEAR('2023-02-28 25:00')",
+        "YEAR('10000-01-01')",
+        "YEAR('January 32, 2023')",
+        "YEAR('February 29, 2023')",
+        "YEAR('April 31, 2023')",
+        "YEAR('13/01/2023')",
+        "YEAR('1月1日')",
+        "YEAR('170141183460469231731687303715884105727')",
+        "YEAR('0')",
+        "YEAR('123456789012345678901234567890')",
+        "YEAR('999999999999999999999999999999-99-99')",
+        "YEAR('1234567890')",
+        // "YEAR('2023-02-28 24:00:00')",
+        // "YEAR('2023-02-28 23:59:60')",
+        "YEAR('2023-1-32')",
+        "YEAR('1-1-2023')",
+        "YEAR('9999999999999999-99-99')",
+        "YEAR('123.456.789')",
+        "YEAR('+-1.57')",
+        "YEAR('0x1A')",
+        "YEAR('3π/2')",
+        "YEAR('2023-02-29T00:00:00')",
+        "DATE_TRUNC('1st Jun 2007 14:15:20', 'second')",
+        "DATE_TRUNC('1st Jun 2007 14:15:20', 'minute')",
+        "DATE_TRUNC('1st Jun 2007 14:15:20', 'hour')",
+        "DATE_TRUNC('1st Jun 2007', 'day')",
+        "DATE_TRUNC('1st Jun 2007', 'week')",
+        "DATE_TRUNC('1st Jun 2007', 'month')",
+        "DATE_TRUNC('1st Jun 2007', 'quarter')",
+        "DATE_TRUNC('1st Jun 2007', 'year')",
+        "DATE_TRUNC('15th Dec 2012 20:30:40', 'second')",
+        "DATE_TRUNC('15th Dec 2012 20:30:40', 'minute')",
+        "DATE_TRUNC('15th Dec 2012 20:30:40', 'hour')",
+        "DATE_TRUNC('15th Dec 2012', 'day')",
+        "DATE_TRUNC('15th Dec 2012', 'week')",
+        "DATE_TRUNC('15th Dec 2012', 'month')",
+        "DATE_TRUNC('15th Dec 2012', 'quarter')",
+        "DATE_TRUNC('15th Dec 2012', 'year')",
+        "DATE_TRUNC('22nd Mar 2020 07:55:05', 'second')",
+        "DATE_TRUNC('22nd Mar 2020 07:55:05', 'minute')",
+        "DATE_TRUNC('22nd Mar 2020 07:55:05', 'hour')",
+        "DATE_TRUNC('22nd Mar 2020', 'day')",
+        "DATE_TRUNC('22nd Mar 2020', 'week')",
+        "DATE_TRUNC('22nd Mar 2020', 'month')",
+        "DATE_TRUNC('22nd Mar 2020', 'quarter')",
+        "DATE_TRUNC('22nd Mar 2020', 'year')",
+        "DATE_TRUNC('2021-02-29 11:25:35', 'second')",
+        "DATE_TRUNC('2021-02-29 11:25:35', 'minute')",
+        "DATE_TRUNC('2021-02-29 11:25:35', 'hour')",
+        "DATE_TRUNC('2023/04/31 18:40:10', 'second')",
+        "DATE_TRUNC('2023/04/31 18:40:10', 'minute')",
+        "DATE_TRUNC('2023/04/31 18:40:10', 'hour')",
+        "DATE_TRUNC('2023/04/31', 'day')",
+        "DATE_TRUNC('2023/04/31', 'week')",
+        "DATE_TRUNC('2023/04/31', 'month')",
+        "DATE_TRUNC('2023/04/31', 'quarter')",
+        "DATE_TRUNC('2023/04/31', 'year')",
+        "WEEKDAY('invalid_date')",
+        "WEEKDAY('12:34:56.789')",
+        "WEEKDAY('')",
+        "WEEKDAY('2023-W40-1')",
+        "WEEKDAY('10-Oct-2023')",
+        "WEEKDAY('October 10, 2023')",
+        "WEEKOFYEAR('invalid_date')",
+        "weekofyear('12:34:56.789')",
+        "weekofyear('')",
+        "weekofyear('2023-W30-1')",
+        "YEARWEEK('invalid_date')",
+        "yearweek('12:34:56.789')",
+        "yearweek('')",
+        "yearweek('2023-W30-1')",
+        "YEARWEEK('2023-06-15', WEEK('invalid_date'))",
+        "yearweek('2023-06-15', WEEK('invalid_date'))",
+        "YEARWEEK('2023-06-15', WEEK('invalid_date'))",
+        "yearweek('2023-06-15', WEEK('invalid_date'))",
+        "HOUR('2024-01-01 12:00:00+')",
+        "timestamp('2023-02-29 14:30:00')",
+        "timestamp('1999-04-31 08:15:00')",
+        "timestamp('2000-00-00 00:00:00')",
+        "timestamp('1st Jun 2007 09:45:30')",
+        "timestamp('三〇〇〇-一-一')",
+        "timestamp('31/04/2022 16:20')",
+        "TIMESTAMP('2023/04/31')",
+        "TO_DATE('1st Jun 2007')",
+        "TO_DATE('15th Dec 2012')",
+        "TO_DATE('22nd Mar 2020')",
+        "TO_DATE('2023/04/31')",
+        "TO_DATE('1st Jun 2007 11:15:00')",
+        "TO_DATE('15th Dec 2012 17:30:00')",
+        "TO_DATE('22nd Mar 2020 05:45:00')",
+        "TO_DATE('2024-04-31 10:30:45')",
+        "TO_DATE('1st Jun 2007 14:20')",
+        "TO_DATE('31/12/1999')",
+        "TO_DATE('2025-13-01 00:00')",
+        "TO_DATE('2007-Jun-1st')",
+        "TO_DATE('12-31-1999 23:59')",
+        "TO_DATE('30-Feb-2023')",
+        "TO_DATE('2026-02-28 24:00:00')",
+        "to_monday('1st Jun 2007')",
+        "to_monday('15th Dec 2012')",
+        "to_monday('22nd Mar 2020')",
+        "to_monday('2023/04/31')",
+        "to_monday('2023-2-29')",
+        "to_monday('31st Apr 1999')",
+        "to_monday('0th Mar 2025')",
+        "to_monday('2025-04-31 08:15:00')",
+        "to_monday('1st Jun 2007')",
+        "LAST_DAY('1st Jun 2007')",
+        "LAST_DAY('15th Dec 2012')",
+        "LAST_DAY('22nd Mar 2020')",
+        "LAST_DAY('2023/04/31')",
+        "LAST_DAY('1st Jun 2007')",
+        "LAST_DAY('07/20/1969')",
+        "LAST_DAY('15-May-1999')",
+        "LAST_DAY('31十二月2023')",
+        "LAST_DAY('29-Feb-2023')",
+        "LAST_DAY('2023/04/31')",
+        "LAST_DAY('0-0-0')",
+        "TO_DAYS('1st Jun 2007')",
+        "TO_DAYS('15th Dec 2012')",
+        "TO_DAYS('22nd Mar 2020')",
+        "TO_DAYS('2023/04/31')",
+        "TO_DAYS('1st Jun 2007 11:15:00')",
+        "TO_DAYS('15th Dec 2012 17:30:00')",
+        "TO_DAYS('22nd Mar 2020 05:45:00')",
+        "TO_DAYS('1st Jun 2007')",
+        "TO_DAYS('3rd Mar 1990')",
+        "TO_DAYS('20230431')",
+        "TO_DAYS('2007-Jun-01')",
+        "TO_DAYS('2007/Jun/01')",
+        "TO_DAYS('31-Apr-2023')",
+        "FROM_DAYS(TO_DAYS('1st Jun 2007'))",
+        "FROM_DAYS(TO_DAYS('15th Dec 2012'))",
+        "FROM_DAYS(TO_DAYS('22nd Mar 2020'))",
+        "FROM_DAYS(TO_DAYS('2023/04/31'))",
+    ]
+
+    def hour_strs = [
+        "HOUR('2024-01-01 12:00:00')",
+        "HOUR('2024-01-01 12:00:00:')",
+        "HOUR('2024-01-01 12:00:00\\\"')",
+        "HOUR('2024-01-01 12:00:00\\'')",
+        "HOUR('2024-01-01 12:00:00<')",
+        "HOUR('2024-01-01 12:00:00>')",
+        "HOUR('2024-01-01 12:00:00,')",
+        "HOUR('2024-01-01 12:00:00.')",
+        "HOUR('2024-01-01 12:00:00?')",
+        "HOUR('2024-01-01 12:00:00/')",
+        "HOUR('2024-01-01 12:00:00!')",
+        "HOUR('2024-01-01 12:00:00@')",
+        "HOUR('2024-01-01 12:00:00#')",
+        "HOUR('2024-01-01 12:00:00\$')",
+        "HOUR('2024-01-01 12:00:00%')",
+        "HOUR('2024-01-01 12:00:00^')",
+        "HOUR('2024-01-01 12:00:00&')",
+        "HOUR('2024-01-01 12:00:00*')",
+        "HOUR('2024-01-01 12:00:00(')",
+        "HOUR('2024-01-01 12:00:00)')",
+        "HOUR('2024-01-01 12:00:00-')",
+        "HOUR('2024-01-01 12:00:00_')",
+        "HOUR('2024-01-01 12:00:00=')",
+        "HOUR('2024-01-01 12:00:00[')",
+        "HOUR('2024-01-01 12:00:00]')",
+        "HOUR('2024-01-01 12:00:00{')",
+        "HOUR('2024-01-01 12:00:00}')",
+        "HOUR('2024-01-01 12:00:00|')",
+        "HOUR('2024-01-01 12:00:00;')",
+        "HOUR('2024-01-01 12:00:00:')",
+        "HOUR('2024-01-01 12:00:00:')",
+        "HOUR('2024-01-01 12:00:00\\'')",
+        "HOUR('2024-01-01 12:00:00<')",
+        "HOUR('2024-01-01 12:00:00>')",
+        "HOUR('2024-01-01 12:00:00,')",
+        "HOUR('2024-01-01 12:00:00.')",
+        "HOUR('2024-01-01 12:00:00?')",
+        "HOUR('2024-01-01 12:00:00/')",
+    ]
+
+    for (def val : [true, false]) {
+        sql "set debug_skip_fold_constant = ${val}"
+
+        for (def s : wrong_date_strs) {
+            test {
+                sql "SELECT ${s}"
+                result([[null]])
+            }
+        }
+
+        for (def s : hour_strs) {
+            test {
+                sql "SELECT ${s}"
+                result([[12]])
+            }
+        }
+
+        test {
+            sql "select cast('123.123' as date)"
+            result([[Date.valueOf('2012-03-12')]])
+        }
+
+        test {
+            sql "select DATE('2023年01月01日')"
+            result([[Date.valueOf('2023-01-01')]])
+        }
+
+        test {
+            sql "select DATEV2('2023年01月01日')"
+            result([[Date.valueOf('2023-01-01')]])
+        }
+
+        test {
+            sql "select QUARTER('2023年01月01日')"
+            result([[1]])
+        }
+
+        test {
+            sql "select YEAR('2023年01月01日')"
+            result([[2023]])
+        }
+
+        test {
+            sql "select to_monday('1970-01-04')"
+            result([[Date.valueOf('1970-01-01')]])
+        }
+
+        test {
+            sql "select cast('123.123' as datetime)"
+            result([[LocalDateTime.parse('2012-03-12T03:00:00')]])
+        }
+
+        test {
+            sql "select cast('123.123.123' as datetime)"
+            result([[LocalDateTime.parse('2012-03-12T03:12:03')]])
+        }
+
+        test {
+            sql "SELECT DATEADD(DAY, 1, '2025年06月20日')"
+            result([[LocalDateTime.parse('2025-06-21T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28 16:00:00 UTC', INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-03-01T16:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28 16:00:00 America/New_York', 
INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-03-01T16:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28 16:00:00UTC', INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-03-02T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28 16:00:00America/New_York', 
INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-03-02T05:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28 UTC', INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-03-01T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28 America/New_York', INTERVAL 1 
DAY)"
+            result([[LocalDateTime.parse('2023-03-01T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28UTC', INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-03-01T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28America/New_York', INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-03-01T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28 UTC', INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-03-01T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-02-28 America/New_York', INTERVAL 1 
DAY)"
+            result([[LocalDateTime.parse('2023-03-01T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2024-02-29 UTC', INTERVAL 6 DAY)"
+            result([[LocalDateTime.parse('2024-03-06T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2020-02-29 America/New_York', INTERVAL -3 
DAY)"
+            result([[LocalDateTime.parse('2020-02-26T00:00:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-03-12 01:30:00 Europe/London', INTERVAL 
1 DAY)"
+            result([[LocalDateTime.parse('2023-03-13T01:30:00')]])
+        }
+
+        test {
+            sql "select date_add('2023-11-05 01:30:00 America/New_York', 
INTERVAL 1 DAY)"
+            result([[LocalDateTime.parse('2023-11-06T01:30:00')]])
+        }
+
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to