From 9acbb37f837774dbada0a6e91947ecf3a4c98224 Mon Sep 17 00:00:00 2001
From: wudidapaopao <664920313@qq.com>
Date: Sun, 20 Sep 2026 17:44:56 +0800
Subject: [PATCH] feat: decompose shared float64 avg aggregates
---
datafusion/expr/src/udaf.rs | 78 ++++-
datafusion/expr/src/utils.rs | 229 ++++++++++++++
datafusion/functions-aggregate/src/average.rs | 71 ++++-
.../aggregate_decomposition.rs | 291 ++++++++++++++++++
.../optimizer/src/simplify_expressions/mod.rs | 1 +
.../simplify_expressions/simplify_exprs.rs | 72 ++++-
.../sqllogictest/test_files/aggregate.slt | 14 +-
.../test_files/aggregates_simplify.slt | 21 ++
.../test_files/avg_to_sum_count.slt | 250 +++++++++++++++
.../optimizer_group_by_constant.slt | 7 +-
.../consumer/rel/aggregate_rel.rs | 3 +-
.../src/logical_plan/consumer/rel/mod.rs | 2 +-
.../logical_plan/consumer/rel/project_rel.rs | 3 +-
.../src/logical_plan/consumer/utils.rs | 223 +-------------
14 files changed, 1021 insertions(+), 244 deletions(-)
create mode 100644 datafusion/optimizer/src/simplify_expressions/aggregate_decomposition.rs
create mode 100644 datafusion/sqllogictest/test_files/avg_to_sum_count.slt
diff --git a/datafusion/expr/src/udaf.rs b/datafusion/expr/src/udaf.rs
index 458b39c969b6f..d3ee973164814 100644
--- a/datafusion/expr/src/udaf.rs
+++ b/datafusion/expr/src/udaf.rs
@@ -40,6 +40,7 @@ use crate::function::{
AccumulatorArgs, AggregateFunctionSimplification, StateFieldsArgs,
};
use crate::groups_accumulator::GroupsAccumulator;
+use crate::simplify::SimplifyContext;
use crate::udf_eq::UdfEq;
use crate::utils::AggregateOrderSensitivity;
use crate::utils::format_state_name;
@@ -312,6 +313,17 @@ impl AggregateUDF {
self.inner.simplify()
}
+ /// Returns this aggregate function's candidate decomposition, if any.
+ ///
+ /// See [`AggregateUDFImpl::decompose`] for more details.
+ pub fn decompose(
+ &self,
+ aggregate_function: &AggregateFunction,
+ info: &SimplifyContext,
+ ) -> Result