diff --git a/datafusion/functions-aggregate/src/array_agg.rs b/datafusion/functions-aggregate/src/array_agg.rs index 0aa346e91a310..f5df554d8bc32 100644 --- a/datafusion/functions-aggregate/src/array_agg.rs +++ b/datafusion/functions-aggregate/src/array_agg.rs @@ -17,6 +17,7 @@ //! `ARRAY_AGG` aggregate implementation: [`ArrayAgg`] +use std::any::Any; use std::cmp::Ordering; use std::collections::{HashSet, VecDeque}; use std::mem::{size_of, size_of_val}; @@ -89,7 +90,7 @@ impl Default for ArrayAgg { } impl AggregateUDFImpl for ArrayAgg { - fn as_any(&self) -> &dyn std::any::Any { + fn as_any(&self) -> &dyn Any { self } diff --git a/datafusion/functions-aggregate/src/string_agg.rs b/datafusion/functions-aggregate/src/string_agg.rs index 56c5ee1aaa676..5bf9020cd16ad 100644 --- a/datafusion/functions-aggregate/src/string_agg.rs +++ b/datafusion/functions-aggregate/src/string_agg.rs @@ -178,6 +178,10 @@ impl AggregateUDFImpl for StringAgg { ))) } + fn reverse_expr(&self) -> datafusion_expr::ReversedUDAF { + datafusion_expr::ReversedUDAF::Reversed(string_agg_udaf()) + } + fn documentation(&self) -> Option<&Documentation> { self.doc() } diff --git a/datafusion/sqllogictest/test_files/aggregate.slt b/datafusion/sqllogictest/test_files/aggregate.slt index bdf327c98248a..068114bc35d62 100644 --- a/datafusion/sqllogictest/test_files/aggregate.slt +++ b/datafusion/sqllogictest/test_files/aggregate.slt @@ -6028,6 +6028,84 @@ GROUP BY dummy ---- text1 + +# Test string_agg with ORDER BY clasuses (issue #17011) +statement ok +create table t (k varchar, v int); + +statement ok +insert into t values ('a', 2), ('b', 3), ('c', 1), ('d', null); + +query T +select string_agg(k, ',' order by k) from t; +---- +a,b,c,d + +query T +select string_agg(k, ',' order by k desc) from t; +---- +d,c,b,a + +query T +select string_agg(k, ',' order by v) from t; +---- +c,a,b,d + +query T +select string_agg(k, ',' order by v nulls first) from t; +---- +d,c,a,b + +query T +select string_agg(k, ',' order by v desc) from t; +---- +d,b,a,c + +query T +select string_agg(k, ',' order by v desc nulls last) from t; +---- +b,a,c,d + +query T +-- odd indexes should appear first, ties solved by v +select string_agg(k, ',' order by v % 2 == 0, v) from t; +---- +c,b,a,d + +query T +-- odd indexes should appear first, ties solved by v desc +select string_agg(k, ',' order by v % 2 == 0, v desc) from t; +---- +b,c,a,d + +query T +select string_agg(k, ',' order by + case + when k = 'a' then 3 + when k = 'b' then 0 + when k = 'c' then 2 + when k = 'd' then 1 + end) +from t; +---- +b,d,c,a + +query T +select string_agg(k, ',' order by + case + when k = 'a' then 3 + when k = 'b' then 0 + when k = 'c' then 2 + when k = 'd' then 1 + end desc) +from t; +---- +a,c,d,b + +statement ok +drop table t; + + # Tests for aggregating with NaN values statement ok CREATE TABLE float_table ( diff --git a/parquet-testing b/parquet-testing index 107b36603e051..4cf674fc58930 160000 --- a/parquet-testing +++ b/parquet-testing @@ -1 +1 @@ -Subproject commit 107b36603e051aee26bd93e04b871034f6c756c0 +Subproject commit 4cf674fc589309ba8651ad676f3fb557582d9cab diff --git a/testing b/testing index d2a1371230349..6a7b02fac93d8 160000 --- a/testing +++ b/testing @@ -1 +1 @@ -Subproject commit d2a13712303498963395318a4eb42872e66aead7 +Subproject commit 6a7b02fac93d8addbcdbb213264e58bfdc3068e4