From 1b88ac4cb592cc5b097fba2ef62aa5173c685323 Mon Sep 17 00:00:00 2001 From: fangzhuhe Date: Tue, 28 Jul 2026 14:51:59 +0800 Subject: [PATCH] bugfix: tolerate invalid null count when filter row groups Signed-off-by: fangzhuhe --- bolt/dwio/parquet/reader/Statistics.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/bolt/dwio/parquet/reader/Statistics.cpp b/bolt/dwio/parquet/reader/Statistics.cpp index 513abb680..70631c362 100644 --- a/bolt/dwio/parquet/reader/Statistics.cpp +++ b/bolt/dwio/parquet/reader/Statistics.cpp @@ -42,16 +42,20 @@ std::unique_ptr buildColumnStatisticsFromThrift( std::unique_ptr>> nGramStats, const bolt::Type& type, uint64_t numRowsInRowGroup) { - std::optional nullCount = columnChunkStats.__isset.null_count - ? std::optional(columnChunkStats.null_count) - : std::nullopt; - std::optional valueCount = nullCount.has_value() - ? std::optional(numRowsInRowGroup - nullCount.value()) + const int64_t rawNullCount = columnChunkStats.null_count; + const bool validNullCount = columnChunkStats.__isset.null_count && + rawNullCount >= 0 && + static_cast(rawNullCount) <= numRowsInRowGroup; + + std::optional nullCount = validNullCount + ? std::optional(static_cast(rawNullCount)) : std::nullopt; - std::optional hasNull = columnChunkStats.__isset.null_count - ? std::optional(columnChunkStats.null_count > 0) + std::optional valueCount = validNullCount + ? std::optional( + numRowsInRowGroup - static_cast(rawNullCount)) : std::nullopt; - + std::optional hasNull = + validNullCount ? std::optional(rawNullCount > 0) : std::nullopt; switch (type.kind()) { case TypeKind::BOOLEAN: return std::make_unique(