From 320016a72b61835902cde3fcef780247930884a0 Mon Sep 17 00:00:00 2001 From: HTHou Date: Thu, 20 Feb 2025 18:37:21 +0800 Subject: [PATCH 1/2] Reject inserting invalid timestamp string --- .../org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java | 14 ++++++++++++++ .../org/apache/iotdb/db/utils/DateTimeUtils.java | 4 +++- .../apache/iotdb/db/utils/DateTimeUtilsTest.java | 14 ++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java index 22189f0d3bbc4..dfc6a83cbbce0 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBSimpleQueryIT.java @@ -1194,6 +1194,8 @@ public void testIllegalDateType() { statement.execute("CREATE DATABASE root.sg1"); statement.execute( "CREATE TIMESERIES root.sg1.d1.s4 WITH DATATYPE=DATE, ENCODING=PLAIN, COMPRESSOR=SNAPPY"); + statement.execute( + "CREATE TIMESERIES root.sg1.d1.s5 WITH DATATYPE=TIMESTAMP, ENCODING=PLAIN, COMPRESSOR=SNAPPY"); try { statement.execute("insert into root.sg1.d1(timestamp, s4) values(1, '2022-04-31')"); fail(); @@ -1205,6 +1207,18 @@ public void testIllegalDateType() { + "Please use YYYY-MM-DD format.]", e.getMessage()); } + try { + statement.execute( + "insert into root.sg1.d1(timestamp, s5) values(1999-04-31T00:00:00.000+08:00, 1999-04-31T00:00:00.000+08:00)"); + fail(); + } catch (Exception e) { + assertEquals( + TSStatusCode.SEMANTIC_ERROR.getStatusCode() + + ": Input time format 1999-04-31T00:00:00.000+08:00 error. " + + "Input like yyyy-MM-dd HH:mm:ss, yyyy-MM-ddTHH:mm:ss " + + "or refer to user document for more info.", + e.getMessage()); + } } catch (SQLException e) { fail(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java index 0f968c2ed2e5c..a49f37f8a0601 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java @@ -44,6 +44,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; import java.time.format.DateTimeParseException; +import java.time.format.ResolverStyle; import java.time.format.SignStyle; import java.time.temporal.ChronoField; import java.util.Calendar; @@ -507,7 +508,8 @@ public static long correctPrecision(long millis) { /** such as '2011.12.03 10:15:30+01:00' or '2011.12.03 10:15:30.123456789+01:00'. */ .appendOptional(ISO_OFFSET_DATE_TIME_WITH_DOT_WITH_SPACE_NS) - .toFormatter(); + .toFormatter() + .withResolverStyle(ResolverStyle.STRICT); public static long convertTimestampOrDatetimeStrToLongWithDefaultZone(String timeStr) { try { diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/DateTimeUtilsTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/DateTimeUtilsTest.java index 6f14ad040aa9f..d0bbb97fbae85 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/DateTimeUtilsTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/utils/DateTimeUtilsTest.java @@ -33,6 +33,7 @@ import java.util.TimeZone; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; public class DateTimeUtilsTest { @@ -78,6 +79,19 @@ public void convertDatetimeStrToLongTest3() { testConvertDateStrToLong(zoneOffset, zoneId, timestamp1 + delta); } + @Test + public void convertDatetimeStrToLongTest4() { + zoneOffset = ZoneOffset.UTC; + try { + DateTimeUtils.convertDatetimeStrToLong("1999-02-29T00:00:00.000", zoneOffset, 0, "ms"); + fail(); + } catch (Exception e) { + assertEquals( + "Text '1999-02-29T00:00:00.000+00:00' could not be parsed: Invalid date 'February 29' as '1999' is not a leap year", + e.getMessage()); + } + } + /** Test time precision is ms. */ @Test public void convertDurationStrToLongTest1() { From 132575b276096ef283bbd5a405c6dd4f2f48ac2a Mon Sep 17 00:00:00 2001 From: HTHou Date: Fri, 21 Feb 2025 09:35:36 +0800 Subject: [PATCH 2/2] fix subscription IT --- .../it/triple/regression/param/IoTDBTestParamTopicIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/subscription/it/triple/regression/param/IoTDBTestParamTopicIT.java b/integration-test/src/test/java/org/apache/iotdb/subscription/it/triple/regression/param/IoTDBTestParamTopicIT.java index 31e5562a61a86..6a2c295d2c0ce 100644 --- a/integration-test/src/test/java/org/apache/iotdb/subscription/it/triple/regression/param/IoTDBTestParamTopicIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/subscription/it/triple/regression/param/IoTDBTestParamTopicIT.java @@ -184,7 +184,7 @@ public void testCreateTopic_invalidTime5() printTopics("testCreateTopic_invalidTime5"); } - @Test + @Test(expected = StatementExecutionException.class) public void testCreateTopic_invalidTime6() throws IoTDBConnectionException, StatementExecutionException,