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

Reply via email to