This is an automated email from the ASF dual-hosted git repository. jt2594838 pushed a commit to branch delete_with_attribute in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 0a0f8f589bd9ba02d84dd7d07d9fd22689e212be Author: Tian Jiang <[email protected]> AuthorDate: Wed Jul 1 11:14:26 2026 +0800 add test --- .../relational/it/db/it/IoTDBDeletionTableIT.java | 79 ++++++++++++++++++++++ .../db/queryengine/plan/analyze/AnalyzeUtils.java | 4 ++ 2 files changed, 83 insertions(+) diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java index a180a2e4a5f..f083dd9131d 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBDeletionTableIT.java @@ -364,6 +364,85 @@ public class IoTDBDeletionTableIT { } } + @Test + public void testDeleteDataByAttributeFilterWithTagAndTimeRange() throws SQLException { + try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); + Statement statement = connection.createStatement()) { + statement.execute("use test"); + statement.execute( + "CREATE TABLE delete_by_attr_tag_time(" + + "deviceId STRING TAG, site STRING TAG, attr1 ATTRIBUTE, attr2 ATTRIBUTE, " + + "s1 INT32 FIELD)"); + statement.execute( + "INSERT INTO delete_by_attr_tag_time(time, deviceId, site, attr1, attr2, s1) VALUES " + + "(1, 'd1', 'north', 'red', 'small', 11)," + + "(2, 'd1', 'north', 'red', 'small', 12)," + + "(3, 'd1', 'north', 'red', 'small', 13)," + + "(4, 'd1', 'north', 'red', 'small', 14)," + + "(1, 'd2', 'south', 'red', 'small', 21)," + + "(2, 'd2', 'south', 'red', 'small', 22)," + + "(2, 'd3', 'north', 'blue', 'small', 32)," + + "(3, 'd4', 'north', 'red', 'large', 43)"); + + statement.execute( + "DELETE FROM delete_by_attr_tag_time " + + "WHERE time >= 2 AND time <= 3 " + + "AND site = 'north' AND attr1 = 'red' AND attr2 = 'small'"); + + final List<String> actual = new ArrayList<>(); + try (ResultSet resultSet = + statement.executeQuery( + "SELECT deviceId, time, s1 FROM delete_by_attr_tag_time ORDER BY deviceId, time")) { + while (resultSet.next()) { + actual.add( + resultSet.getString(1) + "," + resultSet.getLong(2) + "," + resultSet.getInt(3)); + } + } + assertEquals( + List.of("d1,1,11", "d1,4,14", "d2,1,21", "d2,2,22", "d3,2,32", "d4,3,43"), actual); + } + } + + @Test + public void testDeleteDataByAttributeFilterWithOrAndNull() throws SQLException { + try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); + Statement statement = connection.createStatement()) { + statement.execute("use test"); + statement.execute( + "CREATE TABLE delete_by_attr_or_null(" + + "deviceId STRING TAG, site STRING TAG, attr1 ATTRIBUTE, attr2 ATTRIBUTE, " + + "s1 INT32 FIELD)"); + statement.execute( + "INSERT INTO delete_by_attr_or_null(time, deviceId, site, attr1, attr2, s1) VALUES " + + "(1, 'd1', 'north', 'red', 'small', 11)," + + "(2, 'd1', 'north', 'red', 'small', 12)," + + "(1, 'd2', 'north', 'blue', 'small', 21)," + + "(2, 'd2', 'north', 'blue', 'small', 22)," + + "(1, 'd3', 'south', 'red', 'large', 31)," + + "(2, 'd3', 'south', 'red', 'large', 32)"); + statement.execute( + "INSERT INTO delete_by_attr_or_null(time, deviceId, site, attr1, s1) VALUES " + + "(1, 'd4', 'north', 'red', 41)," + + "(2, 'd4', 'north', 'red', 42)"); + + statement.execute( + "DELETE FROM delete_by_attr_or_null " + + "WHERE (attr1 = 'red' AND site = 'north' AND time = 1) " + + "OR (attr2 IS NULL AND time = 2)"); + + final List<String> actual = new ArrayList<>(); + try (ResultSet resultSet = + statement.executeQuery( + "SELECT deviceId, time, s1 FROM delete_by_attr_or_null ORDER BY deviceId, time")) { + while (resultSet.next()) { + actual.add( + resultSet.getString(1) + "," + resultSet.getLong(2) + "," + resultSet.getInt(3)); + } + } + assertEquals(List.of("d1,2,12", "d2,1,21", "d2,2,22", "d3,1,31", "d3,2,32"), actual); + } + } + @Test public void testDeleteDataByAttributeFilterRejectsTooManyDevices() throws SQLException { try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java index aab117c6a0a..598535b70a8 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/AnalyzeUtils.java @@ -491,6 +491,8 @@ public class AnalyzeUtils { if (parseResult.shouldQueryDevice()) { if (Objects.isNull(deviceFilterExpressions)) { deviceFilterExpressions = new ArrayList<>(); + } + if (Objects.isNull(attributeColumns)) { attributeColumns = new ArrayList<>(); } deviceFilterExpressions.add(toSymbolReferenceExpression(currExp)); @@ -508,6 +510,8 @@ public class AnalyzeUtils { if (parseResult.shouldQueryDevice()) { if (Objects.isNull(deviceFilterExpressions)) { deviceFilterExpressions = new ArrayList<>(); + } + if (Objects.isNull(attributeColumns)) { attributeColumns = new ArrayList<>(); } deviceFilterExpressions.add(toSymbolReferenceExpression(currExp));
