From bd9b33ceca3553431b6b328de93f1836bbd9e263 Mon Sep 17 00:00:00 2001 From: Andrew Lamb Date: Sun, 24 Mar 2024 18:38:48 -0400 Subject: [PATCH] Fix panic in `struct` function with mixed scalar/array arguments (#9775) --- datafusion/functions/src/core/struct.rs | 11 ++--------- datafusion/sqllogictest/test_files/struct.slt | 9 +++++++++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/datafusion/functions/src/core/struct.rs b/datafusion/functions/src/core/struct.rs index 2a8622f0a1ec..ac300e0abde3 100644 --- a/datafusion/functions/src/core/struct.rs +++ b/datafusion/functions/src/core/struct.rs @@ -47,17 +47,10 @@ fn array_struct(args: &[ArrayRef]) -> Result { Ok(Arc::new(StructArray::from(vec))) } + /// put values in a struct array. fn struct_expr(args: &[ColumnarValue]) -> Result { - let arrays = args - .iter() - .map(|x| { - Ok(match x { - ColumnarValue::Array(array) => array.clone(), - ColumnarValue::Scalar(scalar) => scalar.to_array()?.clone(), - }) - }) - .collect::>>()?; + let arrays = ColumnarValue::values_to_arrays(args)?; Ok(ColumnarValue::Array(array_struct(arrays.as_slice())?)) } #[derive(Debug)] diff --git a/datafusion/sqllogictest/test_files/struct.slt b/datafusion/sqllogictest/test_files/struct.slt index 936dedcc896e..1ab6f3908b53 100644 --- a/datafusion/sqllogictest/test_files/struct.slt +++ b/datafusion/sqllogictest/test_files/struct.slt @@ -58,6 +58,15 @@ select struct(a, b, c) from values; {c0: 2, c1: 2.2, c2: b} {c0: 3, c1: 3.3, c2: c} +# struct scalar function with columns and scalars +query ? +select struct(a, 'foo') from values; +---- +{c0: 1, c1: foo} +{c0: 2, c1: foo} +{c0: 3, c1: foo} + + # explain struct scalar function with columns #1 query TT explain select struct(a, b, c) from values;