This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 9b1a6f34ab fix: `array_slice` and `array_element` panicked on empty
args (#10804)
9b1a6f34ab is described below
commit 9b1a6f34ab0d8960eb2b0b1993a34a58ea747515
Author: Jonah Gao <[email protected]>
AuthorDate: Wed Jun 5 22:27:19 2024 +0800
fix: `array_slice` and `array_element` panicked on empty args (#10804)
* fix: `array_slice` and `array_element` panicked on empty args
* Use single-line error
---
datafusion/functions-array/src/extract.rs | 19 ++++++++++++++-----
datafusion/functions-array/src/utils.rs | 7 ++++++-
datafusion/sqllogictest/test_files/array.slt | 8 ++++++++
3 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/datafusion/functions-array/src/extract.rs
b/datafusion/functions-array/src/extract.rs
index a2ee6f2ef5..af4e36926b 100644
--- a/datafusion/functions-array/src/extract.rs
+++ b/datafusion/functions-array/src/extract.rs
@@ -40,7 +40,7 @@ use datafusion_expr::{ColumnarValue, ScalarUDFImpl,
Signature, Volatility};
use std::any::Any;
use std::sync::Arc;
-use crate::utils::make_scalar_function;
+use crate::utils::{get_arg_name, make_scalar_function};
// Create static instances of ScalarUDFs for each function
make_udf_expr_and_func!(
@@ -97,8 +97,11 @@ impl ScalarUDFImpl for ArrayElement {
}
fn display_name(&self, args: &[Expr]) -> Result<String> {
- let args_name: Vec<String> = args.iter().map(|e|
e.to_string()).collect();
- Ok(format!("{}[{}]", args_name[0], args_name[1]))
+ Ok(format!(
+ "{}[{}]",
+ get_arg_name(args, 0),
+ get_arg_name(args, 1)
+ ))
}
fn signature(&self) -> &Signature {
@@ -251,8 +254,14 @@ impl ScalarUDFImpl for ArraySlice {
}
fn display_name(&self, args: &[Expr]) -> Result<String> {
- let args_name: Vec<String> = args.iter().map(|e|
e.to_string()).collect();
- Ok(format!("{}[{}]", args_name[0], args_name[1..].join(":")))
+ Ok(format!(
+ "{}[{}]",
+ get_arg_name(args, 0),
+ (1..args.len())
+ .map(|i| get_arg_name(args, i))
+ .collect::<Vec<String>>()
+ .join(":")
+ ))
}
fn name(&self) -> &str {
diff --git a/datafusion/functions-array/src/utils.rs
b/datafusion/functions-array/src/utils.rs
index 86fd281b58..00a6a68f7a 100644
--- a/datafusion/functions-array/src/utils.rs
+++ b/datafusion/functions-array/src/utils.rs
@@ -32,7 +32,7 @@ use datafusion_common::{exec_err, plan_err, Result,
ScalarValue};
use core::any::type_name;
use datafusion_common::DataFusionError;
-use datafusion_expr::{ColumnarValue, ScalarFunctionImplementation};
+use datafusion_expr::{ColumnarValue, Expr, ScalarFunctionImplementation};
macro_rules! downcast_arg {
($ARG:expr, $ARRAY_TYPE:ident) => {{
@@ -253,6 +253,11 @@ pub(crate) fn compute_array_dims(
}
}
+/// Returns the name of the argument at index `i`, or an empty string if the
index is out of bounds.
+pub(super) fn get_arg_name(args: &[Expr], i: usize) -> String {
+ args.get(i).map(ToString::to_string).unwrap_or_default()
+}
+
#[cfg(test)]
mod tests {
use super::*;
diff --git a/datafusion/sqllogictest/test_files/array.slt
b/datafusion/sqllogictest/test_files/array.slt
index df761e6237..bf451772b9 100644
--- a/datafusion/sqllogictest/test_files/array.slt
+++ b/datafusion/sqllogictest/test_files/array.slt
@@ -1136,6 +1136,10 @@ from arrays_values_without_nulls;
## array_element (aliases: array_extract, list_extract, list_element)
+# Testing with empty arguments should result in an error
+query error DataFusion error: Error during planning: Error during planning:
\[data_types_with_scalar_udf\] signature ArraySignature\(ArrayAndIndex\) does
not support zero arguments.
+select array_element();
+
# array_element error
query error
select array_element(1, 2);
@@ -1974,6 +1978,10 @@ select array_slice(a, -1, 2, 1), array_slice(a, -1, 2),
[] [] [] []
[6.0] [6.0] [] []
+# Testing with empty arguments should result in an error
+query error DataFusion error: Error during planning: Error during planning:
\[data_types_with_scalar_udf\] signature VariadicAny does not support zero
arguments.
+select array_slice();
+
# make_array with nulls
query ???????
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]