roaring64: and_inplace gives incorrect value
Dr-Emann opened this issue · comments
Zachary Dremann commented
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);
Simon G commented
I tested 64_OR_inplace and also seeing incorrect bits being marked. Cardinality is correct. Will provide some samples tomorrow.