@@ -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,10 @@ 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+ let is_null_input = check_null_types ( & func_args. args [ 0 ] ) ;
101+ if is_null_input. is_some ( ) {
102+ return Ok ( is_null_input. unwrap ( ) ) ;
103+ }
101104 }
102105
103106 let array_len = func_args
@@ -134,6 +137,16 @@ impl ScalarUDFImpl for SparkSlice {
134137 }
135138}
136139
140+ fn check_null_types ( cv : & ColumnarValue ) -> Option < ColumnarValue > {
141+ match cv {
142+ ColumnarValue :: Scalar ( ScalarValue :: Null ) => {
143+ Some ( ColumnarValue :: create_null_array ( 1 ) )
144+ }
145+ ColumnarValue :: Array ( _) => Some ( cv. clone ( ) ) ,
146+ _ => None ,
147+ }
148+ }
149+
137150fn calculate_start_end ( args : & [ ArrayRef ] ) -> Result < ( ArrayRef , ArrayRef ) > {
138151 let [ values, start, length] = take_function_args ( "slice" , args) ?;
139152
@@ -210,6 +223,6 @@ mod tests {
210223 } ;
211224 let slice = SparkSlice :: new ( ) ;
212225 let result = slice. invoke_with_args ( args) . unwrap ( ) ;
213- assert_eq ! ( result. to_array( 1 ) . unwrap( ) , Arc :: new( NullArray :: new( 1 ) ) ) ;
226+ assert_eq ! ( * result. to_array( 1 ) . unwrap( ) , * Arc :: new( NullArray :: new( 1 ) ) ) ;
214227 }
215228}
0 commit comments