Skip to content

Commit ec3ca71

Browse files
authored
fix: Improve null handling in array_to_string function (#18076)
* fix: Improve null handling in array_to_string function * chore
1 parent 3bca1bb commit ec3ca71

File tree

2 files changed

+38
-22
lines changed

2 files changed

+38
-22
lines changed

datafusion/functions-nested/src/string.rs

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -369,41 +369,57 @@ pub(super) fn array_to_string_inner(args: &[ArrayRef]) -> Result<ArrayRef> {
369369
List(..) => {
370370
let list_array = as_list_array(&arr)?;
371371
for i in 0..list_array.len() {
372-
compute_array_to_string(
373-
arg,
374-
list_array.value(i),
375-
delimiter.clone(),
376-
null_string.clone(),
377-
with_null_string,
378-
)?;
372+
if !list_array.is_null(i) {
373+
compute_array_to_string(
374+
arg,
375+
list_array.value(i),
376+
delimiter.clone(),
377+
null_string.clone(),
378+
with_null_string,
379+
)?;
380+
} else if with_null_string {
381+
arg.push_str(&null_string);
382+
arg.push_str(&delimiter);
383+
}
379384
}
380385

381386
Ok(arg)
382387
}
383388
FixedSizeList(..) => {
384389
let list_array = as_fixed_size_list_array(&arr)?;
390+
385391
for i in 0..list_array.len() {
386-
compute_array_to_string(
387-
arg,
388-
list_array.value(i),
389-
delimiter.clone(),
390-
null_string.clone(),
391-
with_null_string,
392-
)?;
392+
if !list_array.is_null(i) {
393+
compute_array_to_string(
394+
arg,
395+
list_array.value(i),
396+
delimiter.clone(),
397+
null_string.clone(),
398+
with_null_string,
399+
)?;
400+
} else if with_null_string {
401+
arg.push_str(&null_string);
402+
arg.push_str(&delimiter);
403+
}
393404
}
394405

395406
Ok(arg)
396407
}
397408
LargeList(..) => {
398409
let list_array = as_large_list_array(&arr)?;
399410
for i in 0..list_array.len() {
400-
compute_array_to_string(
401-
arg,
402-
list_array.value(i),
403-
delimiter.clone(),
404-
null_string.clone(),
405-
with_null_string,
406-
)?;
411+
if !list_array.is_null(i) {
412+
compute_array_to_string(
413+
arg,
414+
list_array.value(i),
415+
delimiter.clone(),
416+
null_string.clone(),
417+
with_null_string,
418+
)?;
419+
} else if with_null_string {
420+
arg.push_str(&null_string);
421+
arg.push_str(&delimiter);
422+
}
407423
}
408424

409425
Ok(arg)

datafusion/sqllogictest/test_files/array.slt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4855,7 +4855,7 @@ h,-,-,-,o nil-2-nil-4-5 1|0|3
48554855
query T
48564856
select array_to_string(arrow_cast([arrow_cast([NULL, 'a'], 'FixedSizeList(2, Utf8)'), NULL], 'FixedSizeList(2, FixedSizeList(2, Utf8))'), ',', '-');
48574857
----
4858-
-,a,-,-
4858+
-,a,-
48594859

48604860
# array_to_string with columns #1
48614861

0 commit comments

Comments
 (0)