From 5228bb31728eacb790dcbefda07b07a9d2d4b8f7 Mon Sep 17 00:00:00 2001 From: jiangzhx Date: Thu, 8 Jun 2023 12:50:00 +0800 Subject: [PATCH 1/2] Make the struct function return the correct data type. --- datafusion/expr/src/function.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/datafusion/expr/src/function.rs b/datafusion/expr/src/function.rs index ed5df5766720c..bec672ab6f6c3 100644 --- a/datafusion/expr/src/function.rs +++ b/datafusion/expr/src/function.rs @@ -352,7 +352,14 @@ pub fn return_type( _ => Ok(DataType::Float64), }, - BuiltinScalarFunction::Struct => Ok(DataType::Struct(Fields::empty())), + BuiltinScalarFunction::Struct => { + let return_fields = input_expr_types + .iter() + .enumerate() + .map(|(pos, dt)| Field::new(format!("c{pos}"), dt.clone(), true)) + .collect::>(); + Ok(DataType::Struct(Fields::from(return_fields))) + } BuiltinScalarFunction::Atan2 => match &input_expr_types[0] { DataType::Float32 => Ok(DataType::Float32), From 12f45b1e3094ba373003f67c1f15a3c83961104f Mon Sep 17 00:00:00 2001 From: jiangzhx Date: Thu, 8 Jun 2023 14:21:18 +0800 Subject: [PATCH 2/2] add testcase --- .../sqllogictests/test_files/functions.slt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/datafusion/core/tests/sqllogictests/test_files/functions.slt b/datafusion/core/tests/sqllogictests/test_files/functions.slt index 0cb54711cfbd7..b52dca5770679 100644 --- a/datafusion/core/tests/sqllogictests/test_files/functions.slt +++ b/datafusion/core/tests/sqllogictests/test_files/functions.slt @@ -458,3 +458,25 @@ SELECT v1, v2, ROWNUMBER() OVER(ORDER BY v1) from test; statement ok drop table test + +# Scalar function struct +statement ok +create table simple_struct_test ( + c1 boolean, + c2 INT, + c3 FLOAT, + c4 DOUBLE, + a VARCHAR, + b TEXT +) as select * +from (values + (true, 1,3.1,3.14,'str','text') +); + +query ? +SELECT struct(c1,c2,c3,c4,a,b) from simple_struct_test +---- +{c0: 1, c1: 1, c2: 3.1, c3: 3.14, c4: str, c5: text} + +statement ok +drop table simple_struct_test \ No newline at end of file