in datafusion/expr-common/src/type_coercion/binary.rs [2188:2442]
fn test_type_coercion_compare() -> Result<()> {
// boolean
test_coercion_binary_rule!(
DataType::Boolean,
DataType::Boolean,
Operator::Eq,
DataType::Boolean
);
// float
test_coercion_binary_rule!(
DataType::Float32,
DataType::Int64,
Operator::Eq,
DataType::Float32
);
test_coercion_binary_rule!(
DataType::Float32,
DataType::Float64,
Operator::GtEq,
DataType::Float64
);
// signed integer
test_coercion_binary_rule!(
DataType::Int8,
DataType::Int32,
Operator::LtEq,
DataType::Int32
);
test_coercion_binary_rule!(
DataType::Int64,
DataType::Int32,
Operator::LtEq,
DataType::Int64
);
// unsigned integer
test_coercion_binary_rule!(
DataType::UInt32,
DataType::UInt8,
Operator::Gt,
DataType::UInt32
);
test_coercion_binary_rule!(
DataType::UInt64,
DataType::UInt8,
Operator::Eq,
DataType::UInt64
);
test_coercion_binary_rule!(
DataType::UInt64,
DataType::Int64,
Operator::Eq,
DataType::Decimal128(20, 0)
);
// numeric/decimal
test_coercion_binary_rule!(
DataType::Int64,
DataType::Decimal128(10, 0),
Operator::Eq,
DataType::Decimal128(20, 0)
);
test_coercion_binary_rule!(
DataType::Int64,
DataType::Decimal128(10, 2),
Operator::Lt,
DataType::Decimal128(22, 2)
);
test_coercion_binary_rule!(
DataType::Float64,
DataType::Decimal128(10, 3),
Operator::Gt,
DataType::Decimal128(30, 15)
);
test_coercion_binary_rule!(
DataType::Int64,
DataType::Decimal128(10, 0),
Operator::Eq,
DataType::Decimal128(20, 0)
);
test_coercion_binary_rule!(
DataType::Decimal128(14, 2),
DataType::Decimal128(10, 3),
Operator::GtEq,
DataType::Decimal128(15, 3)
);
test_coercion_binary_rule!(
DataType::UInt64,
DataType::Decimal128(20, 0),
Operator::Eq,
DataType::Decimal128(20, 0)
);
// Binary
test_coercion_binary_rule!(
DataType::Binary,
DataType::Binary,
Operator::Eq,
DataType::Binary
);
test_coercion_binary_rule!(
DataType::Utf8,
DataType::Binary,
Operator::Eq,
DataType::Binary
);
test_coercion_binary_rule!(
DataType::Binary,
DataType::Utf8,
Operator::Eq,
DataType::Binary
);
// LargeBinary
test_coercion_binary_rule!(
DataType::LargeBinary,
DataType::LargeBinary,
Operator::Eq,
DataType::LargeBinary
);
test_coercion_binary_rule!(
DataType::Binary,
DataType::LargeBinary,
Operator::Eq,
DataType::LargeBinary
);
test_coercion_binary_rule!(
DataType::LargeBinary,
DataType::Binary,
Operator::Eq,
DataType::LargeBinary
);
test_coercion_binary_rule!(
DataType::Utf8,
DataType::LargeBinary,
Operator::Eq,
DataType::LargeBinary
);
test_coercion_binary_rule!(
DataType::LargeBinary,
DataType::Utf8,
Operator::Eq,
DataType::LargeBinary
);
test_coercion_binary_rule!(
DataType::LargeUtf8,
DataType::LargeBinary,
Operator::Eq,
DataType::LargeBinary
);
test_coercion_binary_rule!(
DataType::LargeBinary,
DataType::LargeUtf8,
Operator::Eq,
DataType::LargeBinary
);
// Timestamps
let utc: Option<Arc<str>> = Some("UTC".into());
test_coercion_binary_rule!(
DataType::Timestamp(TimeUnit::Second, utc.clone()),
DataType::Timestamp(TimeUnit::Second, utc.clone()),
Operator::Eq,
DataType::Timestamp(TimeUnit::Second, utc.clone())
);
test_coercion_binary_rule!(
DataType::Timestamp(TimeUnit::Second, utc.clone()),
DataType::Timestamp(TimeUnit::Second, Some("Europe/Brussels".into())),
Operator::Eq,
DataType::Timestamp(TimeUnit::Second, utc.clone())
);
test_coercion_binary_rule!(
DataType::Timestamp(TimeUnit::Second, Some("America/New_York".into())),
DataType::Timestamp(TimeUnit::Second, Some("Europe/Brussels".into())),
Operator::Eq,
DataType::Timestamp(TimeUnit::Second, Some("America/New_York".into()))
);
test_coercion_binary_rule!(
DataType::Timestamp(TimeUnit::Second, Some("Europe/Brussels".into())),
DataType::Timestamp(TimeUnit::Second, utc),
Operator::Eq,
DataType::Timestamp(TimeUnit::Second, Some("Europe/Brussels".into()))
);
// list
let inner_field = Arc::new(Field::new_list_field(DataType::Int64, true));
test_coercion_binary_rule!(
DataType::List(Arc::clone(&inner_field)),
DataType::List(Arc::clone(&inner_field)),
Operator::Eq,
DataType::List(Arc::clone(&inner_field))
);
test_coercion_binary_rule!(
DataType::List(Arc::clone(&inner_field)),
DataType::LargeList(Arc::clone(&inner_field)),
Operator::Eq,
DataType::LargeList(Arc::clone(&inner_field))
);
test_coercion_binary_rule!(
DataType::LargeList(Arc::clone(&inner_field)),
DataType::List(Arc::clone(&inner_field)),
Operator::Eq,
DataType::LargeList(Arc::clone(&inner_field))
);
test_coercion_binary_rule!(
DataType::LargeList(Arc::clone(&inner_field)),
DataType::LargeList(Arc::clone(&inner_field)),
Operator::Eq,
DataType::LargeList(Arc::clone(&inner_field))
);
test_coercion_binary_rule!(
DataType::FixedSizeList(Arc::clone(&inner_field), 10),
DataType::FixedSizeList(Arc::clone(&inner_field), 10),
Operator::Eq,
DataType::FixedSizeList(Arc::clone(&inner_field), 10)
);
test_coercion_binary_rule!(
DataType::FixedSizeList(Arc::clone(&inner_field), 10),
DataType::LargeList(Arc::clone(&inner_field)),
Operator::Eq,
DataType::LargeList(Arc::clone(&inner_field))
);
test_coercion_binary_rule!(
DataType::LargeList(Arc::clone(&inner_field)),
DataType::FixedSizeList(Arc::clone(&inner_field), 10),
Operator::Eq,
DataType::LargeList(Arc::clone(&inner_field))
);
test_coercion_binary_rule!(
DataType::List(Arc::clone(&inner_field)),
DataType::FixedSizeList(Arc::clone(&inner_field), 10),
Operator::Eq,
DataType::List(Arc::clone(&inner_field))
);
test_coercion_binary_rule!(
DataType::FixedSizeList(Arc::clone(&inner_field), 10),
DataType::List(Arc::clone(&inner_field)),
Operator::Eq,
DataType::List(Arc::clone(&inner_field))
);
// Negative test: inner_timestamp_field and inner_field are not compatible because their inner types are not compatible
let inner_timestamp_field = Arc::new(Field::new_list_field(
DataType::Timestamp(TimeUnit::Microsecond, None),
true,
));
let result_type = BinaryTypeCoercer::new(
&DataType::List(Arc::clone(&inner_field)),
&Operator::Eq,
&DataType::List(Arc::clone(&inner_timestamp_field)),
)
.get_input_types();
assert!(result_type.is_err());
// TODO add other data type
Ok(())
}