From 76402b5213c632d70b12b70c5216ca9e68fa40ed Mon Sep 17 00:00:00 2001 From: Junwang Zhao Date: Wed, 26 Nov 2025 22:19:22 +0800 Subject: [PATCH 1/2] fix: UnboundPredicateImpl::Make failed to check op not 100% sure, but the op type check is not consistent with java implement. I found this while working on transform project. --- src/iceberg/expression/expressions.h | 1 - src/iceberg/expression/predicate.cc | 11 +++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/iceberg/expression/expressions.h b/src/iceberg/expression/expressions.h index cf7b6d20e..7331982dd 100644 --- a/src/iceberg/expression/expressions.h +++ b/src/iceberg/expression/expressions.h @@ -27,7 +27,6 @@ #include #include -#include "iceberg/exception.h" #include "iceberg/expression/literal.h" #include "iceberg/expression/predicate.h" #include "iceberg/expression/term.h" diff --git a/src/iceberg/expression/predicate.cc b/src/iceberg/expression/predicate.cc index 6af0d5845..c4409e04e 100644 --- a/src/iceberg/expression/predicate.cc +++ b/src/iceberg/expression/predicate.cc @@ -20,7 +20,6 @@ #include "iceberg/expression/predicate.h" #include -#include #include #include "iceberg/expression/expressions.h" @@ -50,7 +49,9 @@ Result>> UnboundPredicateImpl::Make( if (!term) [[unlikely]] { return InvalidExpression("UnboundPredicate cannot have null term"); } - if (op == Expression::Operation::kIn || op == Expression::Operation::kNotIn) { + if (op != Expression::Operation::kIsNull && op != Expression::Operation::kNotNull && + op != Expression::Operation::kIsNan && op != Expression::Operation::kNotNan) + [[unlikely]] { return InvalidExpression("Cannot create {} predicate without a value", ::iceberg::ToString(op)); } @@ -64,6 +65,12 @@ Result>> UnboundPredicateImpl::Make( if (!term) [[unlikely]] { return InvalidExpression("UnboundPredicate cannot have null term"); } + if (op == Expression::Operation::kIsNull || op == Expression::Operation::kNotNull || + op == Expression::Operation::kIsNan || op == Expression::Operation::kNotNan) + [[unlikely]] { + return InvalidExpression("Cannot create {} predicate inclusive a value", + ::iceberg::ToString(op)); + } return std::unique_ptr>( new UnboundPredicateImpl(op, std::move(term), std::move(value))); } From 6acc07afc89e85e2a52e947c54fa120f6d2ae5f7 Mon Sep 17 00:00:00 2001 From: Junwang Zhao Date: Wed, 26 Nov 2025 23:15:42 +0800 Subject: [PATCH 2/2] add literal IsNaN check --- src/iceberg/expression/predicate.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/iceberg/expression/predicate.cc b/src/iceberg/expression/predicate.cc index c4409e04e..3c92c2fcb 100644 --- a/src/iceberg/expression/predicate.cc +++ b/src/iceberg/expression/predicate.cc @@ -71,6 +71,10 @@ Result>> UnboundPredicateImpl::Make( return InvalidExpression("Cannot create {} predicate inclusive a value", ::iceberg::ToString(op)); } + if (value.IsNaN()) [[unlikely]] { + return InvalidExpression( + "Invalid expression literal: NaN, use isNaN or notNaN instead"); + } return std::unique_ptr>( new UnboundPredicateImpl(op, std::move(term), std::move(value))); }