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);
}
}
}