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