You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/02/12 12:21:29 UTC
[iotdb] branch rel/0.12 updated: [To rel/0.12][IOTDB-2534]add character support while using double quote (#5041)
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 <38...@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();
+ }
}