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

jiangtian 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 481a79d3c14 Fix that failure of one row in relational InsertRows will 
fail other rows (#14912)
481a79d3c14 is described below

commit 481a79d3c143ae162ac0efb00e6c55425796d70b
Author: Jiang Tian <[email protected]>
AuthorDate: Fri Feb 21 15:13:08 2025 +0800

    Fix that failure of one row in relational InsertRows will fail other rows 
(#14912)
    
    * Fix that failure of one row in relational InsertRows will fail other rows
    
    * fix it
    
    * spotless
---
 .../it/session/IoTDBSessionRelationalIT.java       | 30 ++++++++++++++++++
 .../iotdb/session/it/IoTDBSessionSimpleIT.java     | 36 ++++++++++++++++++++++
 .../plan/node/write/RelationalInsertRowNode.java   |  3 --
 .../plan/relational/sql/parser/AstBuilder.java     |  3 +-
 4 files changed, 67 insertions(+), 5 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java
index b79411292f2..942d8ee2a70 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/relational/it/session/IoTDBSessionRelationalIT.java
@@ -365,6 +365,36 @@ public class IoTDBSessionRelationalIT {
             "616: Unknown column category for m2. Cannot auto create column.", 
e.getMessage());
       }
 
+      session.executeNonQueryStatement("CREATE TABLE partial_insert (s1 
boolean)");
+      try {
+        session.executeNonQueryStatement(
+            "insert into partial_insert(time, s1) values 
(10000,true),(20000,false),(35000,-1.5),(30000,-1),(40000,0),(50000,1),(60000,1.5),(70000,'string'),(80000,'1989-06-15'),(90000,638323200000)");
+        fail("Exception expected");
+      } catch (StatementExecutionException e) {
+        assertEquals(
+            "507: Fail to insert measurements [s1] caused by [The BOOLEAN 
should be true/TRUE, false/FALSE or 0/1]",
+            e.getMessage());
+      }
+
+      SessionDataSet dataSet =
+          session.executeQueryStatement("select * from partial_insert order by 
time");
+      long[] timestamps =
+          new long[] {10000, 20000, 30000, 35000, 40000, 50000, 60000, 70000, 
80000, 90000};
+      Boolean[] values =
+          new Boolean[] {true, false, null, null, false, true, null, null, 
null, null, null};
+      int cnt = 0;
+      while (dataSet.hasNext()) {
+        RowRecord rec = dataSet.next();
+        assertEquals(timestamps[cnt], rec.getFields().get(0).getLongV());
+        if (values[cnt] != null) {
+          assertEquals(values[cnt], rec.getFields().get(1).getBoolV());
+        } else {
+          assertNull(rec.getFields().get(1).getDataType());
+        }
+        cnt++;
+      }
+      assertEquals(10, cnt);
+
     } finally {
       try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
         session.executeNonQueryStatement(
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java
index 095ca266081..e5bcbb169a4 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionSimpleIT.java
@@ -1784,6 +1784,42 @@ public class IoTDBSessionSimpleIT {
     }
   }
 
+  @Test
+  @Category({LocalStandaloneIT.class, ClusterIT.class})
+  public void insertPartialSQLTest() throws IoTDBConnectionException, 
StatementExecutionException {
+    try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
+      session.createAlignedTimeseries(
+          "root.partial_insert.d1",
+          Collections.singletonList("s1"),
+          Collections.singletonList(TSDataType.BOOLEAN),
+          Collections.singletonList(TSEncoding.PLAIN),
+          Collections.singletonList(CompressionType.UNCOMPRESSED),
+          null);
+      try {
+        session.executeNonQueryStatement(
+            "insert into root.partial_insert.d1(time, s1) values 
(10000,true),(20000,false),(35000,-1.5),(30000,-1),(40000,0),(50000,1),(60000,1.5),(70000,'string'),(80000,'1989-06-15'),(90000,638323200000)");
+        fail("Exception expected");
+      } catch (StatementExecutionException e) {
+        assertEquals(
+            "507: Fail to insert measurements [s1] caused by [The BOOLEAN 
should be true/TRUE, false/FALSE or 0/1]",
+            e.getMessage());
+      }
+
+      SessionDataSet dataSet =
+          session.executeQueryStatement("select * from 
root.partial_insert.d1");
+      long[] timestamps = new long[] {10000, 20000, 40000, 50000};
+      Boolean[] values = new Boolean[] {true, false, false, true};
+      int cnt = 0;
+      while (dataSet.hasNext()) {
+        RowRecord rec = dataSet.next();
+        assertEquals(timestamps[cnt], rec.getTimestamp());
+        assertEquals(values[cnt], rec.getFields().get(0).getBoolV());
+        cnt++;
+      }
+      assertEquals(4, cnt);
+    }
+  }
+
   @Test
   @Category({LocalStandaloneIT.class, ClusterIT.class})
   public void insertBinaryAsTextTest() {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
index d3bdea90fcc..7fe3450555f 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/write/RelationalInsertRowNode.java
@@ -249,9 +249,6 @@ public class RelationalInsertRowNode extends InsertRowNode {
 
   @Override
   public boolean allMeasurementFailed() {
-    if (measurements != null && measurements.length > 0) {
-      return failedMeasurementNumber >= measurements.length;
-    }
     return false;
   }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
index ecc21d0c7ee..bdf32b0b9d7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java
@@ -570,8 +570,6 @@ public class AstBuilder extends 
RelationalSqlBaseVisitor<Node> {
       columnNames.remove(timeColumnIndex);
     }
 
-    String[] columnNameArray = columnNames.toArray(new String[0]);
-
     List<Expression> rows = queryBody.getRows();
     if (timeColumnIndex == -1 && rows.size() > 1) {
       throw new SemanticException("need timestamps when insert multi rows");
@@ -589,6 +587,7 @@ public class AstBuilder extends 
RelationalSqlBaseVisitor<Node> {
                   } else {
                     throw new SemanticException("unexpected expression: " + r);
                   }
+                  String[] columnNameArray = columnNames.toArray(new 
String[0]);
                   return toInsertRowStatement(
                       expressions, finalTimeColumnIndex, columnNameArray, 
tableName, databaseName);
                 })

Reply via email to