From 93ff2122184139fc417f9270ad69020449c7afa1 Mon Sep 17 00:00:00 2001 From: jayzhan211 Date: Tue, 16 Jan 2024 20:13:39 +0800 Subject: [PATCH 1/3] fix struct Signed-off-by: jayzhan211 --- datafusion/sql/src/expr/value.rs | 28 ++++++++++---------- datafusion/sqllogictest/test_files/array.slt | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/datafusion/sql/src/expr/value.rs b/datafusion/sql/src/expr/value.rs index 9f88318ab21a..279a45bf876d 100644 --- a/datafusion/sql/src/expr/value.rs +++ b/datafusion/sql/src/expr/value.rs @@ -20,7 +20,7 @@ use arrow::compute::kernels::cast_utils::parse_interval_month_day_nano; use arrow::datatypes::DECIMAL128_MAX_PRECISION; use arrow_schema::DataType; use datafusion_common::{ - not_impl_err, plan_err, DFSchema, DataFusionError, Result, ScalarValue, + internal_err, not_impl_err, plan_err, DFSchema, DataFusionError, Result, ScalarValue, }; use datafusion_expr::expr::ScalarFunction; use datafusion_expr::expr::{BinaryExpr, Placeholder}; @@ -145,23 +145,23 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> { )?; match value { - Expr::Literal(_) => { - values.push(value); - } - Expr::ScalarFunction(ScalarFunction { - func_def: ScalarFunctionDefinition::BuiltIn(fun), + Expr::Literal(_) + // Array literal + | Expr::ScalarFunction(ScalarFunction { + func_def: + ScalarFunctionDefinition::BuiltIn(BuiltinScalarFunction::MakeArray), + .. + }) + // Struct literal + | Expr::ScalarFunction(ScalarFunction { + func_def: + ScalarFunctionDefinition::BuiltIn(BuiltinScalarFunction::Struct), .. }) => { - if fun == BuiltinScalarFunction::MakeArray { - values.push(value); - } else { - return not_impl_err!( - "ScalarFunctions without MakeArray are not supported: {value}" - ); - } + values.push(value); } _ => { - return not_impl_err!( + return internal_err!( "Arrays with elements other than literal are not supported: {value}" ); } diff --git a/datafusion/sqllogictest/test_files/array.slt b/datafusion/sqllogictest/test_files/array.slt index 6b45f204fefc..6e74a82b47f1 100644 --- a/datafusion/sqllogictest/test_files/array.slt +++ b/datafusion/sqllogictest/test_files/array.slt @@ -459,7 +459,7 @@ AS query error select [1, true, null] -query error DataFusion error: This feature is not implemented: ScalarFunctions without MakeArray are not supported: now() +query error SELECT [now()] query TTT From c884be168411023e4dbdb418ea508f90304269d3 Mon Sep 17 00:00:00 2001 From: jayzhan211 Date: Wed, 17 Jan 2024 08:50:02 +0800 Subject: [PATCH 2/3] add test Signed-off-by: jayzhan211 --- datafusion/sqllogictest/test_files/array.slt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/datafusion/sqllogictest/test_files/array.slt b/datafusion/sqllogictest/test_files/array.slt index 6e74a82b47f1..ffee40fa5fea 100644 --- a/datafusion/sqllogictest/test_files/array.slt +++ b/datafusion/sqllogictest/test_files/array.slt @@ -462,6 +462,16 @@ select [1, true, null] query error SELECT [now()] +query ? +select [struct('foo', 1)]; +---- +[{c0: foo, c1: 1}] + +query ? +select [struct('foo', [1,2,3])]; +---- +[{c0: foo, c1: [1, 2, 3]}] + query TTT select arrow_typeof(column1), arrow_typeof(column2), arrow_typeof(column3) from arrays; ---- From d257269c40285320d82758681357d65ab9b2e8f8 Mon Sep 17 00:00:00 2001 From: jayzhan211 Date: Thu, 18 Jan 2024 07:42:10 +0800 Subject: [PATCH 3/3] support functions Signed-off-by: jayzhan211 --- datafusion/sql/src/expr/value.rs | 42 ++++---------------- datafusion/sqllogictest/test_files/array.slt | 26 ++++++++---- 2 files changed, 27 insertions(+), 41 deletions(-) diff --git a/datafusion/sql/src/expr/value.rs b/datafusion/sql/src/expr/value.rs index 279a45bf876d..c0870cc54106 100644 --- a/datafusion/sql/src/expr/value.rs +++ b/datafusion/sql/src/expr/value.rs @@ -20,12 +20,12 @@ use arrow::compute::kernels::cast_utils::parse_interval_month_day_nano; use arrow::datatypes::DECIMAL128_MAX_PRECISION; use arrow_schema::DataType; use datafusion_common::{ - internal_err, not_impl_err, plan_err, DFSchema, DataFusionError, Result, ScalarValue, + not_impl_err, plan_err, DFSchema, DataFusionError, Result, ScalarValue, }; use datafusion_expr::expr::ScalarFunction; use datafusion_expr::expr::{BinaryExpr, Placeholder}; +use datafusion_expr::BuiltinScalarFunction; use datafusion_expr::{lit, Expr, Operator}; -use datafusion_expr::{BuiltinScalarFunction, ScalarFunctionDefinition}; use log::debug; use sqlparser::ast::{BinaryOperator, Expr as SQLExpr, Interval, Value}; use sqlparser::parser::ParserError::ParserError; @@ -135,38 +135,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> { elements: Vec, schema: &DFSchema, ) -> Result { - let mut values = Vec::with_capacity(elements.len()); - - for element in elements { - let value = self.sql_expr_to_logical_expr( - element, - schema, - &mut PlannerContext::new(), - )?; - - match value { - Expr::Literal(_) - // Array literal - | Expr::ScalarFunction(ScalarFunction { - func_def: - ScalarFunctionDefinition::BuiltIn(BuiltinScalarFunction::MakeArray), - .. - }) - // Struct literal - | Expr::ScalarFunction(ScalarFunction { - func_def: - ScalarFunctionDefinition::BuiltIn(BuiltinScalarFunction::Struct), - .. - }) => { - values.push(value); - } - _ => { - return internal_err!( - "Arrays with elements other than literal are not supported: {value}" - ); - } - } - } + let values = elements + .into_iter() + .map(|element| { + self.sql_expr_to_logical_expr(element, schema, &mut PlannerContext::new()) + }) + .collect::>>()?; Ok(Expr::ScalarFunction(ScalarFunction::new( BuiltinScalarFunction::MakeArray, diff --git a/datafusion/sqllogictest/test_files/array.slt b/datafusion/sqllogictest/test_files/array.slt index ffee40fa5fea..76f29142a9e4 100644 --- a/datafusion/sqllogictest/test_files/array.slt +++ b/datafusion/sqllogictest/test_files/array.slt @@ -456,21 +456,33 @@ AS FROM nested_arrays_with_repeating_elements ; +# Array literal + +## boolean coercion is not supported query error select [1, true, null] -query error -SELECT [now()] +## wrapped in array_length to get deterministic results +query I +SELECT array_length([now()]) +---- +1 +## array literal with functions query ? -select [struct('foo', 1)]; +select [abs(-1.2), sin(-1), log(2), ceil(3.141)] ---- -[{c0: foo, c1: 1}] +[1.2, -0.8414709848078965, 0.3010299801826477, 4.0] -query ? -select [struct('foo', [1,2,3])]; +## array literal with nested types +query ??? +select + [struct('foo', 1)], + [struct('foo', [1,2,3])], + [struct('foo', [struct(3, 'x')])] +; ---- -[{c0: foo, c1: [1, 2, 3]}] +[{c0: foo, c1: 1}] [{c0: foo, c1: [1, 2, 3]}] [{c0: foo, c1: [{c0: 3, c1: x}]}] query TTT select arrow_typeof(column1), arrow_typeof(column2), arrow_typeof(column3) from arrays;