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..3c92c2fcb 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,16 @@ 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)); + } + 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))); }