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

hui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new c77c70b249 [IOTDB-3375] Fix NPE when inserting multi-rows by SQL 
(#6148)
c77c70b249 is described below

commit c77c70b249e86899edfb5d1c3c973c9798595756
Author: Mrquan <[email protected]>
AuthorDate: Thu Jun 2 14:33:54 2022 +0800

    [IOTDB-3375] Fix NPE when inserting multi-rows by SQL (#6148)
---
 .../planner/plan/node/write/InsertRowsNode.java    |  2 +-
 .../plan/node/write/InsertRowsOfOneDeviceNode.java | 29 +++++++++++++---------
 .../thrift/impl/DataNodeTSIServiceImpl.java        |  3 ++-
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsNode.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsNode.java
index 033b343541..b130ccc09d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsNode.java
@@ -184,7 +184,7 @@ public class InsertRowsNode extends InsertNode implements 
BatchInsertNode {
   public List<TSDataType[]> getDataTypesList() {
     List<TSDataType[]> dataTypesList = new ArrayList<>();
     for (InsertRowNode insertRowNode : insertRowNodeList) {
-      dataTypesList.add(insertRowNode.dataTypes);
+      dataTypesList.add(insertRowNode.getDataTypes());
     }
     return dataTypesList;
   }
diff --git 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
index bc31abf10b..df87d6ac9d 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowsOfOneDeviceNode.java
@@ -120,18 +120,7 @@ public class InsertRowsOfOneDeviceNode extends InsertNode 
implements BatchInsert
 
     devicePath = insertRowNodeList.get(0).getDevicePath();
     isAligned = insertRowNodeList.get(0).isAligned;
-    Map<String, TSDataType> measurementsAndDataType = new HashMap<>();
-    for (InsertRowNode insertRowNode : insertRowNodeList) {
-      List<String> measurements = 
Arrays.asList(insertRowNode.getMeasurements());
-      Map<String, TSDataType> subMap =
-          measurements.stream()
-              .collect(
-                  Collectors.toMap(
-                      key -> key, key -> 
insertRowNode.dataTypes[measurements.indexOf(key)]));
-      measurementsAndDataType.putAll(subMap);
-    }
-    measurements = measurementsAndDataType.keySet().toArray(new String[0]);
-    dataTypes = measurementsAndDataType.values().toArray(new TSDataType[0]);
+    storeMeasurementsAndDataType();
   }
 
   @Override
@@ -164,6 +153,7 @@ public class InsertRowsOfOneDeviceNode extends InsertNode 
implements BatchInsert
         return false;
       }
     }
+    storeMeasurementsAndDataType();
     return true;
   }
 
@@ -201,6 +191,21 @@ public class InsertRowsOfOneDeviceNode extends InsertNode 
implements BatchInsert
     return result;
   }
 
+  private void storeMeasurementsAndDataType() {
+    Map<String, TSDataType> measurementsAndDataType = new HashMap<>();
+    for (InsertRowNode insertRowNode : insertRowNodeList) {
+      List<String> measurements = 
Arrays.asList(insertRowNode.getMeasurements());
+      Map<String, TSDataType> subMap =
+          measurements.stream()
+              .collect(
+                  Collectors.toMap(
+                      key -> key, key -> 
insertRowNode.getDataTypes()[measurements.indexOf(key)]));
+      measurementsAndDataType.putAll(subMap);
+    }
+    measurements = measurementsAndDataType.keySet().toArray(new String[0]);
+    dataTypes = measurementsAndDataType.values().toArray(new TSDataType[0]);
+  }
+
   public static InsertRowsOfOneDeviceNode deserialize(ByteBuffer byteBuffer) {
     PartialPath devicePath;
     PlanNodeId planNodeId;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeTSIServiceImpl.java
 
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeTSIServiceImpl.java
index 8be78d1641..942c55ac53 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeTSIServiceImpl.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/DataNodeTSIServiceImpl.java
@@ -556,7 +556,8 @@ public class DataNodeTSIServiceImpl implements 
TSIEventHandler {
               PARTITION_FETCHER,
               SCHEMA_FETCHER);
 
-      if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
+      if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
+          && result.status.code != 
TSStatusCode.NEED_REDIRECTION.getStatusCode()) {
         throw new RuntimeException("error code: " + result.status);
       }
 

Reply via email to