Skip to content

Commit 332f035

Browse files
fix: string_to_array('', delim) now returns empty array for PostgreSQL compatibility
Rust's str::split() on an empty string yields one empty-string element, causing string_to_array('', ',') to return [''] instead of the correct empty array []. Added an is_empty() guard in both the plain and null_value variants of string_to_array_impl, and added a sqllogictest case to cover this edge case. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 15bc6bd commit 332f035

2 files changed

Lines changed: 28 additions & 12 deletions

File tree

datafusion/functions-nested/src/string.rs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -742,10 +742,15 @@ where
742742
list_builder.append(true);
743743
}
744744
(Some(string), Some(delimiter)) => {
745-
string.split(delimiter).for_each(|s| {
746-
list_builder.values().append_value(s);
747-
});
748-
list_builder.append(true);
745+
if string.is_empty() {
746+
// empty string returns empty array (PostgreSQL compatibility)
747+
list_builder.append(true);
748+
} else {
749+
string.split(delimiter).for_each(|s| {
750+
list_builder.values().append_value(s);
751+
});
752+
list_builder.append(true);
753+
}
749754
}
750755
(Some(string), None) => {
751756
string.chars().map(|c| c.to_string()).for_each(|c| {
@@ -773,14 +778,19 @@ where
773778
list_builder.append(true);
774779
}
775780
(Some(string), Some(delimiter)) => {
776-
string.split(delimiter).for_each(|s| {
777-
if Some(s) == null_value {
778-
list_builder.values().append_null();
779-
} else {
780-
list_builder.values().append_value(s);
781-
}
782-
});
783-
list_builder.append(true);
781+
if string.is_empty() {
782+
// empty string returns empty array (PostgreSQL compatibility)
783+
list_builder.append(true);
784+
} else {
785+
string.split(delimiter).for_each(|s| {
786+
if Some(s) == null_value {
787+
list_builder.values().append_null();
788+
} else {
789+
list_builder.values().append_value(s);
790+
}
791+
});
792+
list_builder.append(true);
793+
}
784794
}
785795
(Some(string), None) => {
786796
string.chars().map(|c| c.to_string()).for_each(|c| {

datafusion/sqllogictest/test_files/array.slt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8623,6 +8623,12 @@ SELECT string_to_array('abcxxxdef', 'xxx')
86238623
----
86248624
[abc, def]
86258625

8626+
# empty string input should return empty array (PostgreSQL compatibility)
8627+
query ?
8628+
SELECT string_to_array('', ',')
8629+
----
8630+
[]
8631+
86268632
query ?
86278633
SELECT string_to_array('abc', '')
86288634
----

0 commit comments

Comments
 (0)