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