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 9c68af9 [IOTDB-2600] Ban inserting duplicated columns in one row
(#5111)
9c68af9 is described below
commit 9c68af97e302d39cfbf7b005f47740da04529136
Author: Haonan <[email protected]>
AuthorDate: Thu Feb 24 16:06:55 2022 +0800
[IOTDB-2600] Ban inserting duplicated columns in one row (#5111)
---
.../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);
+ }
}
}