RoaringBitmap / CRoaring

Roaring bitmaps in C (and C++), with SIMD (AVX2, AVX-512 and NEON) optimizations: used by Apache Doris, ClickHouse, and StarRocks

Home Page:http://roaringbitmap.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

roaring64: and_inplace gives incorrect value

Dr-Emann opened this issue · comments

This is with all outstanding roaring64 PRs included.

Reproduction:

uint64_t start = 0x0FFFF;
uint64_t end = 0x20001;

roaring64_bitmap_t* r1 = roaring64_bitmap_from_range(start, end, 1);
roaring64_bitmap_add(r1, 0xFFFF0000);

roaring64_bitmap_t* r2 = roaring64_bitmap_from_range(start, end, 1);

uint64_t and_cardinality = roaring64_bitmap_and_cardinality(r1, r2);
assert_int_equal(and_cardinality, end - start);

roaring64_bitmap_t* r3 = roaring64_bitmap_and(r1, r2);
assert_int_equal(roaring64_bitmap_get_cardinality(r3), and_cardinality);

roaring64_bitmap_and_inplace(r1, r2);
assert_int_equal(roaring64_bitmap_get_cardinality(r1), and_cardinality); // This line fails, `0x10001 != 0x10002`
assert_true(roaring64_bitmap_equals(r1, r3));

roaring64_bitmap_free(r1);
roaring64_bitmap_free(r2);
roaring64_bitmap_free(r3);

I tested 64_OR_inplace and also seeing incorrect bits being marked. Cardinality is correct. Will provide some samples tomorrow.