1616// under the License.
1717
1818use arrow:: array:: { Array , Date32Array , Int32Array } ;
19+ use arrow:: compute:: cast;
1920use arrow:: compute:: kernels:: arity:: binary;
2021use arrow:: datatypes:: DataType ;
2122use datafusion:: common:: { utils:: take_function_args, DataFusionError , Result } ;
@@ -71,9 +72,22 @@ impl ScalarUDFImpl for SparkDateDiff {
7172 fn invoke_with_args ( & self , args : ScalarFunctionArgs ) -> Result < ColumnarValue > {
7273 let [ end_date, start_date] = take_function_args ( self . name ( ) , args. args ) ?;
7374
74- // Convert scalars to arrays for uniform processing
75- let end_arr = end_date. into_array ( 1 ) ?;
76- let start_arr = start_date. into_array ( 1 ) ?;
75+ // Determine target length (broadcast scalars to column length)
76+ let len = match ( & end_date, & start_date) {
77+ ( ColumnarValue :: Array ( a) , _) => a. len ( ) ,
78+ ( _, ColumnarValue :: Array ( a) ) => a. len ( ) ,
79+ _ => 1 ,
80+ } ;
81+
82+ // Convert both arguments to arrays of the same length
83+ let end_arr = end_date. into_array ( len) ?;
84+ let start_arr = start_date. into_array ( len) ?;
85+
86+ // Normalize dictionary arrays (important for Iceberg)
87+ let end_arr = arrow:: compute:: cast ( & end_arr, & DataType :: Date32 )
88+ . map_err ( |e| DataFusionError :: Execution ( e. to_string ( ) ) ) ?;
89+ let start_arr = arrow:: compute:: cast ( & start_arr, & DataType :: Date32 )
90+ . map_err ( |e| DataFusionError :: Execution ( e. to_string ( ) ) ) ?;
7791
7892 let end_date_array = end_arr
7993 . as_any ( )
@@ -97,8 +111,4 @@ impl ScalarUDFImpl for SparkDateDiff {
97111
98112 Ok ( ColumnarValue :: Array ( Arc :: new ( result) ) )
99113 }
100-
101- fn aliases ( & self ) -> & [ String ] {
102- & self . aliases
103- }
104114}
0 commit comments