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