From 6581a5b2e5bd487625a60f344ce7d34fd7239a84 Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Mon, 27 Jul 2026 18:28:44 +0300 Subject: [PATCH 1/3] perf: optimize `array_empty` udf --- datafusion/functions-nested/src/empty.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/datafusion/functions-nested/src/empty.rs b/datafusion/functions-nested/src/empty.rs index 262eb4935c968..f85b2b342a3c3 100644 --- a/datafusion/functions-nested/src/empty.rs +++ b/datafusion/functions-nested/src/empty.rs @@ -122,9 +122,17 @@ fn array_empty_inner(args: &[ArrayRef]) -> Result { } fn general_array_empty(array: &ArrayRef) -> Result { - let result = as_generic_list_array::(array)? - .iter() - .map(|arr| arr.map(|arr| arr.is_empty())) - .collect::(); + let result = as_generic_list_array::(array)?; + // No nulls, just look at the offsets + let is_empty_iter = result.offsets().lengths().map(|n| n == 0); + // SAFETY: this is safe since the iterator lengths is exact size and + // trusted - it maps over fixed known number of elements + let output_buffer = unsafe { BooleanArray::from_trusted_len_iter(is_empty_iter) }; + + let (values, _) = output_buffer.into_parts(); + + // Add the nulls + let result = BooleanArray::new(values, result.nulls().filter(|n| n.null_count() > 0).cloned()); + Ok(Arc::new(result)) } From 904af86e76bd8ffb38cafc07067a61838352f34f Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Mon, 27 Jul 2026 18:36:38 +0300 Subject: [PATCH 2/3] remove comment --- datafusion/functions-nested/src/empty.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/datafusion/functions-nested/src/empty.rs b/datafusion/functions-nested/src/empty.rs index f85b2b342a3c3..46f0766f96a55 100644 --- a/datafusion/functions-nested/src/empty.rs +++ b/datafusion/functions-nested/src/empty.rs @@ -123,7 +123,6 @@ fn array_empty_inner(args: &[ArrayRef]) -> Result { fn general_array_empty(array: &ArrayRef) -> Result { let result = as_generic_list_array::(array)?; - // No nulls, just look at the offsets let is_empty_iter = result.offsets().lengths().map(|n| n == 0); // SAFETY: this is safe since the iterator lengths is exact size and // trusted - it maps over fixed known number of elements From f21e28720602f32dde1daf62a0903225c7dfc6dd Mon Sep 17 00:00:00 2001 From: Raz Luvaton <16746759+rluvaton@users.noreply.github.com> Date: Tue, 28 Jul 2026 12:56:11 +0300 Subject: [PATCH 3/3] format --- datafusion/functions-nested/src/empty.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/datafusion/functions-nested/src/empty.rs b/datafusion/functions-nested/src/empty.rs index 46f0766f96a55..6db412d29b0d8 100644 --- a/datafusion/functions-nested/src/empty.rs +++ b/datafusion/functions-nested/src/empty.rs @@ -131,7 +131,10 @@ fn general_array_empty(array: &ArrayRef) -> Result let (values, _) = output_buffer.into_parts(); // Add the nulls - let result = BooleanArray::new(values, result.nulls().filter(|n| n.null_count() > 0).cloned()); + let result = BooleanArray::new( + values, + result.nulls().filter(|n| n.null_count() > 0).cloned(), + ); Ok(Arc::new(result)) }