Skip to content

Commit 9c9b239

Browse files
authored
Fix query error after insert an all null aligned tablet and flush (apache#14777)
1 parent 25128fc commit 9c9b239

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

integration-test/src/test/java/org/apache/iotdb/session/it/IoTDBSessionInsertNullIT.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import org.apache.tsfile.file.metadata.enums.TSEncoding;
3333
import org.apache.tsfile.read.common.Field;
3434
import org.apache.tsfile.read.common.RowRecord;
35+
import org.apache.tsfile.write.record.Tablet;
36+
import org.apache.tsfile.write.schema.MeasurementSchema;
3537
import org.junit.After;
3638
import org.junit.Before;
3739
import org.junit.Test;
@@ -355,4 +357,72 @@ public void insertAlignedRecordsOfOneDeviceNullTest() {
355357
fail(e.getMessage());
356358
}
357359
}
360+
361+
@Test
362+
public void insertTabletNullTest() {
363+
try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
364+
prepareData(session);
365+
366+
String deviceId = "root.sg1.clsu.d1";
367+
Tablet tablet =
368+
new Tablet(
369+
deviceId,
370+
Arrays.asList(
371+
new MeasurementSchema("s1", TSDataType.BOOLEAN),
372+
new MeasurementSchema("s2", TSDataType.INT32)),
373+
3);
374+
tablet.addTimestamp(0, 300);
375+
tablet.addValue("s1", 0, null);
376+
tablet.addValue("s2", 0, null);
377+
tablet.addTimestamp(1, 400);
378+
tablet.addValue("s1", 1, null);
379+
tablet.addValue("s2", 1, null);
380+
tablet.addTimestamp(2, 500);
381+
tablet.addValue("s1", 2, null);
382+
tablet.addValue("s2", 2, null);
383+
session.insertTablet(tablet);
384+
long nums = queryCountRecords(session, "select count(s1) from " + deviceId);
385+
assertEquals(0, nums);
386+
session.executeNonQueryStatement("flush");
387+
nums = queryCountRecords(session, "select count(s1) from " + deviceId);
388+
assertEquals(0, nums);
389+
} catch (Exception e) {
390+
e.printStackTrace();
391+
fail(e.getMessage());
392+
}
393+
}
394+
395+
@Test
396+
public void insertAlignedTabletNullTest() {
397+
try (ISession session = EnvFactory.getEnv().getSessionConnection()) {
398+
prepareData(session);
399+
400+
String deviceId = "root.sg1.clsu.aligned_d1";
401+
Tablet tablet =
402+
new Tablet(
403+
deviceId,
404+
Arrays.asList(
405+
new MeasurementSchema("s1", TSDataType.BOOLEAN),
406+
new MeasurementSchema("s2", TSDataType.INT32)),
407+
3);
408+
tablet.addTimestamp(0, 300);
409+
tablet.addValue("s1", 0, null);
410+
tablet.addValue("s2", 0, null);
411+
tablet.addTimestamp(1, 400);
412+
tablet.addValue("s1", 1, null);
413+
tablet.addValue("s2", 1, null);
414+
tablet.addTimestamp(2, 500);
415+
tablet.addValue("s1", 2, null);
416+
tablet.addValue("s2", 2, null);
417+
session.insertAlignedTablet(tablet);
418+
long nums = queryCountRecords(session, "select count(s1) from " + deviceId);
419+
assertEquals(0, nums);
420+
session.executeNonQueryStatement("flush");
421+
nums = queryCountRecords(session, "select count(s1) from " + deviceId);
422+
assertEquals(0, nums);
423+
} catch (Exception e) {
424+
e.printStackTrace();
425+
fail(e.getMessage());
426+
}
427+
}
358428
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public void syncFlushMemTable() throws ExecutionException, InterruptedException
138138
for (IDeviceID deviceID : deviceIDList) {
139139
final Map<String, IWritableMemChunk> value = memTableMap.get(deviceID).getMemChunkMap();
140140
// skip the empty device/chunk group
141-
if (memTableMap.get(deviceID).count() == 0 || value.isEmpty()) {
141+
if (memTableMap.get(deviceID).isEmpty() || value.isEmpty()) {
142142
continue;
143143
}
144144
encodingTaskQueue.put(new StartFlushGroupIOTask(deviceID));

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedWritableMemChunk.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ public IMeasurementSchema getSchema() {
264264

265265
@Override
266266
public long getMaxTime() {
267+
if (isEmpty()) {
268+
return Long.MIN_VALUE;
269+
}
267270
return list.getMaxTime();
268271
}
269272

@@ -511,7 +514,15 @@ public long getLastPoint() {
511514

512515
@Override
513516
public boolean isEmpty() {
514-
return list.rowCount() == 0 || measurementIndexMap.isEmpty();
517+
if (list.rowCount() == 0) {
518+
return true;
519+
}
520+
if (ignoreAllNullRows) {
521+
return measurementIndexMap.isEmpty()
522+
|| (list.getAllValueColDeletedMap() != null
523+
&& list.getAllValueColDeletedMap().isAllMarked());
524+
}
525+
return false;
515526
}
516527

517528
@Override

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/WritableMemChunkGroup.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public Map<String, IWritableMemChunk> getMemChunkMap() {
118118

119119
@Override
120120
public boolean isEmpty() {
121-
return memChunkMap.isEmpty();
121+
return memChunkMap.isEmpty() || count() == 0;
122122
}
123123

124124
@Override

0 commit comments

Comments
 (0)