From aaf25a93125f346adb987d7bff31593af65f242d Mon Sep 17 00:00:00 2001 From: Manu Zhang Date: Sun, 11 Oct 2026 15:27:13 +0800 Subject: [PATCH 1/2] chore: upgrade CRoaring to 4.7.1 Include the upstream portable IO endian fix and check canonical little-endian bitmap bytes when serializing and reading. --- .../IcebergThirdpartyToolchain.cmake | 2 +- .../test/roaring_position_bitmap_test.cc | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/cmake_modules/IcebergThirdpartyToolchain.cmake b/cmake_modules/IcebergThirdpartyToolchain.cmake index 9e0d3d3f5f..ce834a682c 100644 --- a/cmake_modules/IcebergThirdpartyToolchain.cmake +++ b/cmake_modules/IcebergThirdpartyToolchain.cmake @@ -422,7 +422,7 @@ function(resolve_croaring_dependency) set(CROARING_URL "$ENV{ICEBERG_CROARING_URL}") else() set(CROARING_URL - "https://github.com/RoaringBitmap/CRoaring/archive/refs/tags/v4.4.3.tar.gz") + "https://github.com/RoaringBitmap/CRoaring/archive/refs/tags/v4.7.1.tar.gz") endif() fetchcontent_declare(croaring diff --git a/src/iceberg/test/roaring_position_bitmap_test.cc b/src/iceberg/test/roaring_position_bitmap_test.cc index 51f401b183..09157f3ebb 100644 --- a/src/iceberg/test/roaring_position_bitmap_test.cc +++ b/src/iceberg/test/roaring_position_bitmap_test.cc @@ -387,6 +387,27 @@ TEST(RoaringPositionBitmapTest, TestSerializeDeserializeRoundTrip) { AssertEqualContent(copy, {10L, 20L, (int64_t{1} << 32) | 30L}); } +TEST(RoaringPositionBitmapTest, TestPortableLittleEndianEncoding) { + // One bitmap with key 0 and an array container containing position 1. + // Check canonical wire bytes: a same-host round trip can hide endian errors. + constexpr char kExpected[] = + "\x01\x00\x00\x00\x00\x00\x00\x00" // Number of bitmaps. + "\x00\x00\x00\x00" // Bitmap key. + "\x3a\x30\x00\x00\x01\x00\x00\x00" // Cookie and number of containers. + "\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00"; // Array container. + const std::string expected(kExpected, sizeof(kExpected) - 1); + + RoaringPositionBitmap bitmap; + bitmap.Add(1L); + auto serialized = bitmap.Serialize(); + ASSERT_THAT(serialized, IsOk()); + EXPECT_EQ(serialized.value(), expected); + + auto deserialized = RoaringPositionBitmap::Deserialize(expected); + ASSERT_THAT(deserialized, IsOk()); + AssertEqualContent(deserialized.value(), {1L}); +} + TEST(RoaringPositionBitmapTest, TestCopyConstructor) { RoaringPositionBitmap bitmap; bitmap.Add(10L); From 8fcca34b8b558daf42551f23042979821a69bcea Mon Sep 17 00:00:00 2001 From: Manu Zhang Date: Mon, 12 Oct 2026 01:52:06 +0800 Subject: [PATCH 2/2] test: use std::array for portable bitmap fixture Preserve the fixture's embedded zeros and exact wire length while satisfying modernize-avoid-c-arrays. --- src/iceberg/test/roaring_position_bitmap_test.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/iceberg/test/roaring_position_bitmap_test.cc b/src/iceberg/test/roaring_position_bitmap_test.cc index 09157f3ebb..8dd998efbf 100644 --- a/src/iceberg/test/roaring_position_bitmap_test.cc +++ b/src/iceberg/test/roaring_position_bitmap_test.cc @@ -19,6 +19,7 @@ #include "iceberg/deletes/roaring_position_bitmap.h" +#include #include #include #include @@ -390,12 +391,12 @@ TEST(RoaringPositionBitmapTest, TestSerializeDeserializeRoundTrip) { TEST(RoaringPositionBitmapTest, TestPortableLittleEndianEncoding) { // One bitmap with key 0 and an array container containing position 1. // Check canonical wire bytes: a same-host round trip can hide endian errors. - constexpr char kExpected[] = - "\x01\x00\x00\x00\x00\x00\x00\x00" // Number of bitmaps. - "\x00\x00\x00\x00" // Bitmap key. - "\x3a\x30\x00\x00\x01\x00\x00\x00" // Cookie and number of containers. - "\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00"; // Array container. - const std::string expected(kExpected, sizeof(kExpected) - 1); + constexpr auto kExpected = std::to_array( + "\x01\x00\x00\x00\x00\x00\x00\x00" // Number of bitmaps. + "\x00\x00\x00\x00" // Bitmap key. + "\x3a\x30\x00\x00\x01\x00\x00\x00" // Cookie and number of containers. + "\x00\x00\x00\x00\x10\x00\x00\x00\x01\x00"); // Array container. + const std::string expected(kExpected.data(), kExpected.size() - 1); RoaringPositionBitmap bitmap; bitmap.Add(1L);