You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Comparing a decimal with a negative scale to an integer literal panics in unwrap_cast #24896
try_cast_numeric_literal in datafusion/expr-common/src/casts.rs computes 10_i128.pow(scale as u32) for the target decimal type (and again for a decimal literal's own scale). A negative scale is cast to a huge u32 exponent, so the multiplication overflows and panics in debug builds (wraps in release builds).
The function is reached from the unwrap_cast expression simplifier whenever a cast to a decimal is compared with a numeric literal.
To Reproduce
Debug build of datafusion-cli:
SELECT arrow_cast(1, 'Decimal128(10, -2)') =100;
thread 'main' panicked at library/core/src/num/mod.rs:475:5:
attempt to multiply with overflow
Backtrace goes through datafusion_expr_common::casts::try_cast_numeric_literal → try_cast_literal_to_type → unwrap_cast.rs.
Expected behavior
No panic. try_cast_literal_to_type already returns None for casts it cannot express; a negative scale (the decimal holds multiples of 10^-scale, so there is no integer 10^scale to rescale by) should be one of them, leaving the cast in place.
Additional context
Found while running a corpus of extreme-value literals against a debug build of datafusion-cli.
Activity
fix: compare literals with negative-scale decimal columns without pan…
fix: compare literals exactly where DataFusion's coercion would not (#…
feat: send expression literals as typed payloads and read them agains…
test: Add regression tests for some `unwrap_cast` related bugs that d…