Skip to content

Commit 680383b

Browse files
committed
refactor: consistent null handling in coercible signatures
1 parent dc8d119 commit 680383b

File tree

26 files changed

+251
-88
lines changed

26 files changed

+251
-88
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/crypto/digest.rs

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use super::basic::{digest, utf8_or_binary_to_binary_type};
2020
use arrow::datatypes::DataType;
2121
use datafusion_common::{
22-
types::{logical_binary, logical_string},
22+
types::{logical_binary, logical_null, logical_string, NativeType},
2323
Result,
2424
};
2525
use datafusion_expr::{
@@ -72,12 +72,28 @@ impl DigestFunc {
7272
signature: Signature::one_of(
7373
vec![
7474
TypeSignature::Coercible(vec![
75-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
76-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
75+
Coercion::new_implicit(
76+
TypeSignatureClass::Native(logical_string()),
77+
vec![TypeSignatureClass::Native(logical_null())],
78+
NativeType::String,
79+
),
80+
Coercion::new_implicit(
81+
TypeSignatureClass::Native(logical_string()),
82+
vec![TypeSignatureClass::Native(logical_null())],
83+
NativeType::String,
84+
),
7785
]),
7886
TypeSignature::Coercible(vec![
79-
Coercion::new_exact(TypeSignatureClass::Native(logical_binary())),
80-
Coercion::new_exact(TypeSignatureClass::Native(logical_string())),
87+
Coercion::new_implicit(
88+
TypeSignatureClass::Native(logical_binary()),
89+
vec![TypeSignatureClass::Native(logical_null())],
90+
NativeType::Binary,
91+
),
92+
Coercion::new_implicit(
93+
TypeSignatureClass::Native(logical_string()),
94+
vec![TypeSignatureClass::Native(logical_null())],
95+
NativeType::String,
96+
),
8197
]),
8298
],
8399
Volatility::Immutable,

datafusion/functions/src/crypto/md5.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::crypto::basic::md5;
2020
use arrow::datatypes::DataType;
2121
use datafusion_common::{
2222
plan_err,
23-
types::{logical_binary, logical_string, NativeType},
23+
types::{logical_binary, logical_null, logical_string, NativeType},
2424
Result,
2525
};
2626
use datafusion_expr::{
@@ -62,12 +62,18 @@ impl Md5Func {
6262
vec![
6363
TypeSignature::Coercible(vec![Coercion::new_implicit(
6464
TypeSignatureClass::Native(logical_binary()),
65-
vec![TypeSignatureClass::Native(logical_string())],
65+
vec![
66+
TypeSignatureClass::Native(logical_string()),
67+
TypeSignatureClass::Native(logical_null()),
68+
],
6669
NativeType::String,
6770
)]),
6871
TypeSignature::Coercible(vec![Coercion::new_implicit(
6972
TypeSignatureClass::Native(logical_binary()),
70-
vec![TypeSignatureClass::Native(logical_binary())],
73+
vec![
74+
TypeSignatureClass::Native(logical_binary()),
75+
TypeSignatureClass::Native(logical_null()),
76+
],
7177
NativeType::Binary,
7278
)]),
7379
],

datafusion/functions/src/crypto/sha224.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use super::basic::{sha224, utf8_or_binary_to_binary_type};
2020
use arrow::datatypes::DataType;
2121
use datafusion_common::{
22-
types::{logical_binary, logical_string, NativeType},
22+
types::{logical_binary, logical_null, logical_string, NativeType},
2323
Result,
2424
};
2525
use datafusion_expr::{
@@ -62,12 +62,18 @@ impl SHA224Func {
6262
vec![
6363
TypeSignature::Coercible(vec![Coercion::new_implicit(
6464
TypeSignatureClass::Native(logical_binary()),
65-
vec![TypeSignatureClass::Native(logical_string())],
65+
vec![
66+
TypeSignatureClass::Native(logical_string()),
67+
TypeSignatureClass::Native(logical_null()),
68+
],
6669
NativeType::String,
6770
)]),
6871
TypeSignature::Coercible(vec![Coercion::new_implicit(
6972
TypeSignatureClass::Native(logical_binary()),
70-
vec![TypeSignatureClass::Native(logical_binary())],
73+
vec![
74+
TypeSignatureClass::Native(logical_binary()),
75+
TypeSignatureClass::Native(logical_null()),
76+
],
7177
NativeType::Binary,
7278
)]),
7379
],

datafusion/functions/src/crypto/sha256.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use super::basic::{sha256, utf8_or_binary_to_binary_type};
2020
use arrow::datatypes::DataType;
2121
use datafusion_common::{
22-
types::{logical_binary, logical_string, NativeType},
22+
types::{logical_binary, logical_null, logical_string, NativeType},
2323
Result,
2424
};
2525
use datafusion_expr::{
@@ -61,12 +61,18 @@ impl SHA256Func {
6161
vec![
6262
TypeSignature::Coercible(vec![Coercion::new_implicit(
6363
TypeSignatureClass::Native(logical_binary()),
64-
vec![TypeSignatureClass::Native(logical_string())],
64+
vec![
65+
TypeSignatureClass::Native(logical_string()),
66+
TypeSignatureClass::Native(logical_null()),
67+
],
6568
NativeType::String,
6669
)]),
6770
TypeSignature::Coercible(vec![Coercion::new_implicit(
6871
TypeSignatureClass::Native(logical_binary()),
69-
vec![TypeSignatureClass::Native(logical_binary())],
72+
vec![
73+
TypeSignatureClass::Native(logical_binary()),
74+
TypeSignatureClass::Native(logical_null()),
75+
],
7076
NativeType::Binary,
7177
)]),
7278
],

datafusion/functions/src/crypto/sha384.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use super::basic::{sha384, utf8_or_binary_to_binary_type};
2020
use arrow::datatypes::DataType;
2121
use datafusion_common::{
22-
types::{logical_binary, logical_string, NativeType},
22+
types::{logical_binary, logical_null, logical_string, NativeType},
2323
Result,
2424
};
2525
use datafusion_expr::{
@@ -61,12 +61,18 @@ impl SHA384Func {
6161
vec![
6262
TypeSignature::Coercible(vec![Coercion::new_implicit(
6363
TypeSignatureClass::Native(logical_binary()),
64-
vec![TypeSignatureClass::Native(logical_string())],
64+
vec![
65+
TypeSignatureClass::Native(logical_string()),
66+
TypeSignatureClass::Native(logical_null()),
67+
],
6568
NativeType::String,
6669
)]),
6770
TypeSignature::Coercible(vec![Coercion::new_implicit(
6871
TypeSignatureClass::Native(logical_binary()),
69-
vec![TypeSignatureClass::Native(logical_binary())],
72+
vec![
73+
TypeSignatureClass::Native(logical_binary()),
74+
TypeSignatureClass::Native(logical_null()),
75+
],
7076
NativeType::Binary,
7177
)]),
7278
],

datafusion/functions/src/crypto/sha512.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
use super::basic::{sha512, utf8_or_binary_to_binary_type};
2020
use arrow::datatypes::DataType;
2121
use datafusion_common::{
22-
types::{logical_binary, logical_string, NativeType},
22+
types::{logical_binary, logical_null, logical_string, NativeType},
2323
Result,
2424
};
2525
use datafusion_expr::{
@@ -61,12 +61,18 @@ impl SHA512Func {
6161
vec![
6262
TypeSignature::Coercible(vec![Coercion::new_implicit(
6363
TypeSignatureClass::Native(logical_binary()),
64-
vec![TypeSignatureClass::Native(logical_string())],
64+
vec![
65+
TypeSignatureClass::Native(logical_string()),
66+
TypeSignatureClass::Native(logical_null()),
67+
],
6568
NativeType::String,
6669
)]),
6770
TypeSignature::Coercible(vec![Coercion::new_implicit(
6871
TypeSignatureClass::Native(logical_binary()),
69-
vec![TypeSignatureClass::Native(logical_binary())],
72+
vec![
73+
TypeSignatureClass::Native(logical_binary()),
74+
TypeSignatureClass::Native(logical_null()),
75+
],
7076
NativeType::Binary,
7177
)]),
7278
],

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
),

0 commit comments

Comments
 (0)