This is an automated email from the ASF dual-hosted git repository. github-merge-queue[bot] pushed a commit to branch gh-readonly-queue/main/pr-22309-c3f3b7a6eacd73ac4dc766452dc4d6cdfcb5bde7 in repository https://gitbox.apache.org/repos/asf/datafusion.git
commit c48e9936033ffceaaae6d534bfd31dc1cac520b4 Author: jj.lee <[email protected]> AuthorDate: Thu May 28 20:51:33 2026 +0900 Return None for cardinality overflow (#22309) ## Which issue does this PR close? Closes #22232 (cc @Dandandan ) ## Rationale for this change Prevent `Interval::cardinality()` from overflowing on the full `i64` range. ## What changes are included in this PR? - use `checked_add(1)` instead of `+ 1` - add a regression test for the full `i64` range ## Are these changes tested? - `cargo fmt --all --check` - `cargo test -p datafusion-expr-common test_cardinality_full_i64_range_does_not_overflow --lib` - `cargo clippy --all-targets --all-features -- -D warnings` could not run locally because `cmake` is not installed ## Are there any user-facing changes? - No --- datafusion/expr-common/src/interval_arithmetic.rs | 17 ++++++++++++++++- datafusion/sqllogictest/test_files/select.slt | 6 ++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/datafusion/expr-common/src/interval_arithmetic.rs b/datafusion/expr-common/src/interval_arithmetic.rs index e2f8198c92..51858be538 100644 --- a/datafusion/expr-common/src/interval_arithmetic.rs +++ b/datafusion/expr-common/src/interval_arithmetic.rs @@ -944,7 +944,7 @@ impl Interval { // Cardinality calculations are not implemented for this data type yet: None } - .map(|result| result + 1) + .and_then(|result| result.checked_add(1)) } /// Reflects an [`Interval`] around the point zero. @@ -4157,7 +4157,22 @@ mod tests { ScalarValue::TimestampNanosecond(Some(2_000_000_000), None), )?; assert_eq!(interval.cardinality().unwrap(), 1_000_000_001); + Ok(()) + } + + #[test] + fn test_cardinality_full_integer_range_does_not_overflow() -> Result<()> { + let interval = Interval::try_new( + ScalarValue::Int64(Some(i64::MIN)), + ScalarValue::Int64(Some(i64::MAX)), + )?; + assert_eq!(interval.cardinality(), None); + let interval = Interval::try_new( + ScalarValue::UInt64(Some(0)), + ScalarValue::UInt64(Some(u64::MAX)), + )?; + assert_eq!(interval.cardinality(), None); Ok(()) } diff --git a/datafusion/sqllogictest/test_files/select.slt b/datafusion/sqllogictest/test_files/select.slt index 3e97dc4588..762f5c1133 100644 --- a/datafusion/sqllogictest/test_files/select.slt +++ b/datafusion/sqllogictest/test_files/select.slt @@ -960,6 +960,12 @@ physical_plan 01)ProjectionExec: expr=[c1@0 >= 2 AND c1@0 <= 3 as select_between_data.c1 BETWEEN Int64(2) AND Int64(3)] 02)--DataSourceExec: partitions=1, partition_sizes=[1] +# regression test: full i64 BETWEEN bounds should not overflow +query I +SELECT * FROM (VALUES (1)) AS t(x) +WHERE x BETWEEN -9223372036854775808 AND 9223372036854775807 +---- +1 # TODO: query_get_indexed_field --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
