You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2021/07/21 03:51:29 UTC
[iotdb] 02/02: selectIntoDifferentDevices
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 <ro...@apache.org>
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());
+ }
+ }
}