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

commit 80c80b67196010fc1caa970d2c4cc5382f12c3de
Author: jakevin <jakevin...@gmail.com>
AuthorDate: Wed Mar 6 21:54:49 2024 +0800

    [enhancement](Nereids): support more condition Date/DateTime Literal 
(#31858)
---
 .../trees/expressions/literal/DateLiteral.java     | 46 ++++++++++------------
 .../expressions/literal/DateTimeLiteralTest.java   |  7 ++++
 2 files changed, 28 insertions(+), 25 deletions(-)

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 c0c1b18488f..7dcd86a1504 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
@@ -163,11 +163,10 @@ public class DateLiteral extends Literal {
         StringBuilder sb = new StringBuilder();
 
         int i = 0;
+        // date and time contains 6 number part at most, so we just need 
normal 6 number part
+        int partNumber = 0;
 
         // handle two digit year
-        if (!isPunctuation(s.charAt(2)) && !isPunctuation(s.charAt(4))) {
-            throw new AnalysisException("date/datetime literal [" + s + "] is 
invalid");
-        }
         if (isPunctuation(s.charAt(2))) {
             String yy = s.substring(0, 2);
             int year = Integer.parseInt(yy);
@@ -178,11 +177,10 @@ public class DateLiteral extends Literal {
             }
             sb.append(yy);
             i = 2;
+            partNumber += 1;
         }
 
         // normalize leading 0 for date and time
-        // date and time contains 6 number part at most, so we just need 
normal 6 number part
-        int partNumber = 0;
         while (i < s.length() && partNumber < 6) {
             char c = s.charAt(i);
             if (Character.isDigit(c)) {
@@ -193,39 +191,37 @@ public class DateLiteral extends Literal {
                 }
                 int len = j - i;
                 if (len == 4 || len == 2) {
-                    for (int k = i; k < j; k++) {
-                        sb.append(s.charAt(k));
-                    }
+                    sb.append(s, i, j);
                 } else if (len == 1) {
-                    sb.append('0').append(c);
+                    if (partNumber == 0) {
+                        sb.append("000").append(c);
+                    } else {
+                        sb.append('0').append(c);
+                    }
                 } else {
                     throw new AnalysisException("date/datetime literal [" + s 
+ "] is invalid");
                 }
                 i = j;
                 partNumber += 1;
             } else if (isPunctuation(c) || c == ' ' || c == 'T') {
-                sb.append(c);
                 i += 1;
+                if (partNumber < 3 && isPunctuation(c)) {
+                    sb.append('-');
+                } else if (partNumber == 3) {
+                    while (i < s.length() && (isPunctuation(s.charAt(i)) || 
s.charAt(i) == ' ' || s.charAt(i) == 'T')) {
+                        i += 1;
+                    }
+                    sb.append(' ');
+                } else if (partNumber > 3 && isPunctuation(c)) {
+                    sb.append(':');
+                } else {
+                    throw new AnalysisException("date/datetime literal [" + s 
+ "] is invalid");
+                }
             } else {
                 break;
             }
         }
 
-        // replace punctuation with '-'
-        replacePunctuation(s, sb, '-', 4);
-        replacePunctuation(s, sb, '-', 7);
-        // Replace punctuation with ' '
-        if (sb.length() > 10 && sb.charAt(10) != ' ') {
-            if (sb.charAt(10) == 'T') {
-                sb.setCharAt(10, ' ');
-            } else {
-                replacePunctuation(s, sb, ' ', 10);
-            }
-        }
-        // replace punctuation with ':'
-        replacePunctuation(s, sb, ':', 13);
-        replacePunctuation(s, sb, ':', 16);
-
         // add missing Minute Second in Time part
         if (sb.length() == 13) {
             sb.append(":00:00");
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteralTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteralTest.java
index ecae8f85d5e..8555d44d634 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteralTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/literal/DateTimeLiteralTest.java
@@ -33,6 +33,13 @@ class DateTimeLiteralTest {
         // });
     }
 
+    @Test
+    void mysqlStrangeCase() {
+        new DateTimeV2Literal("0-08-01 13:21:03");
+        new DateTimeV2Literal("0001-01-01: 00:01:01.001");
+        new DateTimeV2Literal("2021?01?01 00.00.00");
+    }
+
     @Test
     void testBasic() {
         Consumer<DateTimeV2Literal> assertFunc = (datetime) -> {


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

Reply via email to