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

qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 19872aaf9a [IOTDB-1239]Incorrect datetime value can be inserted into 
iotdb successfully (#5832)
19872aaf9a is described below

commit 19872aaf9a178dcf5661c8b10f4eb752fced86ac
Author: Haonan <[email protected]>
AuthorDate: Tue May 10 13:39:47 2022 +0800

    [IOTDB-1239]Incorrect datetime value can be inserted into iotdb 
successfully (#5832)
---
 .../db/integration/IoTDBDatetimeFormatIT.java      | 18 +++++++++++++
 .../apache/iotdb/db/qp/utils/DatetimeUtils.java    | 10 +++----
 .../main/java/org/apache/iotdb/rpc/RpcUtils.java   | 31 +++++++++++++++-------
 3 files changed, 45 insertions(+), 14 deletions(-)

diff --git 
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBDatetimeFormatIT.java
 
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBDatetimeFormatIT.java
index aa97f90309..4e556eebda 100644
--- 
a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBDatetimeFormatIT.java
+++ 
b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBDatetimeFormatIT.java
@@ -109,4 +109,22 @@ public class IoTDBDatetimeFormatIT {
       fail();
     }
   }
+
+  @Test
+  public void testBigDateTime() {
+    try (IoTDBConnection connection = (IoTDBConnection) 
EnvFactory.getEnv().getConnection();
+        Statement statement = connection.createStatement()) {
+      statement.setFetchSize(5);
+      statement.execute("SET STORAGE GROUP TO root.sg");
+
+      statement.execute("CREATE TIMESERIES root.sg.d1.s2 WITH DATATYPE=DOUBLE, 
ENCODING=PLAIN;");
+
+      statement.execute("insert into root.sg.d1(time,s2) values 
(1618283005586000, 8.76);");
+      statement.execute("select * from root.sg.d1;");
+      statement.execute("select * from root.sg.d1 where 
time=53251-05-07T17:06:26.000+08:00");
+    } catch (SQLException e) {
+      e.printStackTrace();
+      fail();
+    }
+  }
 }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/utils/DatetimeUtils.java 
b/server/src/main/java/org/apache/iotdb/db/qp/utils/DatetimeUtils.java
index 6624fdd3c9..9a1dd4fc64 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/utils/DatetimeUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/utils/DatetimeUtils.java
@@ -48,7 +48,7 @@ public class DatetimeUtils {
   static {
     ISO_LOCAL_DATE_WIDTH_1_2 =
         new DateTimeFormatterBuilder()
-            .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
+            .appendValue(ChronoField.YEAR, 4, 19, SignStyle.NEVER)
             .appendLiteral('-')
             .appendValue(ChronoField.MONTH_OF_YEAR, 1, 2, SignStyle.NEVER)
             .appendLiteral('-')
@@ -62,7 +62,7 @@ public class DatetimeUtils {
   static {
     ISO_LOCAL_DATE_WITH_SLASH =
         new DateTimeFormatterBuilder()
-            .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
+            .appendValue(ChronoField.YEAR, 4, 19, SignStyle.NEVER)
             .appendLiteral('/')
             .appendValue(ChronoField.MONTH_OF_YEAR, 1, 2, SignStyle.NEVER)
             .appendLiteral('/')
@@ -76,7 +76,7 @@ public class DatetimeUtils {
   static {
     ISO_LOCAL_DATE_WITH_DOT =
         new DateTimeFormatterBuilder()
-            .appendValue(ChronoField.YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
+            .appendValue(ChronoField.YEAR, 4, 19, SignStyle.NEVER)
             .appendLiteral('.')
             .appendValue(ChronoField.MONTH_OF_YEAR, 1, 2, SignStyle.NEVER)
             .appendLiteral('.')
@@ -463,11 +463,11 @@ public class DatetimeUtils {
       if ("us".equals(timestampPrecision)) {
         if (instant.getEpochSecond() < 0 && instant.getNano() > 0) {
           // adjustment can reduce the loss of the division
-          long millis = Math.multiplyExact(instant.getEpochSecond() + 1, 
1000_000);
+          long millis = Math.multiplyExact(instant.getEpochSecond() + 1, 
1000_000L);
           long adjustment = instant.getNano() / 1000 - 1L;
           return Math.addExact(millis, adjustment);
         } else {
-          long millis = Math.multiplyExact(instant.getEpochSecond(), 1000_000);
+          long millis = Math.multiplyExact(instant.getEpochSecond(), 
1000_000L);
           return Math.addExact(millis, instant.getNano() / 1000);
         }
       } else if ("ns".equals(timestampPrecision)) {
diff --git a/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java 
b/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
index 437b724d4f..573fc7765d 100644
--- a/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
+++ b/service-rpc/src/main/java/org/apache/iotdb/rpc/RpcUtils.java
@@ -263,14 +263,27 @@ public class RpcUtils {
     }
   }
 
+  public static String formatDatetimeStr(String datetime, StringBuilder 
digits) {
+    if (datetime.contains("+")) {
+      String timeZoneStr = datetime.substring(datetime.length() - 6);
+      return datetime.substring(0, datetime.length() - 6) + "." + digits + 
timeZoneStr;
+    } else if (datetime.contains("Z")) {
+      String timeZoneStr = datetime.substring(datetime.length() - 1);
+      return datetime.substring(0, datetime.length() - 1) + "." + digits + 
timeZoneStr;
+    } else {
+      String timeZoneStr = "";
+      return datetime + "." + digits + timeZoneStr;
+    }
+  }
+
   @SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity 
warning
   public static String parseLongToDateWithPrecision(
       DateTimeFormatter formatter, long timestamp, ZoneId zoneid, String 
timestampPrecision) {
     if ("ms".equals(timestampPrecision)) {
-      long integerofDate = timestamp / 1000;
+      long integerOfDate = timestamp / 1000;
       StringBuilder digits = new StringBuilder(Long.toString(timestamp % 
1000));
       ZonedDateTime dateTime =
-          ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerofDate), 
zoneid);
+          ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerOfDate), 
zoneid);
       String datetime = dateTime.format(formatter);
       int length = digits.length();
       if (length != 3) {
@@ -278,12 +291,12 @@ public class RpcUtils {
           digits.insert(0, "0");
         }
       }
-      return datetime.substring(0, 19) + "." + digits + datetime.substring(19);
+      return formatDatetimeStr(datetime, digits);
     } else if ("us".equals(timestampPrecision)) {
-      long integerofDate = timestamp / 1000_000;
+      long integerOfDate = timestamp / 1000_000;
       StringBuilder digits = new StringBuilder(Long.toString(timestamp % 
1000_000));
       ZonedDateTime dateTime =
-          ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerofDate), 
zoneid);
+          ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerOfDate), 
zoneid);
       String datetime = dateTime.format(formatter);
       int length = digits.length();
       if (length != 6) {
@@ -291,12 +304,12 @@ public class RpcUtils {
           digits.insert(0, "0");
         }
       }
-      return datetime.substring(0, 19) + "." + digits + datetime.substring(19);
+      return formatDatetimeStr(datetime, digits);
     } else {
-      long integerofDate = timestamp / 1000_000_000L;
+      long integerOfDate = timestamp / 1000_000_000L;
       StringBuilder digits = new StringBuilder(Long.toString(timestamp % 
1000_000_000L));
       ZonedDateTime dateTime =
-          ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerofDate), 
zoneid);
+          ZonedDateTime.ofInstant(Instant.ofEpochSecond(integerOfDate), 
zoneid);
       String datetime = dateTime.format(formatter);
       int length = digits.length();
       if (length != 9) {
@@ -304,7 +317,7 @@ public class RpcUtils {
           digits.insert(0, "0");
         }
       }
-      return datetime.substring(0, 19) + "." + digits + datetime.substring(19);
+      return formatDatetimeStr(datetime, digits);
     }
   }
 }

Reply via email to