@@ -21,7 +21,6 @@ use crate::utils::make_scalar_function;
2121use arrow:: compute;
2222use arrow_array:: { Array , ArrayRef , ListArray } ;
2323use arrow_buffer:: { BooleanBufferBuilder , NullBuffer , OffsetBuffer } ;
24- use arrow_schema:: DataType :: { FixedSizeList , LargeList , List } ;
2524use arrow_schema:: { DataType , Field , SortOptions } ;
2625use datafusion_common:: cast:: { as_list_array, as_string_array} ;
2726use datafusion_common:: { exec_err, Result } ;
@@ -67,19 +66,9 @@ impl ScalarUDFImpl for ArraySort {
6766
6867 fn return_type ( & self , arg_types : & [ DataType ] ) -> Result < DataType > {
6968 match & arg_types[ 0 ] {
70- List ( field) | FixedSizeList ( field, _) => Ok ( List ( Arc :: new ( Field :: new (
71- "item" ,
72- field. data_type ( ) . clone ( ) ,
73- true ,
74- ) ) ) ) ,
75- LargeList ( field) => Ok ( LargeList ( Arc :: new ( Field :: new (
76- "item" ,
77- field. data_type ( ) . clone ( ) ,
78- true ,
79- ) ) ) ) ,
80- _ => exec_err ! (
81- "Not reachable, data_type should be List, LargeList or FixedSizeList"
82- ) ,
69+ DataType :: Null => Ok ( DataType :: Null ) ,
70+ arg_type @ DataType :: List ( _) => Ok ( arg_type. clone ( ) ) ,
71+ arg_type => exec_err ! ( "{} does not support type {arg_type}" , self . name( ) ) ,
8372 }
8473 }
8574
@@ -98,6 +87,16 @@ pub fn array_sort_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
9887 return exec_err ! ( "array_sort expects one to three arguments" ) ;
9988 }
10089
90+ if args[ 0 ] . data_type ( ) . is_null ( ) {
91+ return Ok ( Arc :: clone ( & args[ 0 ] ) ) ;
92+ }
93+
94+ let list_array = as_list_array ( & args[ 0 ] ) ?;
95+ let row_count = list_array. len ( ) ;
96+ if row_count == 0 || list_array. value_type ( ) . is_null ( ) {
97+ return Ok ( Arc :: clone ( & args[ 0 ] ) ) ;
98+ }
99+
101100 let sort_option = match args. len ( ) {
102101 1 => None ,
103102 2 => {
@@ -118,12 +117,6 @@ pub fn array_sort_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
118117 _ => return exec_err ! ( "array_sort expects 1 to 3 arguments" ) ,
119118 } ;
120119
121- let list_array = as_list_array ( & args[ 0 ] ) ?;
122- let row_count = list_array. len ( ) ;
123- if row_count == 0 {
124- return Ok ( args[ 0 ] . clone ( ) ) ;
125- }
126-
127120 let mut array_lengths = vec ! [ ] ;
128121 let mut arrays = vec ! [ ] ;
129122 let mut valid = BooleanBufferBuilder :: new ( row_count) ;
0 commit comments