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