Skip to content

Commit 9d88bfb

Browse files
committed
fix: allow Binary type coercion in split_part function
1 parent 0808f3a commit 9d88bfb

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

datafusion/functions/src/string/split_part.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ use arrow::array::{AsArray, GenericStringBuilder};
2424
use arrow::datatypes::DataType;
2525
use datafusion_common::ScalarValue;
2626
use datafusion_common::cast::as_int64_array;
27-
use datafusion_common::types::{NativeType, logical_int64, logical_string};
27+
use datafusion_common::types::{
28+
NativeType, logical_binary, logical_int64, logical_string,
29+
};
2830
use datafusion_common::{DataFusionError, Result, exec_datafusion_err, exec_err};
2931
use datafusion_expr::{
3032
Coercion, ColumnarValue, Documentation, TypeSignatureClass, Volatility,
@@ -66,8 +68,16 @@ impl SplitPartFunc {
6668
Self {
6769
signature: Signature::coercible(
6870
vec![
69-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
70-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
71+
Coercion::new_implicit(
72+
TypeSignatureClass::Native(logical_string()),
73+
vec![TypeSignatureClass::Native(logical_binary())],
74+
NativeType::String,
75+
),
76+
Coercion::new_implicit(
77+
TypeSignatureClass::Native(logical_string()),
78+
vec![TypeSignatureClass::Native(logical_binary())],
79+
NativeType::String,
80+
),
7181
Coercion::new_implicit(
7282
TypeSignatureClass::Native(logical_int64()),
7383
vec![TypeSignatureClass::Integer],

datafusion/sqllogictest/test_files/binary.slt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,3 +311,27 @@ Foo foo Foo foo
311311
NULL NULL NULL NULL
312312
Bar Bar Bar Bar
313313
FooBar fooBar FooBar fooBar
314+
315+
# implicit coercion from Binary to String
316+
query TTT
317+
SELECT
318+
cast(binary as varchar) as str,
319+
split_part(binary, 'o', 2) as binary_split,
320+
split_part(largebinary, 'o', 2) as large_binary_split
321+
from t;
322+
----
323+
Foo (empty) (empty)
324+
NULL NULL NULL
325+
Bar (empty) (empty)
326+
FooBar (empty) (empty)
327+
328+
query T
329+
SELECT split_part('abc~@~def~@~ghi', arrow_cast('~@~', 'Binary'), 2);
330+
----
331+
def
332+
333+
# Reproducer for https://github.com/apache/datafusion/issues/19809
334+
query T
335+
SELECT split_part(split_part(arrow_cast('page.html?resolution=1920&more', 'Binary'), 'resolution=', 2), '&', 1);
336+
----
337+
1920

0 commit comments

Comments
 (0)