From 20a7810a4eff553fa4281fe42bdf01e2776d251b Mon Sep 17 00:00:00 2001 From: "weiqiang.yu" Date: Mon, 3 Aug 2026 18:23:06 +0800 Subject: [PATCH] GH-50778: [C++] Fix chunked level histogram accumulation --- cpp/src/parquet/size_statistics.cc | 2 +- cpp/src/parquet/size_statistics_test.cc | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/cpp/src/parquet/size_statistics.cc b/cpp/src/parquet/size_statistics.cc index 2ef783ebc9e2..f60bc8b89b40 100644 --- a/cpp/src/parquet/size_statistics.cc +++ b/cpp/src/parquet/size_statistics.cc @@ -168,7 +168,7 @@ void UpdateLevelHistogram(std::span levels, std::span hi auto it = levels.begin(); while (it != levels.end()) { const auto chunk_size = std::min(levels.end() - it, kChunkSize); - hist1 += std::accumulate(levels.begin(), levels.begin() + chunk_size, int16_t{0}); + hist1 += std::accumulate(it, it + chunk_size, int16_t{0}); it += chunk_size; } histogram[0] += num_levels - hist1; diff --git a/cpp/src/parquet/size_statistics_test.cc b/cpp/src/parquet/size_statistics_test.cc index 8c36d6b680d5..7519b4899525 100644 --- a/cpp/src/parquet/size_statistics_test.cc +++ b/cpp/src/parquet/size_statistics_test.cc @@ -50,6 +50,14 @@ TEST(SizeStatistics, UpdateLevelHistogram) { UpdateLevelHistogram(std::vector{}, histogram); EXPECT_THAT(histogram, ::testing::ElementsAre(3, 5)); } + { + // Cross the chunk boundary used by the max_level = 1 fast path. + std::vector levels(1 << 14, 1); + levels.push_back(0); + std::vector histogram(2, 0); + UpdateLevelHistogram(levels, histogram); + EXPECT_THAT(histogram, ::testing::ElementsAre(1, 1 << 14)); + } { // max_level > 1 std::vector histogram(3, 0);