Skip to content

Commit bc1a44a

Browse files
committed
refactor: update math functions signature with coercible
1 parent 75230f5 commit bc1a44a

File tree

14 files changed

+127
-58
lines changed

14 files changed

+127
-58
lines changed

datafusion-testing

Submodule datafusion-testing updated 257 files

datafusion/functions/src/math/abs.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ use datafusion_expr::interval_arithmetic::Interval;
3333
use datafusion_expr::sort_properties::{ExprProperties, SortProperties};
3434
use datafusion_expr::{
3535
ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
36-
Volatility,
36+
TypeSignature, TypeSignatureClass, Volatility,
3737
};
38+
use datafusion_expr_common::signature::Coercion;
3839
use datafusion_macros::user_doc;
3940

4041
type MathArrayFunction = fn(&ArrayRef) -> Result<ArrayRef>;
@@ -126,7 +127,12 @@ impl Default for AbsFunc {
126127
impl AbsFunc {
127128
pub fn new() -> Self {
128129
Self {
129-
signature: Signature::numeric(1, Volatility::Immutable),
130+
signature: Signature::new(
131+
TypeSignature::Coercible(vec![Coercion::new_exact(
132+
TypeSignatureClass::Numeric,
133+
)]),
134+
Volatility::Immutable,
135+
),
130136
}
131137
}
132138
}

datafusion/functions/src/math/cot.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,14 @@ use std::sync::Arc;
2121
use arrow::array::{ArrayRef, AsArray};
2222
use arrow::datatypes::DataType::{Float32, Float64};
2323
use arrow::datatypes::{DataType, Float32Type, Float64Type};
24+
use datafusion_common::types::NativeType;
25+
use datafusion_expr_common::signature::Coercion;
2426

2527
use crate::utils::make_scalar_function;
2628
use datafusion_common::{exec_err, Result};
27-
use datafusion_expr::{ColumnarValue, Documentation, ScalarFunctionArgs};
29+
use datafusion_expr::{
30+
ColumnarValue, Documentation, ScalarFunctionArgs, TypeSignature, TypeSignatureClass,
31+
};
2832
use datafusion_expr::{ScalarUDFImpl, Signature, Volatility};
2933
use datafusion_macros::user_doc;
3034

@@ -47,16 +51,18 @@ impl Default for CotFunc {
4751

4852
impl CotFunc {
4953
pub fn new() -> Self {
50-
use DataType::*;
5154
Self {
5255
// math expressions expect 1 argument of type f64 or f32
5356
// priority is given to f64 because e.g. `sqrt(1i32)` is in IR (real numbers) and thus we
5457
// return the best approximation for it (in f64).
5558
// We accept f32 because in this case it is clear that the best approximation
5659
// will be as good as the number of digits in the number
57-
signature: Signature::uniform(
58-
1,
59-
vec![Float64, Float32],
60+
signature: Signature::new(
61+
TypeSignature::Coercible(vec![Coercion::new_implicit(
62+
TypeSignatureClass::Float,
63+
vec![TypeSignatureClass::Integer],
64+
NativeType::Float64,
65+
)]),
6066
Volatility::Immutable,
6167
),
6268
}

datafusion/functions/src/math/factorial.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use arrow::{
1919
array::{ArrayRef, Int64Array},
2020
error::ArrowError,
2121
};
22+
use datafusion_expr_common::signature::Coercion;
2223
use std::any::Any;
2324
use std::sync::Arc;
2425

@@ -31,7 +32,7 @@ use datafusion_common::{
3132
};
3233
use datafusion_expr::{
3334
ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
34-
Volatility,
35+
TypeSignature, TypeSignatureClass, Volatility,
3536
};
3637
use datafusion_macros::user_doc;
3738

@@ -55,7 +56,12 @@ impl Default for FactorialFunc {
5556
impl FactorialFunc {
5657
pub fn new() -> Self {
5758
Self {
58-
signature: Signature::uniform(1, vec![Int64], Volatility::Immutable),
59+
signature: Signature::new(
60+
TypeSignature::Coercible(vec![Coercion::new_exact(
61+
TypeSignatureClass::Integer,
62+
)]),
63+
Volatility::Immutable,
64+
),
5965
}
6066
}
6167
}

datafusion/functions/src/math/gcd.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ use std::sync::Arc;
2626
use datafusion_common::{exec_err, internal_datafusion_err, Result, ScalarValue};
2727
use datafusion_expr::{
2828
ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
29-
Volatility,
29+
TypeSignature, TypeSignatureClass, Volatility,
3030
};
31+
use datafusion_expr_common::signature::Coercion;
3132
use datafusion_macros::user_doc;
3233

3334
#[user_doc(

datafusion/functions/src/math/iszero.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ use arrow::array::{ArrayRef, AsArray, BooleanArray};
2222
use arrow::datatypes::DataType::{Boolean, Float32, Float64};
2323
use arrow::datatypes::{DataType, Float32Type, Float64Type};
2424

25+
use datafusion_common::types::NativeType;
2526
use datafusion_common::{exec_err, Result};
26-
use datafusion_expr::TypeSignature::Exact;
27+
use datafusion_expr::TypeSignature::{self};
2728
use datafusion_expr::{
2829
ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
29-
Volatility,
30+
TypeSignatureClass, Volatility,
3031
};
32+
use datafusion_expr_common::signature::Coercion;
3133
use datafusion_macros::user_doc;
3234

3335
use crate::utils::make_scalar_function;
@@ -51,10 +53,13 @@ impl Default for IsZeroFunc {
5153

5254
impl IsZeroFunc {
5355
pub fn new() -> Self {
54-
use DataType::*;
5556
Self {
56-
signature: Signature::one_of(
57-
vec![Exact(vec![Float32]), Exact(vec![Float64])],
57+
signature: Signature::new(
58+
TypeSignature::Coercible(vec![Coercion::new_implicit(
59+
TypeSignatureClass::Float,
60+
vec![TypeSignatureClass::Integer],
61+
NativeType::Float64,
62+
)]),
5863
Volatility::Immutable,
5964
),
6065
}

datafusion/functions/src/math/lcm.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ use datafusion_common::{
2828
};
2929
use datafusion_expr::{
3030
ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
31-
Volatility,
31+
TypeSignature, TypeSignatureClass, Volatility,
3232
};
33+
use datafusion_expr_common::signature::Coercion;
3334
use datafusion_macros::user_doc;
3435

3536
use super::gcd::unsigned_gcd;
@@ -55,9 +56,14 @@ impl Default for LcmFunc {
5556

5657
impl LcmFunc {
5758
pub fn new() -> Self {
58-
use DataType::*;
5959
Self {
60-
signature: Signature::uniform(2, vec![Int64], Volatility::Immutable),
60+
signature: Signature::new(
61+
TypeSignature::Coercible(vec![
62+
Coercion::new_exact(TypeSignatureClass::Integer),
63+
Coercion::new_exact(TypeSignatureClass::Integer),
64+
]),
65+
Volatility::Immutable,
66+
),
6167
}
6268
}
6369
}

datafusion/functions/src/math/log.rs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use super::power::PowerFunc;
2424

2525
use arrow::array::{ArrayRef, AsArray};
2626
use arrow::datatypes::{DataType, Float32Type, Float64Type};
27+
use datafusion_common::types::NativeType;
2728
use datafusion_common::{
2829
exec_err, internal_err, plan_datafusion_err, plan_err, Result, ScalarValue,
2930
};
@@ -32,9 +33,10 @@ use datafusion_expr::simplify::{ExprSimplifyResult, SimplifyInfo};
3233
use datafusion_expr::sort_properties::{ExprProperties, SortProperties};
3334
use datafusion_expr::{
3435
lit, ColumnarValue, Documentation, Expr, ScalarFunctionArgs, ScalarUDF,
35-
TypeSignature::*,
36+
TypeSignature, TypeSignatureClass,
3637
};
3738
use datafusion_expr::{ScalarUDFImpl, Signature, Volatility};
39+
use datafusion_expr_common::signature::Coercion;
3840
use datafusion_macros::user_doc;
3941

4042
#[user_doc(
@@ -58,14 +60,26 @@ impl Default for LogFunc {
5860

5961
impl LogFunc {
6062
pub fn new() -> Self {
61-
use DataType::*;
6263
Self {
6364
signature: Signature::one_of(
6465
vec![
65-
Exact(vec![Float32]),
66-
Exact(vec![Float64]),
67-
Exact(vec![Float32, Float32]),
68-
Exact(vec![Float64, Float64]),
66+
TypeSignature::Coercible(vec![Coercion::new_implicit(
67+
TypeSignatureClass::Float,
68+
vec![TypeSignatureClass::Integer],
69+
NativeType::Float64,
70+
)]),
71+
TypeSignature::Coercible(vec![
72+
Coercion::new_implicit(
73+
TypeSignatureClass::Float,
74+
vec![TypeSignatureClass::Integer],
75+
NativeType::Float32,
76+
),
77+
Coercion::new_implicit(
78+
TypeSignatureClass::Float,
79+
vec![TypeSignatureClass::Integer],
80+
NativeType::Float64,
81+
),
82+
]),
6983
],
7084
Volatility::Immutable,
7185
),

datafusion/functions/src/math/nans.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@
1919
2020
use arrow::datatypes::{DataType, Float32Type, Float64Type};
2121
use datafusion_common::{exec_err, Result};
22-
use datafusion_expr::{ColumnarValue, ScalarFunctionArgs, TypeSignature};
22+
use datafusion_expr::{
23+
ColumnarValue, ScalarFunctionArgs, TypeSignature, TypeSignatureClass,
24+
};
2325

2426
use arrow::array::{ArrayRef, AsArray, BooleanArray};
2527
use datafusion_expr::{Documentation, ScalarUDFImpl, Signature, Volatility};
28+
use datafusion_expr_common::signature::Coercion;
2629
use datafusion_macros::user_doc;
2730
use std::any::Any;
2831
use std::sync::Arc;
@@ -46,13 +49,11 @@ impl Default for IsNanFunc {
4649

4750
impl IsNanFunc {
4851
pub fn new() -> Self {
49-
use DataType::*;
5052
Self {
51-
signature: Signature::one_of(
52-
vec![
53-
TypeSignature::Exact(vec![Float32]),
54-
TypeSignature::Exact(vec![Float64]),
55-
],
53+
signature: Signature::new(
54+
TypeSignature::Coercible(vec![Coercion::new_exact(
55+
TypeSignatureClass::Float,
56+
)]),
5657
Volatility::Immutable,
5758
),
5859
}

datafusion/functions/src/math/nanvl.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,14 @@ use crate::utils::make_scalar_function;
2323
use arrow::array::{ArrayRef, AsArray, Float32Array, Float64Array};
2424
use arrow::datatypes::DataType::{Float32, Float64};
2525
use arrow::datatypes::{DataType, Float32Type, Float64Type};
26+
use datafusion_common::types::NativeType;
2627
use datafusion_common::{exec_err, DataFusionError, Result};
27-
use datafusion_expr::TypeSignature::Exact;
2828
use datafusion_expr::{
2929
ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
3030
Volatility,
3131
};
32+
use datafusion_expr::{TypeSignature, TypeSignatureClass};
33+
use datafusion_expr_common::signature::Coercion;
3234
use datafusion_macros::user_doc;
3335

3436
#[user_doc(
@@ -58,10 +60,16 @@ impl Default for NanvlFunc {
5860

5961
impl NanvlFunc {
6062
pub fn new() -> Self {
61-
use DataType::*;
6263
Self {
63-
signature: Signature::one_of(
64-
vec![Exact(vec![Float32, Float32]), Exact(vec![Float64, Float64])],
64+
signature: Signature::new(
65+
TypeSignature::Coercible(vec![
66+
Coercion::new_exact(TypeSignatureClass::Float),
67+
Coercion::new_implicit(
68+
TypeSignatureClass::Float,
69+
vec![TypeSignatureClass::Integer],
70+
NativeType::Float64,
71+
),
72+
]),
6573
Volatility::Immutable,
6674
),
6775
}

datafusion/functions/src/math/power.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ use datafusion_expr::expr::ScalarFunction;
3131
use datafusion_expr::simplify::{ExprSimplifyResult, SimplifyInfo};
3232
use datafusion_expr::{
3333
ColumnarValue, Documentation, Expr, ScalarFunctionArgs, ScalarUDF, TypeSignature,
34+
TypeSignatureClass,
3435
};
3536
use datafusion_expr::{ScalarUDFImpl, Signature, Volatility};
37+
use datafusion_expr_common::signature::Coercion;
3638
use datafusion_macros::user_doc;
3739

3840
#[user_doc(
@@ -56,12 +58,17 @@ impl Default for PowerFunc {
5658

5759
impl PowerFunc {
5860
pub fn new() -> Self {
59-
use DataType::*;
6061
Self {
6162
signature: Signature::one_of(
6263
vec![
63-
TypeSignature::Exact(vec![Int64, Int64]),
64-
TypeSignature::Exact(vec![Float64, Float64]),
64+
TypeSignature::Coercible(vec![
65+
Coercion::new_exact(TypeSignatureClass::Integer),
66+
Coercion::new_exact(TypeSignatureClass::Integer),
67+
]),
68+
TypeSignature::Coercible(vec![
69+
Coercion::new_exact(TypeSignatureClass::Float),
70+
Coercion::new_exact(TypeSignatureClass::Float),
71+
]),
6572
],
6673
Volatility::Immutable,
6774
),

datafusion/functions/src/math/round.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ use arrow::datatypes::DataType::{Float32, Float64, Int32};
2626
use arrow::datatypes::{DataType, Float32Type, Float64Type, Int32Type};
2727
use datafusion_common::{exec_datafusion_err, exec_err, Result, ScalarValue};
2828
use datafusion_expr::sort_properties::{ExprProperties, SortProperties};
29-
use datafusion_expr::TypeSignature::Exact;
3029
use datafusion_expr::{
3130
ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
32-
Volatility,
31+
TypeSignature, TypeSignatureClass, Volatility,
3332
};
33+
use datafusion_expr_common::signature::Coercion;
3434
use datafusion_macros::user_doc;
3535

3636
#[user_doc(
@@ -56,14 +56,16 @@ impl Default for RoundFunc {
5656

5757
impl RoundFunc {
5858
pub fn new() -> Self {
59-
use DataType::*;
6059
Self {
6160
signature: Signature::one_of(
6261
vec![
63-
Exact(vec![Float64, Int64]),
64-
Exact(vec![Float32, Int64]),
65-
Exact(vec![Float64]),
66-
Exact(vec![Float32]),
62+
TypeSignature::Coercible(vec![Coercion::new_exact(
63+
TypeSignatureClass::Float,
64+
)]),
65+
TypeSignature::Coercible(vec![
66+
Coercion::new_exact(TypeSignatureClass::Float),
67+
Coercion::new_exact(TypeSignatureClass::Integer),
68+
]),
6769
],
6870
Volatility::Immutable,
6971
),

datafusion/functions/src/math/signum.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,14 @@ use arrow::array::{ArrayRef, AsArray};
2222
use arrow::datatypes::DataType::{Float32, Float64};
2323
use arrow::datatypes::{DataType, Float32Type, Float64Type};
2424

25+
use datafusion_common::types::NativeType;
2526
use datafusion_common::{exec_err, Result};
2627
use datafusion_expr::sort_properties::{ExprProperties, SortProperties};
2728
use datafusion_expr::{
2829
ColumnarValue, Documentation, ScalarFunctionArgs, ScalarUDFImpl, Signature,
29-
Volatility,
30+
TypeSignature, TypeSignatureClass, Volatility,
3031
};
32+
use datafusion_expr_common::signature::Coercion;
3133
use datafusion_macros::user_doc;
3234

3335
use crate::utils::make_scalar_function;
@@ -53,11 +55,13 @@ impl Default for SignumFunc {
5355

5456
impl SignumFunc {
5557
pub fn new() -> Self {
56-
use DataType::*;
5758
Self {
58-
signature: Signature::uniform(
59-
1,
60-
vec![Float64, Float32],
59+
signature: Signature::new(
60+
TypeSignature::Coercible(vec![Coercion::new_implicit(
61+
TypeSignatureClass::Float,
62+
vec![TypeSignatureClass::Integer],
63+
NativeType::Float64,
64+
)]),
6165
Volatility::Immutable,
6266
),
6367
}

0 commit comments

Comments
 (0)