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

qiaojialin 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 c7b5eeb8cf [IOTDB-3814] Fix insert rows by sql with wrong data type 
NPE (#6859)
c7b5eeb8cf is described below

commit c7b5eeb8cf66db33f38de5483d9268cc8f999a2a
Author: Haonan <[email protected]>
AuthorDate: Tue Aug 2 14:25:12 2022 +0800

    [IOTDB-3814] Fix insert rows by sql with wrong data type NPE (#6859)
---
 .../iotdb/db/it/aligned/IoTDBInsertAlignedValuesIT.java    | 12 ++++++++++++
 .../apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java   | 14 ++++++++------
 .../planner/plan/node/write/InsertMultiTabletsNode.java    |  3 +++
 .../db/mpp/plan/planner/plan/node/write/InsertRowNode.java | 14 +++++++-------
 .../mpp/plan/planner/plan/node/write/InsertRowsNode.java   |  3 +++
 .../planner/plan/node/write/InsertRowsOfOneDeviceNode.java |  3 +++
 6 files changed, 36 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..475f5ae274 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,16 @@ 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("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;

Reply via email to