This is an automated email from the ASF dual-hosted git repository.

geniuspig pushed a commit to branch support_special_characters
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit b48d2dc18ffa7ac086aefe5f621f1ac649b2e82a
Author: zhutianci <[email protected]>
AuthorDate: Sat May 23 22:44:59 2020 +0800

    support special characters
---
 .../org/apache/iotdb/db/qp/strategy/SqlBase.g4     | 17 ++++++-----
 .../iotdb/db/qp/strategy/LogicalGenerator.java     | 10 +++----
 .../db/integration/IoTDBLoadExternalTsfileIT.java  | 34 +++++++++++-----------
 .../org/apache/iotdb/session/IoTDBSessionIT.java   | 27 ++++++++++++++++-
 4 files changed, 58 insertions(+), 30 deletions(-)

diff --git a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4 
b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
index 4c56b68..191c341 100644
--- a/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
+++ b/server/src/main/antlr4/org/apache/iotdb/db/qp/strategy/SqlBase.g4
@@ -76,9 +76,9 @@ statement
     | COUNT TIMESERIES prefixPath? (GROUP BY LEVEL OPERATOR_EQ INT)? 
#countTimeseries
     | COUNT NODES prefixPath LEVEL OPERATOR_EQ INT #countNodes
     | LOAD CONFIGURATION #loadConfigurationStatement
-    | LOAD FILE autoCreateSchema? #loadFiles
-    | REMOVE FILE #removeFile
-    | MOVE FILE FILE #moveFile
+    | LOAD STRING_LITERAL autoCreateSchema? #loadFiles
+    | REMOVE STRING_LITERAL #removeFile
+    | MOVE STRING_LITERAL STRING_LITERAL #moveFile
     | SELECT INDEX func=ID //not support yet
     LR_BRACKET
     p1=fullPath COMMA p2=fullPath COMMA n1=timeValue COMMA n2=timeValue COMMA
@@ -915,16 +915,19 @@ DATETIME
 /** Allow unicode rule/token names */
 ID : NAME_CHAR NAME_CHAR*;
 
-FILE
-    :  (('a'..'z'| 'A'..'Z')(':')?)* (('\\' | '/')+ PATH_FRAGMENT) +
-    ;
-
 fragment
 NAME_CHAR
     :   'A'..'Z'
     |   'a'..'z'
     |   '0'..'9'
+    |   '-'
     |   '_'
+    |   '/'
+    |   '@'
+    |   '#'
+    |   '$'
+    |   '%'
+    |   '&'
     |   CN_CHAR
     ;
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java 
b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
index c84c654..bf496d2 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/strategy/LogicalGenerator.java
@@ -176,11 +176,11 @@ public class LogicalGenerator extends SqlBaseBaseListener 
{
       } else {
         int sgLevel = acsc.INT() == null ? 
IoTDBDescriptor.getInstance().getConfig()
             .getDefaultStorageGroupLevel() : 
Integer.parseInt(acsc.INT().getText());
-        initializedOperator = new LoadFilesOperator(new 
File(ctx.FILE().getText()), Boolean
+        initializedOperator = new LoadFilesOperator(new 
File(removeStringQuote(ctx.STRING_LITERAL().getText())), Boolean
             .parseBoolean(acsc.ID().getText()), sgLevel);
       }
     } else {
-      initializedOperator = new LoadFilesOperator(new 
File(ctx.getChild(1).getText()), true,
+      initializedOperator = new LoadFilesOperator(new 
File(removeStringQuote(ctx.STRING_LITERAL().getText())), true,
           
IoTDBDescriptor.getInstance().getConfig().getDefaultStorageGroupLevel());
     }
   }
@@ -188,14 +188,14 @@ public class LogicalGenerator extends SqlBaseBaseListener 
{
   @Override
   public void enterMoveFile(MoveFileContext ctx) {
     super.enterMoveFile(ctx);
-    initializedOperator = new MoveFileOperator(new File(ctx.FILE(0).getText()),
-        new File(ctx.FILE(1).getText()));
+    initializedOperator = new MoveFileOperator(new 
File(removeStringQuote(ctx.STRING_LITERAL(0).getText())),
+        new File(removeStringQuote(ctx.STRING_LITERAL(1).getText())));
   }
 
   @Override
   public void enterRemoveFile(RemoveFileContext ctx) {
     super.enterRemoveFile(ctx);
-    initializedOperator = new RemoveFileOperator(new 
File(ctx.FILE().getText()));
+    initializedOperator = new RemoveFileOperator(new 
File(removeStringQuote(ctx.STRING_LITERAL().getText())));
   }
 
   @Override
diff --git 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBLoadExternalTsfileIT.java
 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBLoadExternalTsfileIT.java
index dff350c..ac0bbd6 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBLoadExternalTsfileIT.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBLoadExternalTsfileIT.java
@@ -140,7 +140,7 @@ public class IoTDBLoadExternalTsfileIT {
         tmpDir.mkdirs();
       }
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
       assertEquals(0, StorageEngine.getInstance().getProcessor("root.vehicle")
           .getSequenceFileTreeSet().size());
@@ -158,7 +158,7 @@ public class IoTDBLoadExternalTsfileIT {
         tmpDir.mkdirs();
       }
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
       assertEquals(0, StorageEngine.getInstance().getProcessor("root.test")
           .getSequenceFileTreeSet().size());
@@ -186,7 +186,7 @@ public class IoTDBLoadExternalTsfileIT {
         tmpDir.mkdirs();
       }
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
 
       // move root.test
@@ -199,13 +199,13 @@ public class IoTDBLoadExternalTsfileIT {
         tmpDir.mkdirs();
       }
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
 
       // load all tsfile in tmp dir
       tmpDir = new 
File(resources.get(0).getFile().getParentFile().getParentFile().getParentFile(),
           "tmp");
-      statement.execute(String.format("load %s", tmpDir.getAbsolutePath()));
+      statement.execute(String.format("load \"%s\"", 
tmpDir.getAbsolutePath()));
       resources = new ArrayList<>(
           StorageEngine.getInstance().getProcessor("root.vehicle")
               .getSequenceFileTreeSet());
@@ -289,13 +289,13 @@ public class IoTDBLoadExternalTsfileIT {
         tmpDir.mkdirs();
       }
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
       resources = new ArrayList<>(
           
StorageEngine.getInstance().getProcessor("root.vehicle").getUnSequenceFileList());
       assertEquals(1, resources.size());
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
 
       // move root.test
@@ -307,18 +307,18 @@ public class IoTDBLoadExternalTsfileIT {
         tmpDir.mkdirs();
       }
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
       resources = new ArrayList<>(
           
StorageEngine.getInstance().getProcessor("root.test").getUnSequenceFileList());
       assertEquals(2, resources.size());
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
 
       // load all tsfile in tmp dir
       tmpDir = tmpDir.getParentFile().getParentFile();
-      statement.execute(String.format("load %s", tmpDir.getAbsolutePath()));
+      statement.execute(String.format("load \"%s\"", 
tmpDir.getAbsolutePath()));
       assertEquals(2, StorageEngine.getInstance().getProcessor("root.vehicle")
           .getSequenceFileTreeSet().size());
       assertEquals(1, StorageEngine.getInstance().getProcessor("root.vehicle")
@@ -370,7 +370,7 @@ public class IoTDBLoadExternalTsfileIT {
         tmpDir.mkdirs();
       }
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
 
       // move root.test
@@ -383,7 +383,7 @@ public class IoTDBLoadExternalTsfileIT {
         tmpDir.mkdirs();
       }
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("move %s %s", resource.getPath(), 
tmpDir));
+        statement.execute(String.format("move \"%s\" \"%s\"", 
resource.getPath(), tmpDir));
       }
 
       boolean hasResultSet = statement.execute("SHOW timeseries");
