diff --git a/datafusion/core/tests/physical_optimizer/projection_pushdown.rs b/datafusion/core/tests/physical_optimizer/projection_pushdown.rs index b0b5f731063f..abe058df99d0 100644 --- a/datafusion/core/tests/physical_optimizer/projection_pushdown.rs +++ b/datafusion/core/tests/physical_optimizer/projection_pushdown.rs @@ -29,7 +29,9 @@ use datafusion_common::Result; use datafusion_common::{JoinSide, JoinType, ScalarValue}; use datafusion_execution::object_store::ObjectStoreUrl; use datafusion_execution::{SendableRecordBatchStream, TaskContext}; -use datafusion_expr::{Operator, ScalarUDF, ScalarUDFImpl, Signature, Volatility}; +use datafusion_expr::{ + Operator, ScalarFunctionArgs, ScalarUDF, ScalarUDFImpl, Signature, Volatility, +}; use datafusion_physical_expr::expressions::{ binary, cast, col, BinaryExpr, CaseExpr, CastExpr, Column, Literal, NegativeExpr, }; @@ -57,6 +59,7 @@ use datafusion_physical_plan::streaming::StreamingTableExec; use datafusion_physical_plan::union::UnionExec; use datafusion_physical_plan::{get_plan_string, ExecutionPlan}; +use datafusion_expr_common::columnar_value::ColumnarValue; use itertools::Itertools; /// Mocked UDF @@ -89,6 +92,10 @@ impl ScalarUDFImpl for DummyUDF { fn return_type(&self, _arg_types: &[DataType]) -> Result { Ok(DataType::Int32) } + + fn invoke_with_args(&self, _args: ScalarFunctionArgs) -> Result { + panic!("dummy - not implemented") + } } #[test] diff --git a/datafusion/core/tests/user_defined/user_defined_scalar_functions.rs b/datafusion/core/tests/user_defined/user_defined_scalar_functions.rs index 87694d83bb99..68684a81c656 100644 --- a/datafusion/core/tests/user_defined/user_defined_scalar_functions.rs +++ b/datafusion/core/tests/user_defined/user_defined_scalar_functions.rs @@ -679,6 +679,10 @@ impl ScalarUDFImpl for CastToI64UDF { Ok(DataType::Int64) } + fn invoke_with_args(&self, _args: ScalarFunctionArgs) -> Result { + panic!("dummy - not implemented") + } + // Demonstrate simplifying a UDF fn simplify( &self, @@ -946,6 +950,10 @@ impl ScalarUDFImpl for ScalarFunctionWrapper { Ok(self.return_type.clone()) } + fn invoke_with_args(&self, _args: ScalarFunctionArgs) -> Result { + panic!("dummy - not implemented") + } + fn simplify( &self, args: Vec, diff --git a/datafusion/expr/src/udf.rs b/datafusion/expr/src/udf.rs index 86bc5852b830..9b2400774a3d 100644 --- a/datafusion/expr/src/udf.rs +++ b/datafusion/expr/src/udf.rs @@ -20,9 +20,7 @@ use crate::expr::schema_name_from_exprs_comma_separated_without_space; use crate::simplify::{ExprSimplifyResult, SimplifyInfo}; use crate::sort_properties::{ExprProperties, SortProperties}; -use crate::{ - ColumnarValue, Documentation, Expr, ScalarFunctionImplementation, Signature, -}; +use crate::{ColumnarValue, Documentation, Expr, Signature}; use arrow::datatypes::DataType; use datafusion_common::{not_impl_err, ExprSchema, Result, ScalarValue}; use datafusion_expr_common::interval_arithmetic::Interval; @@ -198,27 +196,11 @@ impl ScalarUDF { self.inner.simplify(args, info) } - #[deprecated(since = "42.1.0", note = "Use `invoke_with_args` instead")] - pub fn invoke(&self, args: &[ColumnarValue]) -> Result { - #[allow(deprecated)] - self.inner.invoke(args) - } - #[allow(deprecated)] pub fn is_nullable(&self, args: &[Expr], schema: &dyn ExprSchema) -> bool { self.inner.is_nullable(args, schema) } - #[deprecated(since = "46.0.0", note = "Use `invoke_with_args` instead")] - pub fn invoke_batch( - &self, - args: &[ColumnarValue], - number_rows: usize, - ) -> Result { - #[allow(deprecated)] - self.inner.invoke_batch(args, number_rows) - } - /// Invoke the function on `args`, returning the appropriate result. /// /// See [`ScalarUDFImpl::invoke_with_args`] for details. @@ -226,25 +208,6 @@ impl ScalarUDF { self.inner.invoke_with_args(args) } - /// Invoke the function without `args` but number of rows, returning the appropriate result. - /// - /// Note: This method is deprecated and will be removed in future releases. - /// User defined functions should implement [`Self::invoke_with_args`] instead. - #[deprecated(since = "42.1.0", note = "Use `invoke_with_args` instead")] - pub fn invoke_no_args(&self, number_rows: usize) -> Result { - #[allow(deprecated)] - self.inner.invoke_no_args(number_rows) - } - - /// Returns a `ScalarFunctionImplementation` that can invoke the function - /// during execution - #[deprecated(since = "42.0.0", note = "Use `invoke_with_args` instead")] - pub fn fun(&self) -> ScalarFunctionImplementation { - let captured = Arc::clone(&self.inner); - #[allow(deprecated)] - Arc::new(move |args| captured.invoke(args)) - } - /// Get the circuits of inner implementation pub fn short_circuits(&self) -> bool { self.inner.short_circuits() @@ -568,47 +531,6 @@ pub trait ScalarUDFImpl: Debug + Send + Sync { true } - /// Invoke the function on `args`, returning the appropriate result - /// - /// Note: This method is deprecated and will be removed in future releases. - /// User defined functions should implement [`Self::invoke_with_args`] instead. - #[deprecated(since = "42.1.0", note = "Use `invoke_with_args` instead")] - fn invoke(&self, _args: &[ColumnarValue]) -> Result { - not_impl_err!( - "Function {} does not implement invoke but called", - self.name() - ) - } - - /// Invoke the function with `args` and the number of rows, - /// returning the appropriate result. - /// - /// Note: See notes on [`Self::invoke_with_args`] - /// - /// Note: This method is deprecated and will be removed in future releases. - /// User defined functions should implement [`Self::invoke_with_args`] instead. - /// - /// See for more details. - #[deprecated(since = "46.0.0", note = "Use `invoke_with_args` instead")] - fn invoke_batch( - &self, - args: &[ColumnarValue], - number_rows: usize, - ) -> Result { - match args.is_empty() { - true => - { - #[allow(deprecated)] - self.invoke_no_args(number_rows) - } - false => - { - #[allow(deprecated)] - self.invoke(args) - } - } - } - /// Invoke the function returning the appropriate result. /// /// # Performance @@ -619,23 +541,7 @@ pub trait ScalarUDFImpl: Debug + Send + Sync { /// /// [`ColumnarValue::values_to_arrays`] can be used to convert the arguments /// to arrays, which will likely be simpler code, but be slower. - fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result { - #[allow(deprecated)] - self.invoke_batch(&args.args, args.number_rows) - } - - /// Invoke the function without `args`, instead the number of rows are provided, - /// returning the appropriate result. - /// - /// Note: This method is deprecated and will be removed in future releases. - /// User defined functions should implement [`Self::invoke_with_args`] instead. - #[deprecated(since = "42.1.0", note = "Use `invoke_with_args` instead")] - fn invoke_no_args(&self, _number_rows: usize) -> Result { - not_impl_err!( - "Function {} does not implement invoke_no_args but called", - self.name() - ) - } + fn invoke_with_args(&self, args: ScalarFunctionArgs) -> Result; /// Returns any aliases (alternate names) for this function. /// diff --git a/datafusion/functions-nested/src/max.rs b/datafusion/functions-nested/src/max.rs index 22bd14740b5e..32957edc62b5 100644 --- a/datafusion/functions-nested/src/max.rs +++ b/datafusion/functions-nested/src/max.rs @@ -24,7 +24,9 @@ use datafusion_common::cast::as_list_array; use datafusion_common::utils::take_function_args; use datafusion_common::{exec_err, ScalarValue}; use datafusion_doc::Documentation; -use datafusion_expr::{ColumnarValue, ScalarUDFImpl, Signature, Volatility}; +use datafusion_expr::{ + ColumnarValue, ScalarFunctionArgs, ScalarUDFImpl, Signature, Volatility, +}; use datafusion_functions_aggregate::min_max; use datafusion_macros::user_doc; use itertools::Itertools; @@ -96,12 +98,11 @@ impl ScalarUDFImpl for ArrayMax { } } - fn invoke_batch( + fn invoke_with_args( &self, - args: &[ColumnarValue], - _number_rows: usize, + args: ScalarFunctionArgs, ) -> datafusion_common::Result { - make_scalar_function(array_max_inner)(args) + make_scalar_function(array_max_inner)(&args.args) } fn aliases(&self) -> &[String] { diff --git a/datafusion/optimizer/src/common_subexpr_eliminate.rs b/datafusion/optimizer/src/common_subexpr_eliminate.rs index 5dc1a7e5ac5b..69b5fbb9f8c0 100644 --- a/datafusion/optimizer/src/common_subexpr_eliminate.rs +++ b/datafusion/optimizer/src/common_subexpr_eliminate.rs @@ -797,8 +797,8 @@ mod test { use datafusion_expr::logical_plan::{table_scan, JoinType}; use datafusion_expr::{ grouping_set, is_null, not, AccumulatorFactoryFunction, AggregateUDF, - ColumnarValue, ScalarUDF, ScalarUDFImpl, Signature, SimpleAggregateUDF, - Volatility, + ColumnarValue, ScalarFunctionArgs, ScalarUDF, ScalarUDFImpl, Signature, + SimpleAggregateUDF, Volatility, }; use datafusion_expr::{lit, logical_plan::builder::LogicalPlanBuilder}; @@ -1598,7 +1598,7 @@ mod test { Ok(DataType::Int32) } - fn invoke(&self, _: &[ColumnarValue]) -> Result { + fn invoke_with_args(&self, _args: ScalarFunctionArgs) -> Result { panic!("not implemented") } } @@ -1705,5 +1705,9 @@ mod test { fn return_type(&self, _arg_types: &[DataType]) -> Result { Ok(DataType::Float64) } + + fn invoke_with_args(&self, _args: ScalarFunctionArgs) -> Result { + panic!("dummy - not implemented") + } } } diff --git a/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs b/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs index d5a1b84e6aff..ce10c7e5c631 100644 --- a/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs +++ b/datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs @@ -4307,6 +4307,10 @@ mod tests { fn return_type(&self, _arg_types: &[DataType]) -> Result { Ok(DataType::Int16) } + + fn invoke_with_args(&self, _args: ScalarFunctionArgs) -> Result { + panic!("dummy - not implemented") + } } #[test] diff --git a/datafusion/proto/tests/cases/mod.rs b/datafusion/proto/tests/cases/mod.rs index 25efa2690268..92d961fc7556 100644 --- a/datafusion/proto/tests/cases/mod.rs +++ b/datafusion/proto/tests/cases/mod.rs @@ -16,17 +16,17 @@ // under the License. use arrow::datatypes::{DataType, Field}; -use std::any::Any; -use std::fmt::Debug; - +use datafusion::logical_expr::ColumnarValue; use datafusion_common::plan_err; use datafusion_expr::function::AccumulatorArgs; use datafusion_expr::{ - Accumulator, AggregateUDFImpl, PartitionEvaluator, ScalarUDFImpl, Signature, - Volatility, WindowUDFImpl, + Accumulator, AggregateUDFImpl, PartitionEvaluator, ScalarFunctionArgs, ScalarUDFImpl, + Signature, Volatility, WindowUDFImpl, }; use datafusion_functions_window_common::field::WindowUDFFieldArgs; use datafusion_functions_window_common::partition::PartitionEvaluatorArgs; +use std::any::Any; +use std::fmt::Debug; mod roundtrip_logical_plan; mod roundtrip_physical_plan; @@ -69,6 +69,14 @@ impl ScalarUDFImpl for MyRegexUdf { plan_err!("regex_udf only accepts Utf8 arguments") } } + + fn invoke_with_args( + &self, + _args: ScalarFunctionArgs, + ) -> datafusion_common::Result { + panic!("dummy - not implemented") + } + fn aliases(&self) -> &[String] { &self.aliases } diff --git a/datafusion/sql/src/unparser/expr.rs b/datafusion/sql/src/unparser/expr.rs index 45c3e1c03d23..7905207fafb8 100644 --- a/datafusion/sql/src/unparser/expr.rs +++ b/datafusion/sql/src/unparser/expr.rs @@ -1661,8 +1661,8 @@ mod tests { use datafusion_expr::{ case, cast, col, cube, exists, grouping_set, interval_datetime_lit, interval_year_month_lit, lit, not, not_exists, out_ref_col, placeholder, rollup, - table_scan, try_cast, when, ScalarUDF, ScalarUDFImpl, Signature, Volatility, - WindowFrame, WindowFunctionDefinition, + table_scan, try_cast, when, ColumnarValue, ScalarFunctionArgs, ScalarUDF, + ScalarUDFImpl, Signature, Volatility, WindowFrame, WindowFunctionDefinition, }; use datafusion_expr::{interval_month_day_nano_lit, ExprFunctionExt}; use datafusion_functions::expr_fn::{get_field, named_struct}; @@ -1711,6 +1711,10 @@ mod tests { fn return_type(&self, _arg_types: &[DataType]) -> Result { Ok(DataType::Int32) } + + fn invoke_with_args(&self, _args: ScalarFunctionArgs) -> Result { + panic!("dummy - not implemented") + } } // See sql::tests for E2E tests. diff --git a/datafusion/sql/tests/sql_integration.rs b/datafusion/sql/tests/sql_integration.rs index 023ea88cb55f..5717f9943e59 100644 --- a/datafusion/sql/tests/sql_integration.rs +++ b/datafusion/sql/tests/sql_integration.rs @@ -30,8 +30,8 @@ use datafusion_expr::{ col, logical_plan::{LogicalPlan, Prepare}, test::function_stub::sum_udaf, - CreateIndex, DdlStatement, ScalarUDF, ScalarUDFImpl, Signature, Statement, - Volatility, + ColumnarValue, CreateIndex, DdlStatement, ScalarFunctionArgs, ScalarUDF, + ScalarUDFImpl, Signature, Statement, Volatility, }; use datafusion_functions::{string, unicode}; use datafusion_sql::{ @@ -2477,6 +2477,10 @@ impl ScalarUDFImpl for DummyUDF { fn return_type(&self, _arg_types: &[DataType]) -> Result { Ok(self.return_type.clone()) } + + fn invoke_with_args(&self, _args: ScalarFunctionArgs) -> Result { + panic!("dummy - not implemented") + } } /// Create logical plan, write with formatter, compare to expected output