@@ -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 ,
@@ -97,7 +97,9 @@ impl ScalarUDFImpl for SparkSlice {
9797 mut func_args : ScalarFunctionArgs ,
9898 ) -> Result < ColumnarValue > {
9999 if func_args. args [ 0 ] . data_type ( ) == DataType :: Null {
100- return Ok ( func_args. args [ 0 ] . clone ( ) ) ;
100+ if let Some ( result) = check_null_types ( & func_args. args [ 0 ] ) {
101+ return Ok ( result) ;
102+ }
101103 }
102104
103105 let array_len = func_args
@@ -134,6 +136,16 @@ impl ScalarUDFImpl for SparkSlice {
134136 }
135137}
136138
139+ fn check_null_types ( cv : & ColumnarValue ) -> Option < ColumnarValue > {
140+ match cv {
141+ ColumnarValue :: Scalar ( ScalarValue :: Null ) => {
142+ Some ( ColumnarValue :: create_null_array ( 1 ) )
143+ }
144+ ColumnarValue :: Array ( _) => Some ( cv. clone ( ) ) ,
145+ _ => None ,
146+ }
147+ }
148+
137149fn calculate_start_end ( args : & [ ArrayRef ] ) -> Result < ( ArrayRef , ArrayRef ) > {
138150 let [ values, start, length] = take_function_args ( "slice" , args) ?;
139151
@@ -210,6 +222,6 @@ mod tests {
210222 } ;
211223 let slice = SparkSlice :: new ( ) ;
212224 let result = slice. invoke_with_args ( args) . unwrap ( ) ;
213- assert_eq ! ( result. to_array( 1 ) . unwrap( ) , Arc :: new( NullArray :: new( 1 ) ) ) ;
225+ assert_eq ! ( * result. to_array( 1 ) . unwrap( ) , * Arc :: new( NullArray :: new( 1 ) ) ) ;
214226 }
215227}
0 commit comments