diff --git a/datafusion/core/tests/fuzz_cases/aggregate_fuzz.rs b/datafusion/core/tests/fuzz_cases/aggregate_fuzz.rs index 5cc5157c3af9..b0852501415e 100644 --- a/datafusion/core/tests/fuzz_cases/aggregate_fuzz.rs +++ b/datafusion/core/tests/fuzz_cases/aggregate_fuzz.rs @@ -254,10 +254,8 @@ async fn test_basic_string_aggr_group_by_single_int64() { let fuzzer = builder .data_gen_config(data_gen_config) .data_gen_rounds(8) - // FIXME: Encounter error in min/max - // ArrowError(InvalidArgumentError("number of columns(1) must match number of fields(2) in schema")) - // .add_sql("SELECT b, max(a) FROM fuzz_table GROUP BY b") - // .add_sql("SELECT b, min(a) FROM fuzz_table GROUP BY b") + .add_sql("SELECT b, max(a) FROM fuzz_table GROUP BY b") + .add_sql("SELECT b, min(a) FROM fuzz_table GROUP BY b") .add_sql("SELECT b, count(a) FROM fuzz_table GROUP BY b") .add_sql("SELECT b, count(distinct a) FROM fuzz_table GROUP BY b") .table_name("fuzz_table") @@ -291,10 +289,8 @@ async fn test_basic_string_aggr_group_by_single_string() { let fuzzer = builder .data_gen_config(data_gen_config) .data_gen_rounds(16) - // FIXME: Encounter error in min/max - // ArrowError(InvalidArgumentError("number of columns(1) must match number of fields(2) in schema")) - // .add_sql("SELECT b, max(a) FROM fuzz_table GROUP BY b") - // .add_sql("SELECT b, min(a) FROM fuzz_table GROUP BY b") + .add_sql("SELECT b, max(a) FROM fuzz_table GROUP BY b") + .add_sql("SELECT b, min(a) FROM fuzz_table GROUP BY b") .add_sql("SELECT b, count(a) FROM fuzz_table GROUP BY b") .add_sql("SELECT b, count(distinct a) FROM fuzz_table GROUP BY b") .table_name("fuzz_table") @@ -329,10 +325,8 @@ async fn test_basic_string_aggr_group_by_mixed_string_int64() { let fuzzer = builder .data_gen_config(data_gen_config) .data_gen_rounds(16) - // FIXME: Encounter error in min/max - // ArrowError(InvalidArgumentError("number of columns(1) must match number of fields(2) in schema")) - // .add_sql("SELECT b, c, max(a) FROM fuzz_table GROUP BY b, c") - // .add_sql("SELECT b, c, min(a) FROM fuzz_table GROUP BY b, c") + .add_sql("SELECT b, c, max(a) FROM fuzz_table GROUP BY b, c") + .add_sql("SELECT b, c, min(a) FROM fuzz_table GROUP BY b, c") .add_sql("SELECT b, c, count(a) FROM fuzz_table GROUP BY b, c") .add_sql("SELECT b, c, count(distinct a) FROM fuzz_table GROUP BY b, c") .table_name("fuzz_table") diff --git a/datafusion/functions-aggregate-common/src/aggregate/groups_accumulator.rs b/datafusion/functions-aggregate-common/src/aggregate/groups_accumulator.rs index fbbf4d303515..b03df0224089 100644 --- a/datafusion/functions-aggregate-common/src/aggregate/groups_accumulator.rs +++ b/datafusion/functions-aggregate-common/src/aggregate/groups_accumulator.rs @@ -23,6 +23,7 @@ pub mod bool_op; pub mod nulls; pub mod prim_op; +use arrow::array::new_empty_array; use arrow::{ array::{ArrayRef, AsArray, BooleanArray, PrimitiveArray}, compute, @@ -405,6 +406,18 @@ impl GroupsAccumulator for GroupsAccumulatorAdapter { ) -> Result<Vec<ArrayRef>> { let num_rows = values[0].len(); + // If there are no rows, return empty arrays + if num_rows == 0 { + // create empty accumulator to get the state types + let empty_state = (self.factory)()?.state()?; + let empty_arrays = empty_state + .into_iter() + .map(|state_val| new_empty_array(&state_val.data_type())) + .collect::<Vec<_>>(); + + return Ok(empty_arrays); + } + // Each row has its respective group let mut results = vec![]; for row_idx in 0..num_rows {