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

morrysnow 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 cd26713c262 [fix](Nereids) could not parse date/datetime with blank + 
zone (#41394) (#41620)
cd26713c262 is described below

commit cd26713c26233cef378d4ce5b862ac8d5e9803f6
Author: morrySnow <[email protected]>
AuthorDate: Thu Oct 10 14:03:41 2024 +0800

    [fix](Nereids) could not parse date/datetime with blank + zone (#41394) 
(#41620)
    
    pick from master #41394
    
    for example:
    2008-08-08 20:08:08 +08:00 parse failed because the blank before +08:00
---
 .../trees/expressions/literal/DateLiteral.java     | 12 +++++++---
 .../trees/expressions/literal/DateLiteralTest.java |  6 +++++
 .../nereids/util/DateTimeFormatterUtilsTest.java   | 26 ++++++++++++++++++++++
 3 files changed, 41 insertions(+), 3 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 4b990ff09b3..e74e3f42387 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
@@ -220,7 +220,11 @@ public class DateLiteral extends Literal {
                     while (i < s.length() && (isPunctuation(s.charAt(i)) || 
s.charAt(i) == ' ' || s.charAt(i) == 'T')) {
                         i += 1;
                     }
-                    sb.append(' ');
+                    // avoid add blank before zone-id, for example 2008-08-08 
+08:00
+                    // should be normalized to 2008-08-08+08:00
+                    if (i >= s.length() || Character.isDigit(s.charAt(i))) {
+                        sb.append(' ');
+                    }
                 } else if (partNumber > 3 && isPunctuation(c)) {
                     sb.append(':');
                 } else {
@@ -240,18 +244,20 @@ public class DateLiteral extends Literal {
 
         // parse MicroSecond
         // Keep up to 7 digits at most, 7th digit is use for overflow.
+        int j = i;
         if (partNumber == 6 && i < s.length() && s.charAt(i) == '.') {
             sb.append(s.charAt(i));
             i += 1;
             while (i < s.length() && Character.isDigit(s.charAt(i))) {
-                if (i - 19 <= 7) {
+                if (i - j <= 7) {
                     sb.append(s.charAt(i));
                 }
                 i += 1;
             }
         }
 
-        sb.append(s.substring(i));
+        // trim use to remove any blank before zone id or zone offset
+        sb.append(s.substring(i).trim());
 
         return sb.toString();
     }
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 3430676b14d..7c8ad5ed0e6 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
@@ -47,6 +47,12 @@ class DateLiteralTest {
         Assertions.assertEquals("2021-05-01 00:00:00", s);
         s = DateLiteral.normalize("2021-5-01 0:0:0.001");
         Assertions.assertEquals("2021-05-01 00:00:00.001", s);
+        s = DateLiteral.normalize("2021-5-01 0:0:0.12345678");
+        Assertions.assertEquals("2021-05-01 00:00:00.1234567", s);
+        s = DateLiteral.normalize("2021-5-1    Asia/Shanghai");
+        Assertions.assertEquals("2021-05-01Asia/Shanghai", s);
+        s = DateLiteral.normalize("2021-5-1 0:0:0.12345678   Asia/Shanghai");
+        Assertions.assertEquals("2021-05-01 00:00:00.1234567Asia/Shanghai", s);
     }
 
     @Test
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/DateTimeFormatterUtilsTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/DateTimeFormatterUtilsTest.java
index 8437fdb0092..541ad9c28c7 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/DateTimeFormatterUtilsTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/DateTimeFormatterUtilsTest.java
@@ -111,4 +111,30 @@ class DateTimeFormatterUtilsTest {
         Assertions.assertThrows(DateTimeParseException.class, () -> 
timeFormatter.parse("01:01"));
         Assertions.assertThrows(DateTimeParseException.class, () -> 
timeFormatter.parse("01"));
     }
+
+    @Test
+    void testZoneDateFormatter() {
+        DateTimeFormatter formatter = 
DateTimeFormatterUtils.ZONE_DATE_FORMATTER;
+        TemporalAccessor date = formatter.parse("2020-02-19Asia/Shanghai");
+        assertDatePart(date);
+        date = formatter.parse("2020-02-19UTC+08:00");
+        assertDatePart(date);
+        date = formatter.parse("2020-02-19+08:00");
+        assertDatePart(date);
+        Assertions.assertThrows(DateTimeParseException.class, () -> 
formatter.parse("2020-02-19 Asia/Shanghai"));
+        Assertions.assertThrows(DateTimeParseException.class, () -> 
formatter.parse("2020-02-19++08:00"));
+    }
+
+    @Test
+    void testZoneDateTimeFormatter() {
+        DateTimeFormatter formatter = 
DateTimeFormatterUtils.ZONE_DATE_TIME_FORMATTER;
+        TemporalAccessor dateTime = formatter.parse("2020-02-19 
00:00:00Asia/Shanghai");
+        assertDatePart(dateTime);
+        dateTime = formatter.parse("2020-02-19 00:00:00UTC+08:00");
+        assertDatePart(dateTime);
+        dateTime = formatter.parse("2020-02-19 00:00:00+08:00");
+        assertDatePart(dateTime);
+        Assertions.assertThrows(DateTimeParseException.class, () -> 
formatter.parse("2020-02-19 00:00:00 Asia/Shanghai"));
+        Assertions.assertThrows(DateTimeParseException.class, () -> 
formatter.parse("2020-02-19 00:00:00++08:00"));
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to