This is an automated email from the ASF dual-hosted git repository.

haonan 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 9c9b2393af3 Fix query error after insert an all null aligned tablet 
and flush (#14777)
9c9b2393af3 is described below

commit 9c9b2393af307895026c501345bfd4d7b8ecd495
Author: Haonan <[email protected]>
AuthorDate: Sun Jan 26 09:50:16 2025 +0800

    Fix query error after insert an all null aligned tablet and flush (#14777)
---
 .../iotdb/session/it/IoTDBSessionInsertNullIT.java | 70 ++++++++++++++++++++++
 .../dataregion/flush/MemTableFlushTask.java        |  2 +-
 .../memtable/AlignedWritableMemChunk.java          | 13 +++-
 .../dataregion/memtable/WritableMemChunkGroup.java |  2 +-
 4 files changed, 84 insertions(+), 3 deletions(-)

diff --git 
a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionInsertNullIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionInsertNullIT.java
index f101a833fbb..bbee36782fc 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionInsertNullIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionInsertNullIT.java
@@ -32,6 +32,8 @@ import org.apache.tsfile.file.metadata.enums.CompressionType;
 import org.apache.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.tsfile.read.common.Field;
 import org.apache.tsfile.read.common.RowRecord;
+import org.apache.tsfile.write.record.Tablet;
+import org.apache.tsfile.write.schema.MeasurementSchema;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -355,4 +357,72 @@ public class IoTDBSessionInsertNullIT {
       fail(e.getMessage());
     }
   }
+
+  @Test
+  public void insertTabletNullTest() {
+    try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
+      prepareData(session);
+
+      String deviceId = "root.sg1.clsu.d1";
+      Tablet tablet =
+          new Tablet(
+              deviceId,
+              Arrays.asList(
+                  new MeasurementSchema("s1", TSDataType.BOOLEAN),
+                  new MeasurementSchema("s2", TSDataType.INT32)),
+              3);
+      tablet.addTimestamp(0, 300);
+      tablet.addValue("s1", 0, null);
+      tablet.addValue("s2", 0, null);
+      tablet.addTimestamp(1, 400);
+      tablet.addValue("s1", 1, null);
+      tablet.addValue("s2", 1, null);
+      tablet.addTimestamp(2, 500);
+      tablet.addValue("s1", 2, null);
+      tablet.addValue("s2", 2, null);
+      session.insertTablet(tablet);
+      long nums = queryCountRecords(session, "select count(s1) from " + 
deviceId);
+      assertEquals(0, nums);
+      session.executeNonQueryStatement("flush");
+      nums = queryCountRecords(session, "select count(s1) from " + deviceId);
+      assertEquals(0, nums);
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
+
+  @Test
+  public void insertAlignedTabletNullTest() {
+    try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
+      prepareData(session);
+
+      String deviceId = "root.sg1.clsu.aligned_d1";
+      Tablet tablet =
+          new Tablet(
+              deviceId,
+              Arrays.asList(
+                  new MeasurementSchema("s1", TSDataType.BOOLEAN),
+                  new MeasurementSchema("s2", TSDataType.INT32)),
+              3);
+      tablet.addTimestamp(0, 300);
+      tablet.addValue("s1", 0, null);
+      tablet.addValue("s2", 0, null);
+      tablet.addTimestamp(1, 400);
+      tablet.addValue("s1", 1, null);
+      tablet.addValue("s2", 1, null);
+      tablet.addTimestamp(2, 500);
+      tablet.addValue("s1", 2, null);
+      tablet.addValue("s2", 2, null);
+      session.insertAlignedTablet(tablet);
+      long nums = queryCountRecords(session, "select count(s1) from " + 
deviceId);
+      assertEquals(0, nums);
+      session.executeNonQueryStatement("flush");
+      nums = queryCountRecords(session, "select count(s1) from " + deviceId);
+      assertEquals(0, nums);
+    } catch (Exception e) {
+      e.printStackTrace();
+      fail(e.getMessage());
+    }
+  }
 }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java
index 45a398b96bb..948f89c89fd 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java
@@ -138,7 +138,7 @@ public class MemTableFlushTask {
     for (IDeviceID deviceID : deviceIDList) {
       final Map<String, IWritableMemChunk> value = 
memTableMap.get(deviceID).getMemChunkMap();
       // skip the empty device/chunk group
-      if (memTableMap.get(deviceID).count() == 0 || value.isEmpty()) {
+      if (memTableMap.get(deviceID).isEmpty() || value.isEmpty()) {
         continue;
       }
       encodingTaskQueue.put(new StartFlushGroupIOTask(deviceID));
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
index 3c906104c17..9561d2531bc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java
@@ -264,6 +264,9 @@ public class AlignedWritableMemChunk implements 
IWritableMemChunk {
 
   @Override
   public long getMaxTime() {
+    if (isEmpty()) {
+      return Long.MIN_VALUE;
+    }
     return list.getMaxTime();
   }
 
@@ -511,7 +514,15 @@ public class AlignedWritableMemChunk implements 
IWritableMemChunk {
 
   @Override
   public boolean isEmpty() {
-    return list.rowCount() == 0 || measurementIndexMap.isEmpty();
+    if (list.rowCount() == 0) {
+      return true;
+    }
+    if (ignoreAllNullRows) {
+      return measurementIndexMap.isEmpty()
+          || (list.getAllValueColDeletedMap() != null
+              && list.getAllValueColDeletedMap().isAllMarked());
+    }
+    return false;
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
index ac5d588eb4f..ae185f89067 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java
@@ -118,7 +118,7 @@ public class WritableMemChunkGroup implements 
IWritableMemChunkGroup {
 
   @Override
   public boolean isEmpty() {
-    return memChunkMap.isEmpty();
+    return memChunkMap.isEmpty() || count() == 0;
   }
 
   @Override

Reply via email to