From 5eba49353e1ba0dd6837ddaf9dcedaf76c9de1a2 Mon Sep 17 00:00:00 2001 From: Jiawei Zhao Date: Fri, 6 Nov 2026 15:07:31 +0800 Subject: [PATCH] fix: ignore ordering in approx_median Sort keys must not be treated as percentile arguments by the shared accumulator. CLOSES #27157 --- datafusion/functions-aggregate/src/approx_median.rs | 6 +++++- datafusion/sqllogictest/test_files/aggregate.slt | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/datafusion/functions-aggregate/src/approx_median.rs b/datafusion/functions-aggregate/src/approx_median.rs index 575f31864c281..2598ce400a6d2 100644 --- a/datafusion/functions-aggregate/src/approx_median.rs +++ b/datafusion/functions-aggregate/src/approx_median.rs @@ -13,7 +13,7 @@ use std::sync::Arc; use datafusion_common::{Result, not_impl_err}; use datafusion_expr::function::{AccumulatorArgs, StateFieldsArgs}; -use datafusion_expr::utils::format_state_name; +use datafusion_expr::utils::{AggregateOrderSensitivity, format_state_name}; use datafusion_expr::{ Accumulator, AggregateUDFImpl, Coercion, Documentation, Signature, TypeSignature, TypeSignatureClass, Volatility, @@ -137,6 +137,10 @@ impl AggregateUDFImpl for ApproxMedian { } } + fn order_sensitivity(&self) -> AggregateOrderSensitivity { + AggregateOrderSensitivity::Insensitive + } + fn documentation(&self) -> Option<&Documentation> { self.doc() } diff --git a/datafusion/sqllogictest/test_files/aggregate.slt b/datafusion/sqllogictest/test_files/aggregate.slt index 1e12ee4194a49..d085ec35e9113 100644 --- a/datafusion/sqllogictest/test_files/aggregate.slt +++ b/datafusion/sqllogictest/test_files/aggregate.slt @@ -759,6 +759,14 @@ SELECT approx_median(c12) FROM aggregate_test_100 statement error SELECT approx_median(c1) FROM aggregate_test_100 +# APPROX_MEDIAN ignores aggregate ORDER BY keys. They must not be interpreted +# as percentile arguments by the shared accumulator. +query R +SELECT approx_median(x ORDER BY k) +FROM (VALUES (1.0, 3), (2.0, 1), (3.0, 2)) t(x, k) +---- +2 + # csv_query_median_1 query R SELECT median(c2) FROM aggregate_test_100