This is an automated email from the ASF dual-hosted git repository. haonan pushed a commit to branch rel/0.12 in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/rel/0.12 by this push: new 4a8f712 [To rel/0.12][IOTDB-2534]add character support while using double quote (#5041) 4a8f712 is described below commit 4a8f7122869e507627180ef478ebab3afc619dfc Author: Marcos_Zyk <38524330+marcos...@users.noreply.github.com> AuthorDate: Sat Feb 12 20:20:49 2022 +0800 [To rel/0.12][IOTDB-2534]add character support while using double quote (#5041) * add character support while using double quote * add IT --- .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 2 +- .../db/integration/IoTDBCreateTimeseriesIT.java | 85 ++++++++++++++++++++++ .../iotdb/db/metadata/MManagerBasicTest.java | 4 + .../apache/iotdb/session/IoTDBSessionSimpleIT.java | 41 +++++++++++ 4 files changed, 131 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java index f766ad2..2d70367 100644 --- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java +++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java @@ -54,7 +54,7 @@ public class IoTDBConfig { // e.g., a31+/$%#&[]{}3e4 private static final String ID_MATCHER = - "([a-zA-Z0-9/\"[ ],:@#$%&{}()*=?!~\\[\\]\\-+\\u2E80-\\u9FFF_]+)"; + "([a-zA-Z0-9/\"[ ],:@#$%&{}()*=?!~\\[\\]\\-+\\u2E80-\\u9FFF_]+|(\".+\"))"; private static final String STORAGE_GROUP_MATCHER = "([a-zA-Z0-9_.\\-\\u2E80-\\u9FFF]+)"; diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBCreateTimeseriesIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBCreateTimeseriesIT.java index 5b8a68a..fff3a6e 100644 --- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBCreateTimeseriesIT.java +++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBCreateTimeseriesIT.java @@ -40,6 +40,8 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +import static org.junit.Assert.fail; + /** * Notice that, all test begins with "IoTDB" is integration test. All test which will start the * IoTDB server should be defined as integration test. @@ -158,4 +160,87 @@ public class IoTDBCreateTimeseriesIT { } Assert.assertTrue(resultList.contains(storageGroup)); } + + @Test + public void testCreateTimeseriesWithSpecialCharacter() throws Exception { + try { + statement.execute( + String.format( + "create timeseries %s with datatype=INT64, encoding=PLAIN, compression=SNAPPY", + "root.sg.d.a\".\"b")); + fail(); + } catch (SQLException e) { + Assert.assertEquals( + "401: Error occurred while parsing SQL to physical plan: line 1:29 mismatched input '\".\"' expecting {WITH, '('}", + e.getMessage()); + } + + try { + statement.execute( + String.format( + "create timeseries %s with datatype=INT64, encoding=PLAIN, compression=SNAPPY", + "root.sg.d.a“(Φ)”b")); + fail(); + } catch (SQLException e) { + Assert.assertEquals( + "401: Error occurred while parsing SQL to physical plan: line 1:29 token recognition error at: '“'", + e.getMessage()); + } + + try { + statement.execute( + String.format( + "create timeseries %s with datatype=INT64, encoding=PLAIN, compression=SNAPPY", + "root.sg.d.a>b")); + fail(); + } catch (SQLException e) { + Assert.assertEquals( + "401: Error occurred while parsing SQL to physical plan: line 1:29 mismatched input '>' expecting {WITH, '('}", + e.getMessage()); + } + + String[] timeSeriesArray = {"root.sg.d.\"a.b\"", "root.sg.d.\"a“(Φ)”b\"", "root.sg.d.\"a>b\""}; + + for (String timeSeries : timeSeriesArray) { + statement.execute( + String.format( + "create timeseries %s with datatype=INT64, encoding=PLAIN, compression=SNAPPY", + timeSeries)); + } + + // ensure that current timeseries in cache is right. + createTimeSeriesWithSpecialCharacterTool(timeSeriesArray); + + statement.close(); + connection.close(); + EnvironmentUtils.stopDaemon(); + setUp(); + + // ensure timeseries in cache is right after recovered. + createTimeSeriesWithSpecialCharacterTool(timeSeriesArray); + } + + private void createTimeSeriesWithSpecialCharacterTool(String[] timeSeriesArray) + throws SQLException { + boolean hasResult = statement.execute("show timeseries"); + Assert.assertTrue(hasResult); + + List<String> resultList = new ArrayList<>(); + try (ResultSet resultSet = statement.getResultSet()) { + while (resultSet.next()) { + String timeseries = resultSet.getString("timeseries"); + resultList.add(timeseries); + } + } + Assert.assertEquals(3, resultList.size()); + + List<String> collect = + resultList.stream() + .sorted(Comparator.comparingInt(e -> e.split("\\.").length)) + .collect(Collectors.toList()); + + for (String timeseries : timeSeriesArray) { + Assert.assertTrue(collect.contains(timeseries)); + } + } } diff --git a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java index f607b45..0d215f6 100644 --- a/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java +++ b/server/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java @@ -1277,6 +1277,10 @@ public class MManagerBasicTest { manager.getSeriesSchemasAndReadLockDevice(insertPlan); assertTrue(manager.isPathExist(deviceId.concatNode("\"a.b\""))); + insertPlan = getInsertPlan("\"a“(Φ)”b\""); + manager.getSeriesSchemasAndReadLockDevice(insertPlan); + assertTrue(manager.isPathExist(deviceId.concatNode("\"a“(Φ)”b\""))); + String[] illegalMeasurementIds = {"a.b", "time", "timestamp", "TIME", "TIMESTAMP", "a\".\"c"}; for (String measurementId : illegalMeasurementIds) { insertPlan = getInsertPlan(measurementId); diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java index a458a89..41d084b 100644 --- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java +++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionSimpleIT.java @@ -56,6 +56,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; public class IoTDBSessionSimpleIT { @@ -681,4 +682,44 @@ public class IoTDBSessionSimpleIT { Assert.assertNull(record.getFields().get(i).getDataType()); } } + + @Test + public void testInsertWithIllegalMeasurementId() throws Exception { + session = new Session("127.0.0.1", 6667, "root", "root"); + session.open(); + + String deviceId = "root.sg1.d1"; + List<String> measurements = new ArrayList<>(); + measurements.add("a.b"); + measurements.add("a\".\"b"); + measurements.add("a“(Φ)”b"); + measurements.add("a>b"); + + List<String> values = new ArrayList<>(); + values.add("1"); + values.add("1.2"); + values.add("true"); + values.add("dad"); + try { + session.insertRecord(deviceId, 1L, measurements, values); + fail(); + } catch (Exception ignored) { + + } + + SessionDataSet dataSet = session.executeQueryStatement("show timeseries root"); + Assert.assertFalse(dataSet.hasNext()); + + measurements.clear(); + measurements.add("\"a.b\""); + measurements.add("\"a“(Φ)”b\""); + measurements.add("\"a>b\""); + values.remove(0); + session.insertRecord(deviceId, 1L, measurements, values); + Assert.assertTrue(session.checkTimeseriesExists("root.sg1.d1.\"a.b\"")); + Assert.assertTrue(session.checkTimeseriesExists("root.sg1.d1.\"a“(Φ)”b\"")); + Assert.assertTrue(session.checkTimeseriesExists("root.sg1.d1.\"a>b\"")); + + session.close(); + } }