diff --git a/paimon-common/src/main/java/org/apache/paimon/fileindex/rangebitmap/RangeBitmap.java b/paimon-common/src/main/java/org/apache/paimon/fileindex/rangebitmap/RangeBitmap.java index c338f47bfcd6..5b44e1dfe13f 100644 --- a/paimon-common/src/main/java/org/apache/paimon/fileindex/rangebitmap/RangeBitmap.java +++ b/paimon-common/src/main/java/org/apache/paimon/fileindex/rangebitmap/RangeBitmap.java @@ -225,7 +225,7 @@ public RoaringBitmap32 isNotNull() { private RoaringBitmap32 isNull(@Nullable RoaringBitmap32 foundSet) { if (cardinality <= 0) { - return rid > 0 ? RoaringBitmap32.bitmapOf(0, rid - 1) : new RoaringBitmap32(); + return rid > 0 ? RoaringBitmap32.bitmapOfRange(0, rid) : new RoaringBitmap32(); } if (foundSet != null && foundSet.isEmpty()) { @@ -306,7 +306,7 @@ private RoaringBitmap32 fillNulls( @Nullable RoaringBitmap32 foundSet, BiFunction function) { if (cardinality <= 0) { - return rid > 0 ? RoaringBitmap32.bitmapOf(0, rid - 1) : new RoaringBitmap32(); + return rid > 0 ? RoaringBitmap32.bitmapOfRange(0, rid) : new RoaringBitmap32(); } RoaringBitmap32 bitmap; diff --git a/paimon-common/src/test/java/org/apache/paimon/fileindex/rangebitmap/RangeBitmapFileIndexTest.java b/paimon-common/src/test/java/org/apache/paimon/fileindex/rangebitmap/RangeBitmapFileIndexTest.java index e56bfe7a0d9d..01c072520b15 100644 --- a/paimon-common/src/test/java/org/apache/paimon/fileindex/rangebitmap/RangeBitmapFileIndexTest.java +++ b/paimon-common/src/test/java/org/apache/paimon/fileindex/rangebitmap/RangeBitmapFileIndexTest.java @@ -423,8 +423,9 @@ public void testOnlyNulls() { FieldRef fieldRef = new FieldRef(0, "", intType); RangeBitmapFileIndex bitmapFileIndex = new RangeBitmapFileIndex(intType, new Options()); FileIndexWriter writer = bitmapFileIndex.createWriter(); - writer.writeRecord(null); - writer.writeRecord(null); + for (int i = 0; i < 5; i++) { + writer.writeRecord(null); + } // build index byte[] bytes = writer.serializedBytes(); @@ -433,7 +434,7 @@ public void testOnlyNulls() { // test is null assertThat(((BitmapIndexResult) reader.visitIsNull(fieldRef)).get()) - .isEqualTo(RoaringBitmap32.bitmapOf(0, 1)); + .isEqualTo(RoaringBitmap32.bitmapOfRange(0, 5)); // test is not null assertThat(((BitmapIndexResult) reader.visitIsNotNull(fieldRef)).get()) .isEqualTo(RoaringBitmap32.bitmapOf()); @@ -444,6 +445,10 @@ public void testOnlyNulls() { // test GT assertThat(((BitmapIndexResult) reader.visitGreaterThan(fieldRef, 0)).get()) .isEqualTo(RoaringBitmap32.bitmapOf()); + + TopN topN = new TopN(fieldRef, ASCENDING, NULLS_FIRST, 1); + assertThat(((BitmapIndexResult) reader.visitTopN(topN, null)).get()) + .isEqualTo(RoaringBitmap32.bitmapOfRange(0, 5)); } @Test