This is an automated email from the ASF dual-hosted git repository. rong pushed a commit to branch select-into in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 4abd936a8cdc52fc3df516b1a471c55c5890827d Author: Steve Yurong Su <[email protected]> AuthorDate: Wed Jul 21 11:50:46 2021 +0800 selectIntoDifferentDevices --- .../antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 | 2 +- .../selectinto/InsertTabletPlanGenerator.java | 17 ++++++++++++ .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 10 +++++--- .../iotdb/db/integration/IoTDBSelectIntoIT.java | 30 ++++++++++++++++++++++ 4 files changed, 55 insertions(+), 4 deletions(-) diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 index 54acf2b..852674c 100644 --- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 +++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4 @@ -140,7 +140,7 @@ intoClause intoPath : fullPath - | nodeNameWithoutStar + | nodeNameWithoutStar (DOT nodeNameWithoutStar)* ; alias diff --git a/server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlanGenerator.java b/server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlanGenerator.java index ceaf070..122f948 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlanGenerator.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlanGenerator.java @@ -130,6 +130,23 @@ public class InsertTabletPlanGenerator { List<Field> fields = rowRecord.getFields(); for (int i = 0; i < dataTypes.length; ++i) { + // if the data type is already set + if (dataTypes[i] != null) { + continue; + } + + // get the field index of the row record + int intoMeasurementIndex = intoMeasurementIndexes.get(i); + // if the field is not null + if (fields.get(intoMeasurementIndex) != null + && fields.get(intoMeasurementIndex).getDataType() != null) { + // set the data type to the field type + dataTypes[i] = fields.get(intoMeasurementIndex).getDataType(); + initializedDataTypeIndexes.add(i); + } + } + + for (int i = 0; i < dataTypes.length; ++i) { if (dataTypes[i] == null && fields.get(i) != null && fields.get(i).getDataType() != null) { dataTypes[i] = fields.get(i).getDataType(); initializedDataTypeIndexes.add(i); diff --git a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java index 2278f97..8b50ab8 100644 --- a/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java @@ -1155,13 +1155,17 @@ public class IoTDBSqlVisitor extends SqlBaseBaseVisitor<Operator> { } } } else if (intoPathContext.nodeNameWithoutStar() != null) { - String[] intoPathNodes = new String[levelLimitOfSourcePrefixPath + 2]; + List<NodeNameWithoutStarContext> nodeNameWithoutStars = intoPathContext.nodeNameWithoutStar(); + String[] intoPathNodes = + new String[1 + levelLimitOfSourcePrefixPath + nodeNameWithoutStars.size()]; + intoPathNodes[0] = "root"; for (int i = 1; i <= levelLimitOfSourcePrefixPath; ++i) { intoPathNodes[i] = "${" + i + "}"; } - intoPathNodes[levelLimitOfSourcePrefixPath + 1] = - intoPathContext.nodeNameWithoutStar().getText(); + for (int i = 1; i <= nodeNameWithoutStars.size(); ++i) { + intoPathNodes[levelLimitOfSourcePrefixPath + i] = nodeNameWithoutStars.get(i - 1).getText(); + } intoPath = new PartialPath(intoPathNodes); } diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java index 3d3c26f..9d307d5 100644 --- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java +++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java @@ -148,4 +148,34 @@ public class IoTDBSelectIntoIT { fail(throwable.getMessage()); } } + + @Test + public void selectIntoDifferentDevices() { + try (Statement statement = + DriverManager.getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root") + .createStatement()) { + statement.execute( + "select s1, s2, s3, s4, s5, s6 into s1.${2}, s2.${2}, s3.${2}, s4.${2}, s5.${2}, s6.${2} from root.sg.d1"); + + ResultSet resultSet = + statement.executeQuery("select s1.d1, s2.d1, s3.d1, s4.d1, s5.d1, s6.d1 from root.sg.d1"); + + int columnCount = resultSet.getMetaData().getColumnCount(); + assertEquals(1 + 6, columnCount); + + for (int i = 0; i < INSERTION_SQLS.length; ++i) { + resultSet.next(); + StringBuilder stringBuilder = new StringBuilder(); + for (int j = 0; j < 6 + 1; ++j) { + stringBuilder.append(resultSet.getString(j + 1)).append(','); + } + System.out.println(stringBuilder.toString()); + } + + assertFalse(resultSet.next()); + } catch (SQLException throwable) { + throwable.printStackTrace(); + fail(throwable.getMessage()); + } + } }
