This is an automated email from the ASF dual-hosted git repository. hui pushed a commit to branch lmh/addErrorMsg in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 90068d6c43aaf2348384f7f1e1a6cf9f87e74cde Author: Minghui Liu <[email protected]> AuthorDate: Wed Jun 15 18:21:27 2022 +0800 add semanticCheck() for InsertStatement --- .../db/it/aligned/IoTDBInsertAlignedValuesIT.java | 18 +++++++++++--- .../apache/iotdb/db/mpp/plan/analyze/Analyzer.java | 2 +- .../mpp/plan/statement/crud/InsertStatement.java | 29 ++++++++++++++++++++++ 3 files changed, 44 insertions(+), 5 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 dc121304d3..2a1e1462f6 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 @@ -222,21 +222,31 @@ public class IoTDBInsertAlignedValuesIT { } } - @Test(expected = Exception.class) + @Test public void testInsertWithWrongMeasurementNum1() throws SQLException { try (Connection connection = EnvFactory.getEnv().getConnection(); Statement statement = connection.createStatement()) { statement.execute( "insert into root.t1.wf01.wt01(time, status, temperature) aligned values(11000, 100)"); + fail(); + } catch (SQLException e) { + assertEquals( + "the measurementList's size 2 is not consistent with the valueList's size 1", + e.getMessage()); } } - @Test(expected = Exception.class) - public void testInsertWithWrongMeasurementNum2() throws SQLException { + @Test + public void testInsertWithWrongMeasurementNum2() { try (Connection connection = EnvFactory.getEnv().getConnection(); Statement statement = connection.createStatement()) { statement.execute( "insert into root.t1.wf01.wt01(time, status, temperature) aligned values(11000, 100, 300, 400)"); + fail(); + } catch (SQLException e) { + assertEquals( + "the measurementList's size 2 is not consistent with the valueList's size 3", + e.getMessage()); } } @@ -273,7 +283,7 @@ public class IoTDBInsertAlignedValuesIT { "insert into root.t1.wf01.wt01(time, s3, status, status) aligned values(100, true, 20.1, 20.2)"); fail(); } catch (SQLException e) { - assertEquals("411: Insertion contains duplicated measurement: status", e.getMessage()); + assertEquals("Insertion contains duplicated measurement: status", e.getMessage()); } } } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java index 834ee25932..9cf383cd8a 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/Analyzer.java @@ -880,7 +880,7 @@ public class Analyzer { @Override public Analysis visitInsert(InsertStatement insertStatement, MPPQueryContext context) { context.setQueryType(QueryType.WRITE); - + insertStatement.semanticCheck(); long[] timeArray = insertStatement.getTimes(); PartialPath devicePath = insertStatement.getDevice(); String[] measurements = insertStatement.getMeasurementList(); diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertStatement.java index 0f4efab632..464e5ff7c2 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertStatement.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertStatement.java @@ -20,12 +20,16 @@ package org.apache.iotdb.db.mpp.plan.statement.crud; import org.apache.iotdb.commons.path.PartialPath; +import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.mpp.plan.constant.StatementType; import org.apache.iotdb.db.mpp.plan.statement.Statement; import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** this class extends {@code Statement} and process insert statement. */ public class InsertStatement extends Statement { @@ -98,4 +102,29 @@ public class InsertStatement extends Statement { public <R, C> R accept(StatementVisitor<R, C> visitor, C context) { return visitor.visitInsert(this, context); } + + public void semanticCheck() { + Set<String> deduplicatedMeasurements = new HashSet<>(); + for (String measurement : measurementList) { + if (measurement == null || measurement.isEmpty()) { + throw new SemanticException( + "Measurement contains null or empty string: " + Arrays.toString(measurementList)); + } + if (deduplicatedMeasurements.contains(measurement)) { + throw new SemanticException("Insertion contains duplicated measurement: " + measurement); + } else { + deduplicatedMeasurements.add(measurement); + } + } + + int measurementsNum = measurementList.length; + for (int i = 0; i < times.length; i++) { + if (measurementsNum != valuesList.get(i).length) { + throw new SemanticException( + String.format( + "the measurementList's size %d is not consistent with the valueList's size %d", + measurementsNum, valuesList.get(i).length)); + } + } + } }
