From f9d4e7e339b014b2fe337559836764e2b44856e1 Mon Sep 17 00:00:00 2001 From: Vishwanatha-HD Date: Fri, 21 Nov 2025 21:05:45 +0530 Subject: [PATCH] GH-48210 Fix Bloom Filter logic to enable Parquet DB support on s390x --- cpp/src/parquet/bloom_filter.cc | 9 +++++++-- cpp/src/parquet/bloom_filter_block_impl_internal.h | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cpp/src/parquet/bloom_filter.cc b/cpp/src/parquet/bloom_filter.cc index 83e91cdcb3a4..c1ea3588e603 100644 --- a/cpp/src/parquet/bloom_filter.cc +++ b/cpp/src/parquet/bloom_filter.cc @@ -33,6 +33,7 @@ #include "generated/parquet_types.h" +#include "arrow/util/endian.h" #include "parquet/bloom_filter.h" #include "parquet/encryption/encryption_internal.h" #include "parquet/encryption/internal_file_decryptor.h" @@ -473,12 +474,16 @@ bool BlockSplitBloomFilter::FindHash(uint64_t hash) const { void BlockSplitBloomFilter::InsertHashImpl(uint64_t hash) { const uint32_t bucket_index = static_cast(((hash >> 32) * NumBlocks()) >> 32); const uint32_t key = static_cast(hash); - uint32_t* bitset32 = reinterpret_cast(data_->mutable_data()); + uint32_t* raw_bitset32 = reinterpret_cast(data_->mutable_data()); for (int i = 0; i < kBitsSetPerBlock; i++) { + const int word_index = bucket_index * kBitsSetPerBlock + i; + uint32_t bitset_word = ::arrow::bit_util::FromLittleEndian(raw_bitset32[word_index]); + // Calculate mask for key in the given bitset. const uint32_t mask = UINT32_C(0x1) << ((key * SALT[i]) >> 27); - bitset32[bucket_index * kBitsSetPerBlock + i] |= mask; + bitset_word |= mask; + raw_bitset32[word_index] = ::arrow::bit_util::ToLittleEndian(bitset_word); } } diff --git a/cpp/src/parquet/bloom_filter_block_impl_internal.h b/cpp/src/parquet/bloom_filter_block_impl_internal.h index f180e569685e..37d3994f02e8 100644 --- a/cpp/src/parquet/bloom_filter_block_impl_internal.h +++ b/cpp/src/parquet/bloom_filter_block_impl_internal.h @@ -30,8 +30,11 @@ inline bool FindHashBlockImpl( uint32_t key) { uint32_t miss = 0; for (int i = 0; i < BlockSplitBloomFilter::kBitsSetPerBlock; ++i) { + const uint32_t bitset_word = + ::arrow::bit_util::FromLittleEndian(block[i]); + const uint32_t mask = static_cast(1) << ((key * salt[i]) >> 27); - miss |= (~block[i] & mask); + miss |= (~bitset_word & mask); } return miss == 0; }