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

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

commit 425ba7301ecaa18bfdab82e4d547e690ace05e45
Author: jakevin <[email protected]>
AuthorDate: Tue Sep 12 10:17:56 2023 +0800

    [fix](Nereids): datetime - offset is wrong & support Two-Digital date 
(#24201)
    
    - bug: datetime - offset is wrong
    - support Two-Digital date
    - remove useless override code
    
    (cherry picked from commit 484215e1ccc45fcc7137897712f35715930abcd8)
---
 .../trees/expressions/literal/DateTimeLiteral.java  | 19 -------------------
 .../doris/nereids/util/DateTimeFormatterUtils.java  |  8 ++++----
 .../nereids/util/DateTimeFormatterUtilsTest.java    | 21 +++++++++++++++++++++
 3 files changed, 25 insertions(+), 23 deletions(-)

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 3be28c2513b..90d6ef4f9b7 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
@@ -32,7 +32,6 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.time.LocalDateTime;
-import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
 import java.time.format.ResolverStyle;
@@ -129,24 +128,16 @@ public class DateTimeLiteral extends DateLiteral {
     protected void init(String s) throws AnalysisException {
         try {
             TemporalAccessor dateTime = null;
-            int offset = 0;
             // parse timezone
             if (haveTimeZoneOffset(s) || haveTimeZoneName(s)) {
-                String tzString = new String();
                 if (haveTimeZoneName(s)) { // GMT, UTC+8, Z[, CN, 
Asia/Shanghai]
                     int split = getTimeZoneSplitPos(s);
                     Preconditions.checkArgument(split > 0);
-                    tzString = s.substring(split);
                     s = s.substring(0, split);
                 } else { // +04:30
                     Preconditions.checkArgument(s.charAt(s.length() - 6) == 
'-' || s.charAt(s.length() - 6) == '+');
-                    tzString = s.substring(s.length() - 6);
                     s = s.substring(0, s.length() - 6);
                 }
-                ZoneId zone = ZoneId.of(tzString);
-                ZoneId dorisZone = DateUtils.getTimeZone();
-                offset = 
dorisZone.getRules().getOffset(java.time.Instant.now()).getTotalSeconds()
-                        - 
zone.getRules().getOffset(java.time.Instant.now()).getTotalSeconds();
             }
             if (!s.contains("-") && !s.contains(":")) {
                 dateTime = 
DateTimeFormatterUtils.BASIC_DATE_TIME_FORMATTER.parse(s);
@@ -220,16 +211,6 @@ public class DateTimeLiteral extends DateLiteral {
             second = DateUtils.getOrDefault(dateTime, 
ChronoField.SECOND_OF_MINUTE);
             microSecond = DateUtils.getOrDefault(dateTime, 
ChronoField.MICRO_OF_SECOND);
 
-            if (offset != 0) {
-                DateTimeLiteral result = (DateTimeLiteral) 
this.plusSeconds(offset);
-                this.second = result.second;
-                this.minute = result.minute;
-                this.hour = result.hour;
-                this.day = result.day;
-                this.month = result.month;
-                this.year = result.year;
-            }
-
         } catch (Exception ex) {
             throw new AnalysisException("datetime literal [" + s + "] is 
invalid");
         }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateTimeFormatterUtils.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateTimeFormatterUtils.java
index 244d672229f..1925e100aca 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateTimeFormatterUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/DateTimeFormatterUtils.java
@@ -41,12 +41,12 @@ import java.time.temporal.ChronoField;
 public class DateTimeFormatterUtils {
     // Date: %Y-%m-%d
     public static DateTimeFormatter DATE_FORMATTER = new 
DateTimeFormatterBuilder()
-            .appendOptional(new 
DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4).toFormatter())
-            .appendOptional(new 
DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 2).toFormatter())
+            .appendOptional(
+                    new 
DateTimeFormatterBuilder().appendValue(ChronoField.YEAR, 4).toFormatter())
+            .appendOptional(
+                    new 
DateTimeFormatterBuilder().appendValueReduced(ChronoField.YEAR, 2, 2, 
1970).toFormatter())
             .appendLiteral('-').appendValue(ChronoField.MONTH_OF_YEAR, 2)
             .appendLiteral('-').appendValue(ChronoField.DAY_OF_MONTH, 2)
-            // if year isn't present, use -1 as default, so that it can be 
rejected by check
-            .parseDefaulting(ChronoField.YEAR, -1)
             .toFormatter().withResolverStyle(ResolverStyle.STRICT);
     // Date without delimiter: %Y%m%d
     public static DateTimeFormatter BASIC_DATE_FORMATTER = new 
DateTimeFormatterBuilder()
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 3e7ba62fc96..c40f5c4a85f 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
@@ -58,4 +58,25 @@ class DateTimeFormatterUtilsTest {
         Assertions.assertThrows(DateTimeParseException.class, () -> 
formatter.parse("20200219T010101."));
         Assertions.assertThrows(DateTimeParseException.class, () -> 
formatter.parse("20200219T010101.0000001"));
     }
+
+    @Test
+    void testTwoDigitalDate() {
+        DateTimeFormatter formatter = DateTimeFormatterUtils.DATE_FORMATTER;
+        // Year values in the range 00-69 become 2000-2069.
+        // Year values in the range 70-99 become 1970-199
+        for (int i = 0; i < 100; i++) {
+            String str;
+            if (i < 10) {
+                str = "0" + i + "-02-19";
+            } else {
+                str = i + "-02-19";
+            }
+            TemporalAccessor dateTime = formatter.parse(str);
+            if (i < 70) {
+                Assertions.assertEquals(2000 + i, 
dateTime.get(ChronoField.YEAR));
+            } else {
+                Assertions.assertEquals(1900 + i, 
dateTime.get(ChronoField.YEAR));
+            }
+        }
+    }
 }


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

Reply via email to