You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2022/08/02 03:14:24 UTC
[iotdb] 01/01: [IOTDB-3814] Fix insert rows by sql with wrong data type NPE
This is an automated email from the ASF dual-hosted git repository.
haonan pushed a commit to branch IOTDB-3814
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 79110fc5347c6be64b83da8f148bd7d773f0f8ad
Author: HTHou <hh...@outlook.com>
AuthorDate: Tue Aug 2 11:14:04 2022 +0800
[IOTDB-3814] Fix insert rows by sql with wrong data type NPE
---
.../iotdb/db/it/aligned/IoTDBInsertAlignedValuesIT.java | 16 ++++++++++++++++
.../apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 14 ++++++++------
.../planner/plan/node/write/InsertMultiTabletsNode.java | 3 +++
.../mpp/plan/planner/plan/node/write/InsertRowNode.java | 14 +++++++-------
.../mpp/plan/planner/plan/node/write/InsertRowsNode.java | 3 +++
.../plan/node/write/InsertRowsOfOneDeviceNode.java | 3 +++
6 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBInsertAlignedValuesIT.java b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBInsertAlignedValuesIT.java
index e80e406145..9d67c0dd41 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBInsertAlignedValuesIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/aligned/IoTDBInsertAlignedValuesIT.java
@@ -292,4 +292,20 @@ public class IoTDBInsertAlignedValuesIT {
e.getMessage().contains("Insertion contains duplicated measurement: status"));
}
}
+
+ @Test
+ public void testInsertMultiRows() {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute(
+ "insert into root.sg1.d1(time, s1, s2) aligned values(10, 2, 2), (11, 3, '3'), (12,12.11,false);");
+ fail();
+ } catch (SQLException e) {
+ assertTrue(
+ e.getMessage(),
+ e.getMessage()
+ .contains(
+ "failed to insert measurements [s2] caused by data type is not consistent"));
+ }
+ }
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index bd7d2176ac..026820f0ad 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -862,15 +862,15 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
insertStatement.semanticCheck();
long[] timeArray = insertStatement.getTimes();
PartialPath devicePath = insertStatement.getDevice();
- String[] measurements = insertStatement.getMeasurementList();
+ String[] measurementList = insertStatement.getMeasurementList();
if (timeArray.length == 1) {
// construct insert row statement
InsertRowStatement insertRowStatement = new InsertRowStatement();
insertRowStatement.setDevicePath(devicePath);
insertRowStatement.setTime(timeArray[0]);
- insertRowStatement.setMeasurements(measurements);
- insertRowStatement.setDataTypes(new TSDataType[insertStatement.getMeasurementList().length]);
- Object[] values = new Object[insertStatement.getMeasurementList().length];
+ insertRowStatement.setMeasurements(measurementList);
+ insertRowStatement.setDataTypes(new TSDataType[measurementList.length]);
+ Object[] values = new Object[measurementList.length];
System.arraycopy(insertStatement.getValuesList().get(0), 0, values, 0, values.length);
insertRowStatement.setValues(values);
insertRowStatement.setNeedInferType(true);
@@ -884,10 +884,12 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext>
for (int i = 0; i < timeArray.length; i++) {
InsertRowStatement statement = new InsertRowStatement();
statement.setDevicePath(devicePath);
+ String[] measurements = new String[measurementList.length];
+ System.arraycopy(measurementList, 0, measurements, 0, measurements.length);
statement.setMeasurements(measurements);
statement.setTime(timeArray[i]);
- statement.setDataTypes(new TSDataType[insertStatement.getMeasurementList().length]);
- Object[] values = new Object[insertStatement.getMeasurementList().length];
+ statement.setDataTypes(new TSDataType[measurementList.length]);
+ Object[] values = new Object[measurementList.length];
System.arraycopy(insertStatement.getValuesList().get(i), 0, values, 0, values.length);
statement.setValues(values);
statement.setAligned(insertStatement.isAligned());
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertMultiTabletsNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertMultiTabletsNode.java
index e20ab334be..6104d9d9c7 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertMultiTabletsNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertMultiTabletsNode.java
@@ -141,6 +141,9 @@ public class InsertMultiTabletsNode extends InsertNode implements BatchInsertNod
if (!insertTabletNode.validateAndSetSchema(schemaTree)) {
return false;
}
+ if (!this.hasFailedMeasurements() && insertTabletNode.hasFailedMeasurements()) {
+ this.failedMeasurementIndex2Info = insertTabletNode.failedMeasurementIndex2Info;
+ }
}
return true;
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
index 9b3fb86922..22ee2b1b0a 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertRowNode.java
@@ -179,10 +179,13 @@ public class InsertRowNode extends InsertNode implements WALEntryValue {
deviceSchemaInfo.getMeasurementSchemaList().toArray(new MeasurementSchema[0]);
// transfer data types from string values when necessary
- try {
- transferType();
- } catch (QueryProcessException e) {
- return false;
+ if (isNeedInferType) {
+ try {
+ transferType();
+ return true;
+ } catch (QueryProcessException e) {
+ return false;
+ }
}
// validate whether data types are matched
@@ -195,9 +198,6 @@ public class InsertRowNode extends InsertNode implements WALEntryValue {
*/
@SuppressWarnings("squid:S3776") // Suppress high Cognitive Complexity warning
private void transferType() throws QueryProcessException {
- if (!isNeedInferType) {
- return;
- }
for (int i = 0; i < measurementSchemas.length; i++) {
// null when time series doesn't exist
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 89c6b6df13..ec8326bdf6 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
@@ -125,6 +125,9 @@ public class InsertRowsNode extends InsertNode implements BatchInsertNode {
if (!insertRowNode.validateAndSetSchema(schemaTree)) {
return false;
}
+ if (!this.hasFailedMeasurements() && insertRowNode.hasFailedMeasurements()) {
+ this.failedMeasurementIndex2Info = insertRowNode.failedMeasurementIndex2Info;
+ }
}
return true;
}
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 7435dbbad4..e711cc65fb 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
@@ -148,6 +148,9 @@ public class InsertRowsOfOneDeviceNode extends InsertNode implements BatchInsert
if (!insertRowNode.validateAndSetSchema(schemaTree)) {
return false;
}
+ if (!this.hasFailedMeasurements() && insertRowNode.hasFailedMeasurements()) {
+ this.failedMeasurementIndex2Info = insertRowNode.failedMeasurementIndex2Info;
+ }
}
storeMeasurementsAndDataType();
return true;