Skip to content

Commit 7443f30

Browse files
authored
add arguments length check (#8622)
1 parent bf43bb2 commit 7443f30

File tree

1 file changed

+107
-3
lines changed

1 file changed

+107
-3
lines changed

datafusion/physical-expr/src/array_expressions.rs

Lines changed: 107 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,10 @@ where
472472
/// For example:
473473
/// > array_element(\[1, 2, 3], 2) -> 2
474474
pub 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.
587591
pub 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
738746
pub 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
887899
pub 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
913929
pub 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
9921012
pub 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
11121136
pub 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
11281156
pub 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
11521184
pub 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
12871323
pub 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
13511391
pub 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

15101554
pub 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

15151563
pub 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

15201572
pub 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

16361692
pub 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

16531713
pub 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

16721736
pub 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
17611829
pub 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
18041872
pub 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
19131985
pub 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
19692045
pub 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
19932073
pub 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
20392123
pub 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
21292217
pub 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
21442236
pub 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
21592255
pub 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
22632363
pub 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]
23662468
pub 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

Comments
 (0)