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