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