@@ -472,6 +472,10 @@ where
472472/// For example:
473473/// > array_element(\[1, 2, 3], 2) -> 2
474474pub fn array_element ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
475+ if args. len ( ) != 2 {
476+ return exec_err ! ( "array_element needs two arguments" ) ;
477+ }
478+
475479 match & args[ 0 ] . data_type ( ) {
476480 DataType :: List ( _) => {
477481 let array = as_list_array ( & args[ 0 ] ) ?;
@@ -585,6 +589,10 @@ pub fn array_except(args: &[ArrayRef]) -> Result<ArrayRef> {
585589///
586590/// See test cases in `array.slt` for more details.
587591pub fn array_slice ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
592+ if args. len ( ) != 3 {
593+ return exec_err ! ( "array_slice needs three arguments" ) ;
594+ }
595+
588596 let array_data_type = args[ 0 ] . data_type ( ) ;
589597 match array_data_type {
590598 DataType :: List ( _) => {
@@ -736,6 +744,10 @@ where
736744
737745/// array_pop_back SQL function
738746pub fn array_pop_back ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
747+ if args. len ( ) != 1 {
748+ return exec_err ! ( "array_pop_back needs one argument" ) ;
749+ }
750+
739751 let list_array = as_list_array ( & args[ 0 ] ) ?;
740752 let from_array = Int64Array :: from ( vec ! [ 1 ; list_array. len( ) ] ) ;
741753 let to_array = Int64Array :: from (
@@ -885,6 +897,10 @@ pub fn array_pop_front(args: &[ArrayRef]) -> Result<ArrayRef> {
885897
886898/// Array_append SQL function
887899pub fn array_append ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
900+ if args. len ( ) != 2 {
901+ return exec_err ! ( "array_append expects two arguments" ) ;
902+ }
903+
888904 let list_array = as_list_array ( & args[ 0 ] ) ?;
889905 let element_array = & args[ 1 ] ;
890906
@@ -911,6 +927,10 @@ pub fn array_append(args: &[ArrayRef]) -> Result<ArrayRef> {
911927
912928/// Array_sort SQL function
913929pub fn array_sort ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
930+ if args. is_empty ( ) || args. len ( ) > 3 {
931+ return exec_err ! ( "array_sort expects one to three arguments" ) ;
932+ }
933+
914934 let sort_option = match args. len ( ) {
915935 1 => None ,
916936 2 => {
@@ -990,6 +1010,10 @@ fn order_nulls_first(modifier: &str) -> Result<bool> {
9901010
9911011/// Array_prepend SQL function
9921012pub fn array_prepend ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1013+ if args. len ( ) != 2 {
1014+ return exec_err ! ( "array_prepend expects two arguments" ) ;
1015+ }
1016+
9931017 let list_array = as_list_array ( & args[ 1 ] ) ?;
9941018 let element_array = & args[ 0 ] ;
9951019
@@ -1110,6 +1134,10 @@ fn concat_internal(args: &[ArrayRef]) -> Result<ArrayRef> {
11101134
11111135/// Array_concat/Array_cat SQL function
11121136pub fn array_concat ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1137+ if args. is_empty ( ) {
1138+ return exec_err ! ( "array_concat expects at least one arguments" ) ;
1139+ }
1140+
11131141 let mut new_args = vec ! [ ] ;
11141142 for arg in args {
11151143 let ndim = list_ndims ( arg. data_type ( ) ) ;
@@ -1126,6 +1154,10 @@ pub fn array_concat(args: &[ArrayRef]) -> Result<ArrayRef> {
11261154
11271155/// Array_empty SQL function
11281156pub fn array_empty ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1157+ if args. len ( ) != 1 {
1158+ return exec_err ! ( "array_empty expects one argument" ) ;
1159+ }
1160+
11291161 if as_null_array ( & args[ 0 ] ) . is_ok ( ) {
11301162 // Make sure to return Boolean type.
11311163 return Ok ( Arc :: new ( BooleanArray :: new_null ( args[ 0 ] . len ( ) ) ) ) ;
@@ -1150,6 +1182,10 @@ fn array_empty_dispatch<O: OffsetSizeTrait>(array: &ArrayRef) -> Result<ArrayRef
11501182
11511183/// Array_repeat SQL function
11521184pub fn array_repeat ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1185+ if args. len ( ) != 2 {
1186+ return exec_err ! ( "array_repeat expects two arguments" ) ;
1187+ }
1188+
11531189 let element = & args[ 0 ] ;
11541190 let count_array = as_int64_array ( & args[ 1 ] ) ?;
11551191
@@ -1285,6 +1321,10 @@ fn general_list_repeat(
12851321
12861322/// Array_position SQL function
12871323pub fn array_position ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1324+ if args. len ( ) < 2 || args. len ( ) > 3 {
1325+ return exec_err ! ( "array_position expects two or three arguments" ) ;
1326+ }
1327+
12881328 let list_array = as_list_array ( & args[ 0 ] ) ?;
12891329 let element_array = & args[ 1 ] ;
12901330
@@ -1349,6 +1389,10 @@ fn general_position<OffsetSize: OffsetSizeTrait>(
13491389
13501390/// Array_positions SQL function
13511391pub fn array_positions ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1392+ if args. len ( ) != 2 {
1393+ return exec_err ! ( "array_positions expects two arguments" ) ;
1394+ }
1395+
13521396 let element = & args[ 1 ] ;
13531397
13541398 match & args[ 0 ] . data_type ( ) {
@@ -1508,16 +1552,28 @@ fn array_remove_internal(
15081552}
15091553
15101554pub fn array_remove_all ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1555+ if args. len ( ) != 2 {
1556+ return exec_err ! ( "array_remove_all expects two arguments" ) ;
1557+ }
1558+
15111559 let arr_n = vec ! [ i64 :: MAX ; args[ 0 ] . len( ) ] ;
15121560 array_remove_internal ( & args[ 0 ] , & args[ 1 ] , arr_n)
15131561}
15141562
15151563pub fn array_remove ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1564+ if args. len ( ) != 2 {
1565+ return exec_err ! ( "array_remove expects two arguments" ) ;
1566+ }
1567+
15161568 let arr_n = vec ! [ 1 ; args[ 0 ] . len( ) ] ;
15171569 array_remove_internal ( & args[ 0 ] , & args[ 1 ] , arr_n)
15181570}
15191571
15201572pub fn array_remove_n ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1573+ if args. len ( ) != 3 {
1574+ return exec_err ! ( "array_remove_n expects three arguments" ) ;
1575+ }
1576+
15211577 let arr_n = as_int64_array ( & args[ 2 ] ) ?. values ( ) . to_vec ( ) ;
15221578 array_remove_internal ( & args[ 0 ] , & args[ 1 ] , arr_n)
15231579}
@@ -1634,6 +1690,10 @@ fn general_replace<O: OffsetSizeTrait>(
16341690}
16351691
16361692pub fn array_replace ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1693+ if args. len ( ) != 3 {
1694+ return exec_err ! ( "array_replace expects three arguments" ) ;
1695+ }
1696+
16371697 // replace at most one occurence for each element
16381698 let arr_n = vec ! [ 1 ; args[ 0 ] . len( ) ] ;
16391699 let array = & args[ 0 ] ;
@@ -1651,6 +1711,10 @@ pub fn array_replace(args: &[ArrayRef]) -> Result<ArrayRef> {
16511711}
16521712
16531713pub fn array_replace_n ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1714+ if args. len ( ) != 4 {
1715+ return exec_err ! ( "array_replace_n expects four arguments" ) ;
1716+ }
1717+
16541718 // replace the specified number of occurences
16551719 let arr_n = as_int64_array ( & args[ 3 ] ) ?. values ( ) . to_vec ( ) ;
16561720 let array = & args[ 0 ] ;
@@ -1670,6 +1734,10 @@ pub fn array_replace_n(args: &[ArrayRef]) -> Result<ArrayRef> {
16701734}
16711735
16721736pub fn array_replace_all ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1737+ if args. len ( ) != 3 {
1738+ return exec_err ! ( "array_replace_all expects three arguments" ) ;
1739+ }
1740+
16731741 // replace all occurrences (up to "i64::MAX")
16741742 let arr_n = vec ! [ i64 :: MAX ; args[ 0 ] . len( ) ] ;
16751743 let array = & args[ 0 ] ;
@@ -1760,7 +1828,7 @@ fn union_generic_lists<OffsetSize: OffsetSizeTrait>(
17601828/// Array_union SQL function
17611829pub fn array_union ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
17621830 if args. len ( ) != 2 {
1763- return exec_err ! ( "array_union needs two arguments" ) ;
1831+ return exec_err ! ( "array_union needs 2 arguments" ) ;
17641832 }
17651833 let array1 = & args[ 0 ] ;
17661834 let array2 = & args[ 1 ] ;
@@ -1802,6 +1870,10 @@ pub fn array_union(args: &[ArrayRef]) -> Result<ArrayRef> {
18021870
18031871/// Array_to_string SQL function
18041872pub fn array_to_string ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1873+ if args. len ( ) < 2 || args. len ( ) > 3 {
1874+ return exec_err ! ( "array_to_string expects two or three arguments" ) ;
1875+ }
1876+
18051877 let arr = & args[ 0 ] ;
18061878
18071879 let delimiters = as_string_array ( & args[ 1 ] ) ?;
@@ -1911,6 +1983,10 @@ pub fn array_to_string(args: &[ArrayRef]) -> Result<ArrayRef> {
19111983
19121984/// Cardinality SQL function
19131985pub fn cardinality ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
1986+ if args. len ( ) != 1 {
1987+ return exec_err ! ( "cardinality expects one argument" ) ;
1988+ }
1989+
19141990 let list_array = as_list_array ( & args[ 0 ] ) ?. clone ( ) ;
19151991
19161992 let result = list_array
@@ -1967,6 +2043,10 @@ fn flatten_internal(
19672043
19682044/// Flatten SQL function
19692045pub fn flatten ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
2046+ if args. len ( ) != 1 {
2047+ return exec_err ! ( "flatten expects one argument" ) ;
2048+ }
2049+
19702050 let flattened_array = flatten_internal ( & args[ 0 ] , None ) ?;
19712051 Ok ( Arc :: new ( flattened_array) as ArrayRef )
19722052}
@@ -1991,6 +2071,10 @@ fn array_length_dispatch<O: OffsetSizeTrait>(array: &[ArrayRef]) -> Result<Array
19912071
19922072/// Array_length SQL function
19932073pub fn array_length ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
2074+ if args. len ( ) != 1 && args. len ( ) != 2 {
2075+ return exec_err ! ( "array_length expects one or two arguments" ) ;
2076+ }
2077+
19942078 match & args[ 0 ] . data_type ( ) {
19952079 DataType :: List ( _) => array_length_dispatch :: < i32 > ( args) ,
19962080 DataType :: LargeList ( _) => array_length_dispatch :: < i64 > ( args) ,
@@ -2037,6 +2121,10 @@ pub fn array_dims(args: &[ArrayRef]) -> Result<ArrayRef> {
20372121
20382122/// Array_ndims SQL function
20392123pub fn array_ndims ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
2124+ if args. len ( ) != 1 {
2125+ return exec_err ! ( "array_ndims needs one argument" ) ;
2126+ }
2127+
20402128 if let Some ( list_array) = args[ 0 ] . as_list_opt :: < i32 > ( ) {
20412129 let ndims = datafusion_common:: utils:: list_ndims ( list_array. data_type ( ) ) ;
20422130
@@ -2127,6 +2215,10 @@ fn general_array_has_dispatch<O: OffsetSizeTrait>(
21272215
21282216/// Array_has SQL function
21292217pub fn array_has ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
2218+ if args. len ( ) != 2 {
2219+ return exec_err ! ( "array_has needs two arguments" ) ;
2220+ }
2221+
21302222 let array_type = args[ 0 ] . data_type ( ) ;
21312223
21322224 match array_type {
@@ -2142,6 +2234,10 @@ pub fn array_has(args: &[ArrayRef]) -> Result<ArrayRef> {
21422234
21432235/// Array_has_any SQL function
21442236pub fn array_has_any ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
2237+ if args. len ( ) != 2 {
2238+ return exec_err ! ( "array_has_any needs two arguments" ) ;
2239+ }
2240+
21452241 let array_type = args[ 0 ] . data_type ( ) ;
21462242
21472243 match array_type {
@@ -2157,6 +2253,10 @@ pub fn array_has_any(args: &[ArrayRef]) -> Result<ArrayRef> {
21572253
21582254/// Array_has_all SQL function
21592255pub fn array_has_all ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
2256+ if args. len ( ) != 2 {
2257+ return exec_err ! ( "array_has_all needs two arguments" ) ;
2258+ }
2259+
21602260 let array_type = args[ 0 ] . data_type ( ) ;
21612261
21622262 match array_type {
@@ -2261,7 +2361,9 @@ pub fn string_to_array<T: OffsetSizeTrait>(args: &[ArrayRef]) -> Result<ArrayRef
22612361
22622362/// array_intersect SQL function
22632363pub fn array_intersect ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
2264- assert_eq ! ( args. len( ) , 2 ) ;
2364+ if args. len ( ) != 2 {
2365+ return exec_err ! ( "array_intersect needs two arguments" ) ;
2366+ }
22652367
22662368 let first_array = & args[ 0 ] ;
22672369 let second_array = & args[ 1 ] ;
@@ -2364,7 +2466,9 @@ pub fn general_array_distinct<OffsetSize: OffsetSizeTrait>(
23642466/// array_distinct SQL function
23652467/// example: from list [1, 3, 2, 3, 1, 2, 4] to [1, 2, 3, 4]
23662468pub fn array_distinct ( args : & [ ArrayRef ] ) -> Result < ArrayRef > {
2367- assert_eq ! ( args. len( ) , 1 ) ;
2469+ if args. len ( ) != 1 {
2470+ return exec_err ! ( "array_distinct needs one argument" ) ;
2471+ }
23682472
23692473 // handle null
23702474 if args[ 0 ] . data_type ( ) == & DataType :: Null {
0 commit comments