From 954a4bd806d72b8ad947494c994b601b0a1c8f91 Mon Sep 17 00:00:00 2001 From: xiedeyantu Date: Sun, 17 May 2026 00:28:26 +0800 Subject: [PATCH] fix date_trunc overflows converting extreme non-ns timestamps to nanoseconds --- datafusion/functions/src/datetime/date_trunc.rs | 8 +++++++- .../sqllogictest/test_files/datetime/timestamps.slt | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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');