From 45038a30602dd00194d8d89a17564c0d60cdf8bd Mon Sep 17 00:00:00 2001 From: Weijun-H Date: Wed, 15 Oct 2025 16:13:07 +0300 Subject: [PATCH 1/2] fix: Improve null handling in array_to_string function --- datafusion/functions-nested/src/string.rs | 64 +++++++++++++------- datafusion/sqllogictest/test_files/array.slt | 2 +- 2 files changed, 44 insertions(+), 22 deletions(-) diff --git a/datafusion/functions-nested/src/string.rs b/datafusion/functions-nested/src/string.rs index 3373f7a9838e1..8f61d35c196f9 100644 --- a/datafusion/functions-nested/src/string.rs +++ b/datafusion/functions-nested/src/string.rs @@ -369,27 +369,42 @@ pub(super) fn array_to_string_inner(args: &[ArrayRef]) -> Result { List(..) => { let list_array = as_list_array(&arr)?; for i in 0..list_array.len() { - compute_array_to_string( - arg, - list_array.value(i), - delimiter.clone(), - null_string.clone(), - with_null_string, - )?; + if !list_array.is_null(i) { + compute_array_to_string( + arg, + list_array.value(i), + delimiter.clone(), + null_string.clone(), + with_null_string, + )?; + } else { + if with_null_string { + arg.push_str(&null_string); + arg.push_str(&delimiter); + } + } } Ok(arg) } FixedSizeList(..) => { let list_array = as_fixed_size_list_array(&arr)?; + for i in 0..list_array.len() { - compute_array_to_string( - arg, - list_array.value(i), - delimiter.clone(), - null_string.clone(), - with_null_string, - )?; + if !list_array.is_null(i) { + compute_array_to_string( + arg, + list_array.value(i), + delimiter.clone(), + null_string.clone(), + with_null_string, + )?; + } else { + if with_null_string { + arg.push_str(&null_string); + arg.push_str(&delimiter); + } + } } Ok(arg) @@ -397,13 +412,20 @@ pub(super) fn array_to_string_inner(args: &[ArrayRef]) -> Result { LargeList(..) => { let list_array = as_large_list_array(&arr)?; for i in 0..list_array.len() { - compute_array_to_string( - arg, - list_array.value(i), - delimiter.clone(), - null_string.clone(), - with_null_string, - )?; + if !list_array.is_null(i) { + compute_array_to_string( + arg, + list_array.value(i), + delimiter.clone(), + null_string.clone(), + with_null_string, + )?; + } else { + if with_null_string { + arg.push_str(&null_string); + arg.push_str(&delimiter); + } + } } Ok(arg) diff --git a/datafusion/sqllogictest/test_files/array.slt b/datafusion/sqllogictest/test_files/array.slt index d8c29a323e945..f488204d6d7b6 100644 --- a/datafusion/sqllogictest/test_files/array.slt +++ b/datafusion/sqllogictest/test_files/array.slt @@ -4855,7 +4855,7 @@ h,-,-,-,o nil-2-nil-4-5 1|0|3 query T select array_to_string(arrow_cast([arrow_cast([NULL, 'a'], 'FixedSizeList(2, Utf8)'), NULL], 'FixedSizeList(2, FixedSizeList(2, Utf8))'), ',', '-'); ---- --,a,-,- +-,a,- # array_to_string with columns #1 From c6bc651092759145b6f861dafbce6b0a483dc3b6 Mon Sep 17 00:00:00 2001 From: Weijun-H Date: Wed, 15 Oct 2025 16:48:46 +0300 Subject: [PATCH 2/2] chore --- datafusion/functions-nested/src/string.rs | 24 +++++++++-------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/datafusion/functions-nested/src/string.rs b/datafusion/functions-nested/src/string.rs index 8f61d35c196f9..61caa3ac70764 100644 --- a/datafusion/functions-nested/src/string.rs +++ b/datafusion/functions-nested/src/string.rs @@ -377,11 +377,9 @@ pub(super) fn array_to_string_inner(args: &[ArrayRef]) -> Result { null_string.clone(), with_null_string, )?; - } else { - if with_null_string { - arg.push_str(&null_string); - arg.push_str(&delimiter); - } + } else if with_null_string { + arg.push_str(&null_string); + arg.push_str(&delimiter); } } @@ -399,11 +397,9 @@ pub(super) fn array_to_string_inner(args: &[ArrayRef]) -> Result { null_string.clone(), with_null_string, )?; - } else { - if with_null_string { - arg.push_str(&null_string); - arg.push_str(&delimiter); - } + } else if with_null_string { + arg.push_str(&null_string); + arg.push_str(&delimiter); } } @@ -420,11 +416,9 @@ pub(super) fn array_to_string_inner(args: &[ArrayRef]) -> Result { null_string.clone(), with_null_string, )?; - } else { - if with_null_string { - arg.push_str(&null_string); - arg.push_str(&delimiter); - } + } else if with_null_string { + arg.push_str(&null_string); + arg.push_str(&delimiter); } }