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/02/24 06:41:48 UTC

[iotdb] 01/01: [IOTDB-2600] Ban inserting duplicated columns in one row

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

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

commit 367f9644e0f292d70387a64fc59c19268f474fc0
Author: HTHou <hh...@outlook.com>
AuthorDate: Thu Feb 24 14:40:44 2022 +0800

    [IOTDB-2600] Ban inserting duplicated columns in one row
---
 .../java/org/apache/iotdb/db/integration/IOTDBInsertIT.java   | 11 +++++++++++
 .../db/integration/aligned/IOTDBInsertAlignedValuesIT.java    | 11 +++++++++++
 .../java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java |  9 +++++++++
 3 files changed, 31 insertions(+)

diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IOTDBInsertIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IOTDBInsertIT.java
index a9e327a..d3a5f39 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IOTDBInsertIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IOTDBInsertIT.java
@@ -154,4 +154,15 @@ public class IOTDBInsertIT {
     Statement st1 = connection.createStatement();
     st1.execute("insert into root.t1.wf01.wt01(status, temperature) values(true, 20.1, false)");
   }
+
+  @Test
+  public void testInsertWithDuplicatedMeasurements() {
+    try (Statement st1 = connection.createStatement()) {
+      st1.execute(
+          "insert into root.t1.wf01.wt01(time, s3, status, status) values(100, true, 20.1, 20.2)");
+      Assert.fail();
+    } catch (SQLException e) {
+      Assert.assertEquals("411: Insertion contains duplicated measurement: status", e.getMessage());
+    }
+  }
 }
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IOTDBInsertAlignedValuesIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IOTDBInsertAlignedValuesIT.java
index 32137dd..d8b3363 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IOTDBInsertAlignedValuesIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/aligned/IOTDBInsertAlignedValuesIT.java
@@ -358,4 +358,15 @@ public class IOTDBInsertAlignedValuesIT {
     Assert.assertEquals(true, rs.getBoolean(2));
     st1.close();
   }
+
+  @Test
+  public void testInsertWithDuplicatedMeasurements() {
+    try (Statement st1 = connection.createStatement()) {
+      st1.execute(
+          "insert into root.t1.wf01.wt01(time, s3, status, status) aligned values(100, true, 20.1, 20.2)");
+      Assert.fail();
+    } catch (SQLException e) {
+      Assert.assertEquals("411: Insertion contains duplicated measurement: status", e.getMessage());
+    }
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
index df71f87..21ef5b3 100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/crud/InsertPlan.java
@@ -29,7 +29,9 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 public abstract class InsertPlan extends PhysicalPlan {
 
@@ -197,11 +199,18 @@ public abstract class InsertPlan extends PhysicalPlan {
     if (measurements == null) {
       throw new QueryProcessException("Measurements are null");
     }
+    Set<String> deduplicatedMeasurements = new HashSet<>();
     for (String measurement : measurements) {
       if (measurement == null || measurement.isEmpty()) {
         throw new QueryProcessException(
             "Measurement contains null or empty string: " + Arrays.toString(measurements));
       }
+      if (deduplicatedMeasurements.contains(measurement)) {
+        throw new QueryProcessException(
+            "Insertion contains duplicated measurement: " + measurement);
+      } else {
+        deduplicatedMeasurements.add(measurement);
+      }
     }
   }