Skip to content

Commit e2dba0b

Browse files
committed
refactor: consistent null handling in coercible signatures
1 parent 908ca0e commit e2dba0b

File tree

20 files changed

+185
-68
lines changed

20 files changed

+185
-68
lines changed

datafusion/expr-common/src/signature.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -263,10 +263,6 @@ impl TypeSignatureClass {
263263
self: &TypeSignatureClass,
264264
logical_type: &NativeType,
265265
) -> bool {
266-
if logical_type == &NativeType::Null {
267-
return true;
268-
}
269-
270266
match self {
271267
TypeSignatureClass::Native(t) if t.native() == logical_type => true,
272268
TypeSignatureClass::Timestamp if logical_type.is_timestamp() => true,

datafusion/functions-nested/src/string.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ use arrow::datatypes::DataType::{
4343
};
4444
use datafusion_common::cast::{as_large_list_array, as_list_array};
4545
use datafusion_common::exec_err;
46-
use datafusion_common::types::logical_string;
46+
use datafusion_common::types::{logical_null, logical_string, NativeType};
4747
use datafusion_expr::{
4848
Coercion, ColumnarValue, Documentation, ScalarUDFImpl, Signature, TypeSignature,
4949
TypeSignatureClass, Volatility,
@@ -255,11 +255,19 @@ impl StringToArray {
255255
vec![
256256
TypeSignature::Coercible(vec![
257257
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
258-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
258+
Coercion::new_implicit(
259+
TypeSignatureClass::Native(logical_string()),
260+
vec![TypeSignatureClass::Native(logical_null())],
261+
NativeType::String,
262+
),
259263
]),
260264
TypeSignature::Coercible(vec![
261265
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
262-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
266+
Coercion::new_implicit(
267+
TypeSignatureClass::Native(logical_string()),
268+
vec![TypeSignatureClass::Native(logical_null())],
269+
NativeType::String,
270+
),
263271
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
264272
]),
265273
],

datafusion/functions/src/regex/regexplike.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use arrow::array::{Array, ArrayRef, AsArray, GenericStringArray};
2121
use arrow::compute::kernels::regexp;
2222
use arrow::datatypes::DataType;
2323
use arrow::datatypes::DataType::{LargeUtf8, Utf8, Utf8View};
24-
use datafusion_common::types::logical_string;
24+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2525
use datafusion_common::{
2626
arrow_datafusion_err, exec_err, internal_err, plan_err, DataFusionError, Result,
2727
ScalarValue,
@@ -84,12 +84,28 @@ impl RegexpLikeFunc {
8484
signature: Signature::one_of(
8585
vec![
8686
TypeSignature::Coercible(vec![
87-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
88-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
87+
Coercion::new_implicit(
88+
TypeSignatureClass::Native(logical_string()),
89+
vec![TypeSignatureClass::Native(logical_null())],
90+
NativeType::String,
91+
),
92+
Coercion::new_implicit(
93+
TypeSignatureClass::Native(logical_string()),
94+
vec![TypeSignatureClass::Native(logical_null())],
95+
NativeType::String,
96+
),
8997
]),
9098
TypeSignature::Coercible(vec![
91-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
92-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
99+
Coercion::new_implicit(
100+
TypeSignatureClass::Native(logical_string()),
101+
vec![TypeSignatureClass::Native(logical_null())],
102+
NativeType::String,
103+
),
104+
Coercion::new_implicit(
105+
TypeSignatureClass::Native(logical_string()),
106+
vec![TypeSignatureClass::Native(logical_null())],
107+
NativeType::String,
108+
),
93109
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
94110
]),
95111
],

datafusion/functions/src/string/ascii.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::utils::make_scalar_function;
1919
use arrow::array::{ArrayAccessor, ArrayIter, ArrayRef, AsArray, Int32Array};
2020
use arrow::datatypes::DataType;
2121
use arrow::error::ArrowError;
22-
use datafusion_common::types::logical_string;
22+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2323
use datafusion_common::{internal_err, Result};
2424
use datafusion_expr::{ColumnarValue, Documentation, TypeSignatureClass};
2525
use datafusion_expr::{ScalarFunctionArgs, ScalarUDFImpl, Signature, Volatility};
@@ -64,9 +64,11 @@ impl AsciiFunc {
6464
pub fn new() -> Self {
6565
Self {
6666
signature: Signature::coercible(
67-
vec![Coercion::new_exact(TypeSignatureClass::Native(
68-
logical_string(),
69-
))],
67+
vec![Coercion::new_implicit(
68+
TypeSignatureClass::Native(logical_string()),
69+
vec![TypeSignatureClass::Native(logical_null())],
70+
NativeType::String,
71+
)],
7072
Volatility::Immutable,
7173
),
7274
}

datafusion/functions/src/string/bit_length.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use arrow::datatypes::DataType;
2020
use std::any::Any;
2121

2222
use crate::utils::utf8_to_int_type;
23-
use datafusion_common::types::logical_string;
23+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2424
use datafusion_common::utils::take_function_args;
2525
use datafusion_common::{Result, ScalarValue};
2626
use datafusion_expr::{
@@ -60,9 +60,11 @@ impl BitLengthFunc {
6060
pub fn new() -> Self {
6161
Self {
6262
signature: Signature::coercible(
63-
vec![Coercion::new_exact(TypeSignatureClass::Native(
64-
logical_string(),
65-
))],
63+
vec![Coercion::new_implicit(
64+
TypeSignatureClass::Native(logical_string()),
65+
vec![TypeSignatureClass::Native(logical_null())],
66+
NativeType::String,
67+
)],
6668
Volatility::Immutable,
6769
),
6870
}

datafusion/functions/src/string/btrim.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::string::common::*;
1919
use crate::utils::{make_scalar_function, utf8_to_str_type};
2020
use arrow::array::{ArrayRef, OffsetSizeTrait};
2121
use arrow::datatypes::DataType;
22-
use datafusion_common::types::logical_string;
22+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2323
use datafusion_common::{exec_err, Result};
2424
use datafusion_expr::function::Hint;
2525
use datafusion_expr::{
@@ -83,11 +83,21 @@ impl BTrimFunc {
8383
signature: Signature::one_of(
8484
vec![
8585
TypeSignature::Coercible(vec![
86-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
87-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
86+
Coercion::new_implicit(
87+
TypeSignatureClass::Native(logical_string()),
88+
vec![TypeSignatureClass::Native(logical_null())],
89+
NativeType::String,
90+
),
91+
Coercion::new_implicit(
92+
TypeSignatureClass::Native(logical_string()),
93+
vec![TypeSignatureClass::Native(logical_null())],
94+
NativeType::String,
95+
),
8896
]),
89-
TypeSignature::Coercible(vec![Coercion::new_exact(
97+
TypeSignature::Coercible(vec![Coercion::new_implicit(
9098
TypeSignatureClass::Native(logical_string()),
99+
vec![TypeSignatureClass::Native(logical_null())],
100+
NativeType::String,
91101
)]),
92102
],
93103
Volatility::Immutable,

datafusion/functions/src/string/contains.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use arrow::array::{Array, ArrayRef, AsArray};
2020
use arrow::compute::contains as arrow_contains;
2121
use arrow::datatypes::DataType;
2222
use arrow::datatypes::DataType::{Boolean, LargeUtf8, Utf8, Utf8View};
23-
use datafusion_common::types::logical_string;
23+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2424
use datafusion_common::{exec_err, DataFusionError, Result};
2525
use datafusion_expr::binary::{binary_to_string_coercion, string_coercion};
2626
use datafusion_expr::{
@@ -63,7 +63,11 @@ impl ContainsFunc {
6363
signature: Signature::coercible(
6464
vec![
6565
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
66-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
66+
Coercion::new_implicit(
67+
TypeSignatureClass::Native(logical_string()),
68+
vec![TypeSignatureClass::Native(logical_null())],
69+
NativeType::String,
70+
),
6771
],
6872
Volatility::Immutable,
6973
),

datafusion/functions/src/string/ends_with.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use arrow::array::ArrayRef;
2222
use arrow::datatypes::DataType;
2323

2424
use crate::utils::make_scalar_function;
25-
use datafusion_common::types::logical_string;
25+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2626
use datafusion_common::{internal_err, Result};
2727
use datafusion_expr::binary::{binary_to_string_coercion, string_coercion};
2828
use datafusion_expr::{
@@ -68,8 +68,16 @@ impl EndsWithFunc {
6868
Self {
6969
signature: Signature::coercible(
7070
vec![
71-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
72-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
71+
Coercion::new_implicit(
72+
TypeSignatureClass::Native(logical_string()),
73+
vec![TypeSignatureClass::Native(logical_null())],
74+
NativeType::String,
75+
),
76+
Coercion::new_implicit(
77+
TypeSignatureClass::Native(logical_string()),
78+
vec![TypeSignatureClass::Native(logical_null())],
79+
NativeType::String,
80+
),
7381
],
7482
Volatility::Immutable,
7583
),

datafusion/functions/src/string/levenshtein.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use arrow::datatypes::DataType;
2323

2424
use crate::utils::{make_scalar_function, utf8_to_int_type};
2525
use datafusion_common::cast::{as_generic_string_array, as_string_view_array};
26-
use datafusion_common::types::logical_string;
26+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2727
use datafusion_common::utils::datafusion_strsim;
2828
use datafusion_common::utils::take_function_args;
2929
use datafusion_common::{exec_err, Result};
@@ -73,8 +73,16 @@ impl LevenshteinFunc {
7373
Self {
7474
signature: Signature::coercible(
7575
vec![
76-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
77-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
76+
Coercion::new_implicit(
77+
TypeSignatureClass::Native(logical_string()),
78+
vec![TypeSignatureClass::Native(logical_null())],
79+
NativeType::String,
80+
),
81+
Coercion::new_implicit(
82+
TypeSignatureClass::Native(logical_string()),
83+
vec![TypeSignatureClass::Native(logical_null())],
84+
NativeType::String,
85+
),
7886
],
7987
Volatility::Immutable,
8088
),

datafusion/functions/src/string/lower.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::any::Any;
2020

2121
use crate::string::common::to_lower;
2222
use crate::utils::utf8_to_str_type;
23-
use datafusion_common::types::logical_string;
23+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2424
use datafusion_common::Result;
2525
use datafusion_expr::{
2626
Coercion, ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
@@ -59,9 +59,11 @@ impl LowerFunc {
5959
pub fn new() -> Self {
6060
Self {
6161
signature: Signature::coercible(
62-
vec![Coercion::new_exact(TypeSignatureClass::Native(
63-
logical_string(),
64-
))],
62+
vec![Coercion::new_implicit(
63+
TypeSignatureClass::Native(logical_string()),
64+
vec![TypeSignatureClass::Native(logical_null())],
65+
NativeType::String,
66+
)],
6567
Volatility::Immutable,
6668
),
6769
}

datafusion/functions/src/string/ltrim.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use std::sync::Arc;
2222

2323
use crate::string::common::*;
2424
use crate::utils::{make_scalar_function, utf8_to_str_type};
25-
use datafusion_common::types::logical_string;
25+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2626
use datafusion_common::{exec_err, Result};
2727
use datafusion_expr::function::Hint;
2828
use datafusion_expr::{
@@ -88,11 +88,21 @@ impl LtrimFunc {
8888
signature: Signature::one_of(
8989
vec![
9090
TypeSignature::Coercible(vec![
91-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
92-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
91+
Coercion::new_implicit(
92+
TypeSignatureClass::Native(logical_string()),
93+
vec![TypeSignatureClass::Native(logical_null())],
94+
NativeType::String,
95+
),
96+
Coercion::new_implicit(
97+
TypeSignatureClass::Native(logical_string()),
98+
vec![TypeSignatureClass::Native(logical_null())],
99+
NativeType::String,
100+
),
93101
]),
94-
TypeSignature::Coercible(vec![Coercion::new_exact(
102+
TypeSignature::Coercible(vec![Coercion::new_implicit(
95103
TypeSignatureClass::Native(logical_string()),
104+
vec![TypeSignatureClass::Native(logical_null())],
105+
NativeType::String,
96106
)]),
97107
],
98108
Volatility::Immutable,

datafusion/functions/src/string/octet_length.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use arrow::datatypes::DataType;
2020
use std::any::Any;
2121

2222
use crate::utils::utf8_to_int_type;
23-
use datafusion_common::types::logical_string;
23+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2424
use datafusion_common::utils::take_function_args;
2525
use datafusion_common::{Result, ScalarValue};
2626
use datafusion_expr::{
@@ -60,9 +60,11 @@ impl OctetLengthFunc {
6060
pub fn new() -> Self {
6161
Self {
6262
signature: Signature::coercible(
63-
vec![Coercion::new_exact(TypeSignatureClass::Native(
64-
logical_string(),
65-
))],
63+
vec![Coercion::new_implicit(
64+
TypeSignatureClass::Native(logical_string()),
65+
vec![TypeSignatureClass::Native(logical_null())],
66+
NativeType::String,
67+
)],
6668
Volatility::Immutable,
6769
),
6870
}

datafusion/functions/src/string/repeat.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use arrow::array::{
2626
use arrow::datatypes::DataType;
2727
use arrow::datatypes::DataType::{LargeUtf8, Utf8, Utf8View};
2828
use datafusion_common::cast::as_int64_array;
29-
use datafusion_common::types::{logical_int64, logical_string, NativeType};
29+
use datafusion_common::types::{logical_int64, logical_null, logical_string, NativeType};
3030
use datafusion_common::{exec_err, DataFusionError, Result};
3131
use datafusion_expr::{ColumnarValue, Documentation, Volatility};
3232
use datafusion_expr::{ScalarFunctionArgs, ScalarUDFImpl, Signature};
@@ -67,7 +67,11 @@ impl RepeatFunc {
6767
Self {
6868
signature: Signature::coercible(
6969
vec![
70-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
70+
Coercion::new_implicit(
71+
TypeSignatureClass::Native(logical_string()),
72+
vec![TypeSignatureClass::Native(logical_null())],
73+
NativeType::String,
74+
),
7175
// Accept all integer types but cast them to i64
7276
Coercion::new_implicit(
7377
TypeSignatureClass::Native(logical_int64()),

datafusion/functions/src/string/replace.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use arrow::datatypes::DataType;
2323

2424
use crate::utils::{make_scalar_function, utf8_to_str_type};
2525
use datafusion_common::cast::{as_generic_string_array, as_string_view_array};
26-
use datafusion_common::types::logical_string;
26+
use datafusion_common::types::{logical_null, logical_string, NativeType};
2727
use datafusion_common::{exec_err, Result};
2828
use datafusion_expr::type_coercion::binary::{
2929
binary_to_string_coercion, string_coercion,
@@ -68,9 +68,21 @@ impl ReplaceFunc {
6868
Self {
6969
signature: Signature::coercible(
7070
vec![
71-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
72-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
73-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
71+
Coercion::new_implicit(
72+
TypeSignatureClass::Native(logical_string()),
73+
vec![TypeSignatureClass::Native(logical_null())],
74+
NativeType::String,
75+
),
76+
Coercion::new_implicit(
77+
TypeSignatureClass::Native(logical_string()),
78+
vec![TypeSignatureClass::Native(logical_null())],
79+
NativeType::String,
80+
),
81+
Coercion::new_implicit(
82+
TypeSignatureClass::Native(logical_string()),
83+
vec![TypeSignatureClass::Native(logical_null())],
84+
NativeType::String,
85+
),
7486
],
7587
Volatility::Immutable,
7688
),

0 commit comments

Comments
 (0)