From 757e84ace4e9ecee680e23ebd878e42e2543daa3 Mon Sep 17 00:00:00 2001 From: "yonghao.fyh" Date: Fri, 30 Jan 2026 11:41:41 +0800 Subject: [PATCH 1/6] fix: bugfix for predicate batch reader not check predicate nullptr --- src/paimon/common/reader/predicate_batch_reader.cpp | 4 ++++ .../common/reader/predicate_batch_reader_test.cpp | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/paimon/common/reader/predicate_batch_reader.cpp b/src/paimon/common/reader/predicate_batch_reader.cpp index 75400998..6ec739b0 100644 --- a/src/paimon/common/reader/predicate_batch_reader.cpp +++ b/src/paimon/common/reader/predicate_batch_reader.cpp @@ -48,6 +48,10 @@ PredicateBatchReader::PredicateBatchReader(std::unique_ptr&& reader Result> PredicateBatchReader::Create( std::unique_ptr&& reader, const std::shared_ptr& predicate, const std::shared_ptr& pool) { + if (!predicate) { + return Status::Invalid( + fmt::format("create predicate batch reader failed. predicate is nullptr")); + } auto predicate_filter = std::dynamic_pointer_cast(predicate); if (!predicate_filter) { return Status::Invalid( diff --git a/src/paimon/common/reader/predicate_batch_reader_test.cpp b/src/paimon/common/reader/predicate_batch_reader_test.cpp index 549dfe07..569be414 100644 --- a/src/paimon/common/reader/predicate_batch_reader_test.cpp +++ b/src/paimon/common/reader/predicate_batch_reader_test.cpp @@ -188,4 +188,16 @@ TEST_F(PredicateBatchReaderTest, TestFullAndEmptyCase) { } } +TEST_F(PredicateBatchReaderTest, TestInvalidInput) { + auto data_array = PrepareArray(8); + auto reader = std::make_unique(data_array, data_type_, /*batch_size=*/10); + std::shared_ptr expected_array; + auto array_status = arrow::ipc::internal::json::ChunkedArrayFromJSON(data_type_, {R"([ + ["str_1", 1, true], ["str_3", 3, true], ["str_5", 5, true], ["str_7", 7, true] + ])"}, + &expected_array); + ASSERT_NOK_WITH_MSG(PredicateBatchReader::Create(std::move(reader), nullptr, GetDefaultPool()), + "create predicate batch reader failed. predicate is nullptr"); +} + } // namespace paimon::test From 4b6fa143673fe58c686a80e68ae170b7ca06b7eb Mon Sep 17 00:00:00 2001 From: "yonghao.fyh" Date: Fri, 30 Jan 2026 11:46:05 +0800 Subject: [PATCH 2/6] fix --- src/paimon/common/reader/predicate_batch_reader.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/paimon/common/reader/predicate_batch_reader.cpp b/src/paimon/common/reader/predicate_batch_reader.cpp index 6ec739b0..da4ece4b 100644 --- a/src/paimon/common/reader/predicate_batch_reader.cpp +++ b/src/paimon/common/reader/predicate_batch_reader.cpp @@ -49,8 +49,7 @@ Result> PredicateBatchReader::Create( std::unique_ptr&& reader, const std::shared_ptr& predicate, const std::shared_ptr& pool) { if (!predicate) { - return Status::Invalid( - fmt::format("create predicate batch reader failed. predicate is nullptr")); + return Status::Invalid("create predicate batch reader failed. predicate is nullptr"); } auto predicate_filter = std::dynamic_pointer_cast(predicate); if (!predicate_filter) { From ac64d5045d6072de3e151b76877ffac506aa6765 Mon Sep 17 00:00:00 2001 From: "yonghao.fyh" Date: Fri, 30 Jan 2026 11:47:45 +0800 Subject: [PATCH 3/6] fix --- src/paimon/common/reader/predicate_batch_reader_test.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/paimon/common/reader/predicate_batch_reader_test.cpp b/src/paimon/common/reader/predicate_batch_reader_test.cpp index 569be414..97b7aee4 100644 --- a/src/paimon/common/reader/predicate_batch_reader_test.cpp +++ b/src/paimon/common/reader/predicate_batch_reader_test.cpp @@ -189,13 +189,7 @@ TEST_F(PredicateBatchReaderTest, TestFullAndEmptyCase) { } TEST_F(PredicateBatchReaderTest, TestInvalidInput) { - auto data_array = PrepareArray(8); auto reader = std::make_unique(data_array, data_type_, /*batch_size=*/10); - std::shared_ptr expected_array; - auto array_status = arrow::ipc::internal::json::ChunkedArrayFromJSON(data_type_, {R"([ - ["str_1", 1, true], ["str_3", 3, true], ["str_5", 5, true], ["str_7", 7, true] - ])"}, - &expected_array); ASSERT_NOK_WITH_MSG(PredicateBatchReader::Create(std::move(reader), nullptr, GetDefaultPool()), "create predicate batch reader failed. predicate is nullptr"); } From e0ac221f0174a9123db44abd7bc75edb992c99e4 Mon Sep 17 00:00:00 2001 From: "yonghao.fyh" Date: Fri, 30 Jan 2026 11:48:08 +0800 Subject: [PATCH 4/6] fix --- src/paimon/common/reader/predicate_batch_reader_test.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/paimon/common/reader/predicate_batch_reader_test.cpp b/src/paimon/common/reader/predicate_batch_reader_test.cpp index 97b7aee4..bd757bcc 100644 --- a/src/paimon/common/reader/predicate_batch_reader_test.cpp +++ b/src/paimon/common/reader/predicate_batch_reader_test.cpp @@ -189,6 +189,7 @@ TEST_F(PredicateBatchReaderTest, TestFullAndEmptyCase) { } TEST_F(PredicateBatchReaderTest, TestInvalidInput) { + auto data_array = PrepareArray(8); auto reader = std::make_unique(data_array, data_type_, /*batch_size=*/10); ASSERT_NOK_WITH_MSG(PredicateBatchReader::Create(std::move(reader), nullptr, GetDefaultPool()), "create predicate batch reader failed. predicate is nullptr"); From 01de433a7b12b46111d4fe43565089cc13950ec3 Mon Sep 17 00:00:00 2001 From: "yonghao.fyh" Date: Fri, 30 Jan 2026 11:50:52 +0800 Subject: [PATCH 5/6] fix --- src/paimon/core/operation/read_context.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/paimon/core/operation/read_context.cpp b/src/paimon/core/operation/read_context.cpp index 1e75843e..57425239 100644 --- a/src/paimon/core/operation/read_context.cpp +++ b/src/paimon/core/operation/read_context.cpp @@ -230,6 +230,9 @@ Result> ReadContextBuilder::Finish() { return Status::Invalid( "prefetch batch count should be greater than or equal to prefetch max parallel num"); } + if (impl_->enable_predicate_filter_ && impl_->predicate_ == nullptr) { + return Status::Invalid("predicate should not be nullptr when predicate filter is enabled"); + } if (!impl_->executor_) { // If the user do not set executor, create default executor by prefetch batch count uint32_t thread_count = impl_->enable_prefetch_ ? impl_->prefetch_max_parallel_num_ : 1; From d142a4b132a377fa3545851c6db9f6e8cf8332a4 Mon Sep 17 00:00:00 2001 From: "yonghao.fyh" Date: Fri, 30 Jan 2026 11:56:20 +0800 Subject: [PATCH 6/6] fix --- src/paimon/core/operation/abstract_split_read.cpp | 2 +- src/paimon/core/operation/read_context.cpp | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/paimon/core/operation/abstract_split_read.cpp b/src/paimon/core/operation/abstract_split_read.cpp index 8fa3f0c8..5717a1b6 100644 --- a/src/paimon/core/operation/abstract_split_read.cpp +++ b/src/paimon/core/operation/abstract_split_read.cpp @@ -123,7 +123,7 @@ std::unordered_map AbstractSplitRead::CreateDeletionF Result> AbstractSplitRead::ApplyPredicateFilterIfNeeded( std::unique_ptr&& reader, const std::shared_ptr& predicate) const { - if (!context_->EnablePredicateFilter()) { + if (!context_->EnablePredicateFilter() || predicate == nullptr) { return std::move(reader); } return PredicateBatchReader::Create(std::move(reader), predicate, pool_); diff --git a/src/paimon/core/operation/read_context.cpp b/src/paimon/core/operation/read_context.cpp index 57425239..1e75843e 100644 --- a/src/paimon/core/operation/read_context.cpp +++ b/src/paimon/core/operation/read_context.cpp @@ -230,9 +230,6 @@ Result> ReadContextBuilder::Finish() { return Status::Invalid( "prefetch batch count should be greater than or equal to prefetch max parallel num"); } - if (impl_->enable_predicate_filter_ && impl_->predicate_ == nullptr) { - return Status::Invalid("predicate should not be nullptr when predicate filter is enabled"); - } if (!impl_->executor_) { // If the user do not set executor, create default executor by prefetch batch count uint32_t thread_count = impl_->enable_prefetch_ ? impl_->prefetch_max_parallel_num_ : 1;