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]

Reply via email to