@@ -20,7 +20,7 @@ use arrow::datatypes::{DataType, Field, FieldRef};
2020use datafusion_common:: cast:: { as_int64_array, as_list_array} ;
2121use datafusion_common:: utils:: ListCoercion ;
2222use datafusion_common:: {
23- DataFusionError , Result , exec_err, internal_err, utils:: take_function_args,
23+ Result , ScalarValue , exec_err, internal_err, utils:: take_function_args,
2424} ;
2525use datafusion_expr:: {
2626 ArrayFunctionArgument , ArrayFunctionSignature , ColumnarValue , ReturnFieldArgs ,
@@ -91,8 +91,10 @@ impl ScalarUDFImpl for SparkSlice {
9191 & self ,
9292 mut func_args : ScalarFunctionArgs ,
9393 ) -> Result < ColumnarValue > {
94- if func_args. args [ 0 ] . data_type ( ) == DataType :: Null {
95- return Ok ( func_args. args [ 0 ] . clone ( ) ) ;
94+ if func_args. args [ 0 ] . data_type ( ) == DataType :: Null
95+ && let Some ( result) = check_null_types ( & func_args. args [ 0 ] )
96+ {
97+ return Ok ( result) ;
9698 }
9799
98100 let array_len = func_args
@@ -129,6 +131,16 @@ impl ScalarUDFImpl for SparkSlice {
129131 }
130132}
131133
134+ fn check_null_types ( cv : & ColumnarValue ) -> Option < ColumnarValue > {
135+ match cv {
136+ ColumnarValue :: Scalar ( ScalarValue :: Null ) => {
137+ Some ( ColumnarValue :: create_null_array ( 1 ) )
138+ }
139+ ColumnarValue :: Array ( _) => Some ( cv. clone ( ) ) ,
140+ _ => None ,
141+ }
142+ }
143+
132144fn calculate_start_end ( args : & [ ArrayRef ] ) -> Result < ( ArrayRef , ArrayRef ) > {
133145 let [ values, start, length] = take_function_args ( "slice" , args) ?;
134146
@@ -205,6 +217,6 @@ mod tests {
205217 } ;
206218 let slice = SparkSlice :: new ( ) ;
207219 let result = slice. invoke_with_args ( args) . unwrap ( ) ;
208- assert_eq ! ( result. to_array( 1 ) . unwrap( ) , Arc :: new( NullArray :: new( 1 ) ) ) ;
220+ assert_eq ! ( * result. to_array( 1 ) . unwrap( ) , * Arc :: new( NullArray :: new( 1 ) ) ) ;
209221 }
210222}
0 commit comments