@@ -408,7 +408,7 @@ public class IoTDBLoadExternalTsfileIT {
       // test wrong statement
       boolean hasError = false;
       try {
-        statement.execute(String.format("load %s true1 1", 
tmpDir.getAbsolutePath()));
+        statement.execute(String.format("load \"%s\" true1 1", 
tmpDir.getAbsolutePath()));
       } catch (Exception e) {
         hasError = true;
         Assert.assertEquals(
@@ -420,7 +420,7 @@ public class IoTDBLoadExternalTsfileIT {
       // test not load metadata automatically, it will occur errors.
       hasError = false;
       try {
-        statement.execute(String.format("load %s false 1", 
tmpDir.getAbsolutePath()));
+        statement.execute(String.format("load \"%s\" false 1", 
tmpDir.getAbsolutePath()));
       } catch (Exception e) {
         hasError = true;
       }
@@ -428,7 +428,7 @@ public class IoTDBLoadExternalTsfileIT {
 
       // test load metadata automatically, it will succeed.
       tmpDir = tmpDir.getParentFile().getParentFile();
-      statement.execute(String.format("load %s true 1", 
tmpDir.getAbsolutePath()));
+      statement.execute(String.format("load \"%s\" true 1", 
tmpDir.getAbsolutePath()));
       resources = new ArrayList<>(
           StorageEngine.getInstance().getProcessor("root.vehicle")
               .getSequenceFileTreeSet());
@@ -457,7 +457,7 @@ public class IoTDBLoadExternalTsfileIT {
               .getSequenceFileTreeSet());
       assertEquals(1, resources.size());
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("remove %s", resource.getPath()));
+        statement.execute(String.format("remove \"%s\"", resource.getPath()));
       }
       assertEquals(0, StorageEngine.getInstance().getProcessor("root.vehicle")
           .getSequenceFileTreeSet().size());
@@ -467,7 +467,7 @@ public class IoTDBLoadExternalTsfileIT {
               .getSequenceFileTreeSet());
       assertEquals(2, resources.size());
       for (TsFileResource resource : resources) {
-        statement.execute(String.format("remove %s", resource.getPath()));
+        statement.execute(String.format("remove \"%s\"", resource.getPath()));
       }
       assertEquals(0, StorageEngine.getInstance().getProcessor("root.test")
           .getSequenceFileTreeSet().size());
diff --git a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java 
b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
index cbfe569..4d05e25 100644
--- a/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
+++ b/session/src/test/java/org/apache/iotdb/session/IoTDBSessionIT.java
@@ -994,4 +994,29 @@ public class IoTDBSessionIT {
     }
   }
 
-}
+  @Test
+  public void testSpecialCharacters()
+      throws StatementExecutionException, IoTDBConnectionException, 
ClassNotFoundException {
+    Class.forName(Config.JDBC_DRIVER_NAME);
+    session = new Session("127.0.0.1", 6667, "root", "root");
+    session.open();
+    session.executeNonQueryStatement("set storage group to root./@#$%&-");
+    try (Connection connection = DriverManager
+        .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", 
"root");
+        Statement statement = connection.createStatement()) {
+      ResultSet resultSet = statement.executeQuery("show storage group");
+      final ResultSetMetaData metaData = resultSet.getMetaData();
+      final int colCount = metaData.getColumnCount();
+      String resultStr = "";
+      while(resultSet.next()) {
+        for(int i = 1; i <= colCount; i++) {
+          resultStr = resultSet.getString(i);
+        }
+      }
+      assertEquals("root./@#$%&-", resultStr);
+    } catch (SQLException e) {
+      Assert.fail(e.getMessage());
+    }
+  }
+
+  }

Reply via email to