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 f608a2d2e6a Adjust the exception message cause by the WHERE clause,
which uses a range comparison on the same field, specifically when the left
value of the range is greater than the right value of the range. (#16741)
f608a2d2e6a is described below
commit f608a2d2e6a2ddf8b80ae0e36dbc3424a7ca6127
Author: libo <[email protected]>
AuthorDate: Thu Nov 13 11:17:23 2025 +0800
Adjust the exception message cause by the WHERE clause, which uses a range
comparison on the same field, specifically when the left value of the range is
greater than the right value of the range. (#16741)
---
.../org/apache/iotdb/db/it/IoTDBDeletionIT.java | 21 +++++++++++++++++++++
.../db/queryengine/plan/parser/ASTVisitor.java | 12 +++++++++---
2 files changed, 30 insertions(+), 3 deletions(-)
diff --git
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBDeletionIT.java
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBDeletionIT.java
index 576b9c75f21..17ceb9b6962 100644
--- a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBDeletionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBDeletionIT.java
@@ -19,10 +19,12 @@
package org.apache.iotdb.db.it;
+import org.apache.iotdb.db.queryengine.plan.parser.ASTVisitor;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.ClusterIT;
import org.apache.iotdb.itbase.category.LocalStandaloneIT;
+import org.apache.iotdb.jdbc.IoTDBSQLException;
import org.apache.iotdb.rpc.TSStatusCode;
import org.junit.AfterClass;
@@ -467,6 +469,25 @@ public class IoTDBDeletionIT {
}
}
+ @Test
+ public void testDeleteByRangeComparison() throws SQLException {
+ try (Connection connection = EnvFactory.getEnv().getConnection();
+ Statement statement = connection.createStatement()) {
+ statement.execute("CREATE DATABASE root.test");
+ statement.execute("CREATE ALIGNED TIMESERIES root.test.g_0.d2(s_0
int32)");
+ statement.execute("INSERT INTO root.test.g_0.d_2(time,s_0) VALUES(1,
1)");
+
+ try {
+ statement.execute("DELETE FROM root.test.g_0.d_2.s_0 WHERE time > 4
AND time < 0");
+ } catch (IoTDBSQLException e) {
+ Assert.assertEquals(
+ e.getErrorCode() + ": " +
ASTVisitor.DELETE_RANGE_COMPARISON_ERROR_MSG, e.getMessage());
+ }
+
+ statement.execute("DROP DATABASE root.test");
+ }
+ }
+
private static void prepareSeries() {
try (Connection connection = EnvFactory.getEnv().getConnection();
Statement statement = connection.createStatement()) {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
index 123f7dcae52..be30b4e1b37 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
@@ -344,6 +344,9 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
private static final String LIMIT_CONFIGURATION_ENABLED_ERROR_MSG =
"Limit configuration is not enabled, please enable it first.";
+ public static final String DELETE_RANGE_COMPARISON_ERROR_MSG =
+ "For delete statement, where clause use a range comparison on the same
field, the left value of the range cannot be greater than the right value of
the range, it must be written like this : time > 5 and time < 10";
+
private static final String NODE_NAME_IN_INTO_PATH_MATCHER =
"([a-zA-Z0-9_${}\\u2E80-\\u9FFF]+)";
private static final Pattern NODE_NAME_IN_INTO_PATH_PATTERN =
Pattern.compile(NODE_NAME_IN_INTO_PATH_MATCHER);
@@ -2993,9 +2996,12 @@ public class ASTVisitor extends
IoTDBSqlParserBaseVisitor<Statement> {
parseDeleteTimeRange(((LogicAndExpression)
predicate).getLeftExpression());
TimeRange rightTimeRange =
parseDeleteTimeRange(((LogicAndExpression)
predicate).getRightExpression());
- return new TimeRange(
- Math.max(leftTimeRange.getMin(), rightTimeRange.getMin()),
- Math.min(leftTimeRange.getMax(), rightTimeRange.getMax()));
+ long min = Math.max(leftTimeRange.getMin(), rightTimeRange.getMin());
+ long max = Math.min(leftTimeRange.getMax(), rightTimeRange.getMax());
+ if (min > max) {
+ throw new SemanticException(DELETE_RANGE_COMPARISON_ERROR_MSG);
+ }
+ return new TimeRange(min, max);
} else if (predicate instanceof CompareBinaryExpression) {
if (((CompareBinaryExpression) predicate).getLeftExpression() instanceof
TimestampOperand) {
return parseTimeRangeForDeleteTimeRange(