Skip to content

Commit fcd24ee

Browse files
committed
test: add failing test for CardinalityInRange gap within run container
CardinalityInRange returns wrong count when the query range falls entirely within a gap between two run-encoded intervals in the same container. Reproducer: AddRange(0, 1024) + AddRange(2048, 3072), then CardinalityInRange(1024, 2048) returns 1024 instead of 0. Root cause: off-by-one in runContainer16.getCardinalityInRange, the early return condition "lastIdx < firstIdx-1" should be "lastIdx < firstIdx".
1 parent 8923a74 commit fcd24ee

1 file changed

Lines changed: 26 additions & 0 deletions

File tree

roaring_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1155,6 +1155,32 @@ func TestCardinalityInRangeRunOptimized(t *testing.T) {
11551155
assert.EqualValues(t, 3000+5000, rb.CardinalityInRange(2000, 75000))
11561156
}
11571157

1158+
// TestCardinalityInRangeRunGapWithinContainer tests CardinalityInRange when
1159+
// two run intervals exist in the same container with a gap between them.
1160+
func TestCardinalityInRangeRunGapWithinContainer(t *testing.T) {
1161+
rb := NewBitmap()
1162+
rb.AddRange(0, 1024)
1163+
rb.AddRange(2048, 3072)
1164+
rb.RunOptimize()
1165+
1166+
// Querying within each run should return the correct count.
1167+
assert.EqualValues(t, 1024, rb.CardinalityInRange(0, 1024))
1168+
assert.EqualValues(t, 1024, rb.CardinalityInRange(2048, 3072))
1169+
1170+
// The gap [1024, 2048) has zero set bits.
1171+
assert.EqualValues(t, 0, rb.CardinalityInRange(1024, 2048))
1172+
1173+
// Ranges that span the gap should not count the gap.
1174+
assert.EqualValues(t, 2048, rb.CardinalityInRange(0, 3072))
1175+
1176+
// Boundary: bit 1023 is set, bit 1024 is not.
1177+
assert.EqualValues(t, 1, rb.CardinalityInRange(1023, 1024))
1178+
assert.EqualValues(t, 1, rb.CardinalityInRange(1023, 1025))
1179+
1180+
// Partial ranges touching each side of the gap.
1181+
assert.EqualValues(t, 512+512, rb.CardinalityInRange(512, 2560))
1182+
}
1183+
11581184
// TestCardinalityInRangeBitmapContainer tests CardinalityInRange with bitmap containers (>4096 values in one container).
11591185
func TestCardinalityInRangeBitmapContainer(t *testing.T) {
11601186
rb := NewBitmap()

0 commit comments

Comments
 (0)