diff --git a/datafusion/functions/src/datetime/date_trunc.rs b/datafusion/functions/src/datetime/date_trunc.rs index a97fd138ecb12..784f593c2529d 100644 --- a/datafusion/functions/src/datetime/date_trunc.rs +++ b/datafusion/functions/src/datetime/date_trunc.rs @@ -718,7 +718,13 @@ fn general_date_trunc( }; // convert to nanoseconds - let nano = date_trunc_coarse(granularity, scale * value, tz)?; + let nano = date_trunc_coarse( + granularity, + value + .checked_mul(scale) + .ok_or_else(|| exec_datafusion_err!("Timestamp {value} out of range"))?, + tz, + )?; let result = match tu { Second => match granularity { diff --git a/datafusion/sqllogictest/test_files/datetime/timestamps.slt b/datafusion/sqllogictest/test_files/datetime/timestamps.slt index 875d7aa4c478d..d6e50f560aaf0 100644 --- a/datafusion/sqllogictest/test_files/datetime/timestamps.slt +++ b/datafusion/sqllogictest/test_files/datetime/timestamps.slt @@ -2428,6 +2428,12 @@ SELECT arrow_typeof(date_trunc('hour', TIME '14:30:45')); ---- Time64(ns) +query error DataFusion error: Execution error: Timestamp 9223372036854775807 out of range +SELECT date_trunc( + 'hour', + arrow_cast(9223372036854775807, 'Timestamp(Second, None)') +); + # Error for granularities not valid for Time types query error date_trunc does not support 'day' granularity for Time types SELECT date_trunc('day', TIME '14:30:45');