This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch fix_delete_with_null_deviceId
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/fix_delete_with_null_deviceId
by this push:
new fd9d58787ad add support of filtering null
fd9d58787ad is described below
commit fd9d58787ad1682f78693d32fd67d4935490451d
Author: Tian Jiang <[email protected]>
AuthorDate: Wed Nov 27 10:38:24 2024 +0800
add support of filtering null
---
.../relational/it/db/it/IoTDBDeletionTableIT.java | 10 ++++++
.../db/queryengine/plan/analyze/AnalyzeUtils.java | 6 ++--
.../dataregion/modification/IDPredicate.java | 37 ++++++++++++++++------
3 files changed, 41 insertions(+), 12 deletions(-)
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 57e7692fda1..ea1707239e1 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
@@ -47,6 +47,7 @@ import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@RunWith(IoTDBTestRunner.class)
@@ -580,7 +581,16 @@ public class IoTDBDeletionTableIT {
"create table t" + testNum + " (id1 string id, id2 string id, s1
int32 measurement)");
// id1 is null for this record
statement.execute("insert into t" + testNum + " (time, id2, s1) values
(1, '1', 1)");
+ statement.execute("insert into t" + testNum + " (time, id2, s1) values
(2, '', 2)");
statement.execute("flush");
+
+ statement.execute("delete from t" + testNum + " where id1 = NULL and
time <= 1");
+
+ try (ResultSet set = statement.executeQuery("SELECT * FROM t" +
testNum)) {
+ assertTrue(set.next());
+ assertFalse(set.next());
+ }
+
statement.execute("delete from t" + testNum);
try (ResultSet set = statement.executeQuery("SELECT * FROM t" +
testNum)) {
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 835509fb9b2..21eadfd43cc 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
@@ -41,6 +41,7 @@ import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Identifier;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LogicalExpression;
import
org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LogicalExpression.Operator;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LongLiteral;
+import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.NullLiteral;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.StringLiteral;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.TimeRange;
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertBaseStatement;
@@ -540,13 +541,14 @@ public class AnalyzeUtils {
String rightHandValue;
if (right instanceof StringLiteral) {
rightHandValue = ((StringLiteral) right).getValue();
+ } else if (right instanceof NullLiteral) {
+ rightHandValue = null;
} else {
throw new SemanticException(
"The right hand value of id predicate must be a string: " + right);
}
// the first segment is the table name, so + 1
- IDPredicate newPredicate = new SegmentExactMatch(rightHandValue,
idColumnOrdinal + 1);
- return newPredicate;
+ return new SegmentExactMatch(rightHandValue, idColumnOrdinal + 1);
}
public interface DataPartitionQueryFunc {
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/IDPredicate.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/IDPredicate.java
index c8574fce5cd..9d2b948412a 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/IDPredicate.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/modification/IDPredicate.java
@@ -247,26 +247,42 @@ public abstract class IDPredicate implements
StreamSerializable, BufferSerializa
@Override
public int serializedSize() {
- byte[] bytes = pattern.getBytes(TSFileConfig.STRING_CHARSET);
- return super.serializedSize()
- + ReadWriteForEncodingUtils.varIntSize(bytes.length)
- + bytes.length * Character.BYTES
- + ReadWriteForEncodingUtils.varIntSize(segmentIndex);
+ if (pattern != null) {
+ byte[] bytes = pattern.getBytes(TSFileConfig.STRING_CHARSET);
+ return super.serializedSize()
+ + ReadWriteForEncodingUtils.varIntSize(bytes.length)
+ + bytes.length * Character.BYTES
+ + ReadWriteForEncodingUtils.varIntSize(segmentIndex);
+ } else {
+ return ReadWriteForEncodingUtils.varIntSize(-1);
+ }
}
@Override
public long serialize(OutputStream stream) throws IOException {
long size = super.serialize(stream);
- size += ReadWriteIOUtils.writeVar(pattern, stream);
- size += ReadWriteForEncodingUtils.writeVarInt(segmentIndex, stream);
+ if (pattern != null) {
+ size += ReadWriteIOUtils.writeVar(pattern, stream);
+ size += ReadWriteForEncodingUtils.writeVarInt(segmentIndex, stream);
+ } else {
+ size += ReadWriteForEncodingUtils.writeVarInt(-1, stream);
+ size += ReadWriteForEncodingUtils.writeVarInt(segmentIndex, stream);
+ }
+
return size;
}
@Override
public long serialize(ByteBuffer buffer) {
long size = super.serialize(buffer);
- size += ReadWriteIOUtils.writeVar(pattern, buffer);
- size += ReadWriteForEncodingUtils.writeVarInt(segmentIndex, buffer);
+ if (pattern != null) {
+ size += ReadWriteIOUtils.writeVar(pattern, buffer);
+ size += ReadWriteForEncodingUtils.writeVarInt(segmentIndex, buffer);
+ } else {
+ size += ReadWriteForEncodingUtils.writeVarInt(-1, buffer);
+ size += ReadWriteForEncodingUtils.writeVarInt(segmentIndex, buffer);
+ }
+
return size;
}
@@ -284,7 +300,8 @@ public abstract class IDPredicate implements
StreamSerializable, BufferSerializa
@Override
public boolean matches(IDeviceID deviceID) {
- return deviceID.segmentNum() > segmentIndex &&
pattern.equals(deviceID.segment(segmentIndex));
+ return deviceID.segmentNum() > segmentIndex
+ && Objects.equals(pattern, deviceID.segment(segmentIndex));
}
@Override