diff --git a/datafusion/physical-expr/src/array_expressions.rs b/datafusion/physical-expr/src/array_expressions.rs index f254274edde6..9e46b6cda978 100644 --- a/datafusion/physical-expr/src/array_expressions.rs +++ b/datafusion/physical-expr/src/array_expressions.rs @@ -378,14 +378,7 @@ fn return_empty(return_null: bool, data_type: DataType) -> Arc { } } -fn list_slice( - array: &dyn Array, - i: i64, - j: i64, - return_element: bool, -) -> ArrayRef { - let array = array.as_any().downcast_ref::().unwrap(); - +fn list_slice(array: &dyn Array, i: i64, j: i64, return_element: bool) -> ArrayRef { let array_type = array.data_type().clone(); if i == 0 && j == 0 || array.is_empty() { @@ -426,7 +419,7 @@ fn list_slice( } } -fn slice( +fn slice( array: &ListArray, key: &Int64Array, extra_key: &Int64Array, @@ -437,10 +430,10 @@ fn slice( .zip(key.iter()) .zip(extra_key.iter()) .map(|((arr, i), j)| match (arr, i, j) { - (Some(arr), Some(i), Some(j)) => list_slice::(&arr, i, j, return_element), - (Some(arr), None, Some(j)) => list_slice::(&arr, 1i64, j, return_element), + (Some(arr), Some(i), Some(j)) => list_slice(&arr, i, j, return_element), + (Some(arr), None, Some(j)) => list_slice(&arr, 1i64, j, return_element), (Some(arr), Some(i), None) => { - list_slice::(&arr, i, arr.len() as i64, return_element) + list_slice(&arr, i, arr.len() as i64, return_element) } (Some(arr), None, None) if !return_element => arr.clone(), _ => return_empty(return_element, array.value_type()), @@ -487,12 +480,7 @@ fn define_array_slice( extra_key: &Int64Array, return_element: bool, ) -> Result { - macro_rules! array_function { - ($ARRAY_TYPE:ident) => { - slice::<$ARRAY_TYPE>(list_array, key, extra_key, return_element) - }; - } - call_array_function!(list_array.value_type(), true) + slice(list_array, key, extra_key, return_element) } pub fn array_element(args: &[ArrayRef]) -> Result {