diff --git a/datafusion/functions-nested/src/string.rs b/datafusion/functions-nested/src/string.rs index 3373f7a9838e1..61caa3ac70764 100644 --- a/datafusion/functions-nested/src/string.rs +++ b/datafusion/functions-nested/src/string.rs @@ -369,27 +369,38 @@ 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 +408,18 @@ 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