From 7a4558d258d9ade84301318240da0f183c49d4bc Mon Sep 17 00:00:00 2001 From: 1fanwang <1fannnw@gmail.com> Date: Fri, 2 Oct 2026 03:23:03 -0700 Subject: [PATCH 1/2] fix: skip unsafe SUM literal rewrites Signed-off-by: 1fanwang <1fannnw@gmail.com> --- datafusion/functions-aggregate/src/sum.rs | 3 ++ .../test_files/aggregates_simplify.slt | 40 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/datafusion/functions-aggregate/src/sum.rs b/datafusion/functions-aggregate/src/sum.rs index 1228b458a82b9..f613fc50ccf63 100644 --- a/datafusion/functions-aggregate/src/sum.rs +++ b/datafusion/functions-aggregate/src/sum.rs @@ -397,6 +397,9 @@ impl AggregateUDFImpl for Sum { if lit_type == DataType::Null { return Ok(None); } + if !(lit_type.is_integer() || lit_type.is_floating()) { + return Ok(None); + } // Build up SUM(arg) let mut sum_agg = agg_function.clone(); diff --git a/datafusion/sqllogictest/test_files/aggregates_simplify.slt b/datafusion/sqllogictest/test_files/aggregates_simplify.slt index 4169707913fb2..9e814633b69d0 100644 --- a/datafusion/sqllogictest/test_files/aggregates_simplify.slt +++ b/datafusion/sqllogictest/test_files/aggregates_simplify.slt @@ -115,6 +115,46 @@ physical_plan 02)--AggregateExec: mode=Single, gby=[], aggr=[sum(sum_simplify_t.column1), count(sum_simplify_t.column1)] 03)----DataSourceExec: partitions=1, partition_sizes=[1] +statement ok +CREATE TABLE sum_simplify_decimal_interval_t AS +SELECT + CAST(v AS DECIMAL(10,2)) AS d, + CAST(v || ' days' AS INTERVAL) AS iv +FROM generate_series(1, 12) AS g(v); + +query ?? +SELECT + SUM(iv + INTERVAL '1 day') AS a, + SUM(iv + INTERVAL '2 days') AS b +FROM sum_simplify_decimal_interval_t; +---- +90 days 102 days + +statement ok +SET datafusion.sql_parser.parse_float_as_decimal = true; + +query RR +SELECT + SUM(d + 1.5) AS a, + SUM(d + 2.5) AS b +FROM sum_simplify_decimal_interval_t; +---- +96.00 108.00 + +query RTRT +SELECT + SUM(d + 1.00001) AS a, + arrow_typeof(SUM(d + 1.00001)) AS a_type, + SUM(d + 2.00001) AS b, + arrow_typeof(SUM(d + 2.00001)) AS b_type +FROM sum_simplify_decimal_interval_t +WHERE d <= 5; +---- +20.00005 Decimal128(24, 5) 25.00005 Decimal128(24, 5) + +statement ok +SET datafusion.sql_parser.parse_float_as_decimal = false; + # Reordered expressions that still compute the same thing query II SELECT SUM(1 + column1), SUM(column1 + 2) FROM sum_simplify_t; From 895c66e56d2b96077ce284ec799340845f007c00 Mon Sep 17 00:00:00 2001 From: 1fanwang <1fannnw@gmail.com> Date: Thu, 22 Oct 2026 22:44:00 -0700 Subject: [PATCH 2/2] docs: explain SUM literal rewrite type restriction Signed-off-by: 1fanwang <1fannnw@gmail.com> --- datafusion/functions-aggregate/src/sum.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/datafusion/functions-aggregate/src/sum.rs b/datafusion/functions-aggregate/src/sum.rs index f613fc50ccf63..7654f842b14b0 100644 --- a/datafusion/functions-aggregate/src/sum.rs +++ b/datafusion/functions-aggregate/src/sum.rs @@ -397,6 +397,9 @@ impl AggregateUDFImpl for Sum { if lit_type == DataType::Null { return Ok(None); } + // `CAST(COUNT(arg) AS )` is not valid for intervals, and for + // decimals it can overflow or change the SUM result type. + // See https://github.com/apache/datafusion/issues/25943 if !(lit_type.is_integer() || lit_type.is_floating()) { return Ok(None); }