Skip to content

Commit

Permalink
fix coercion of null for decimal math in binary_rules (#3549)
Browse files Browse the repository at this point in the history
* fix

* revert refactor -- handedness matters to decimal rules
  • Loading branch information
kmitchener authored Sep 22, 2022
1 parent b134fa4 commit a080c03
Showing 1 changed file with 10 additions and 12 deletions.
22 changes: 10 additions & 12 deletions datafusion/expr/src/binary_rule.rs
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,9 @@ fn mathematics_numerical_coercion(
(Decimal128(_, _), Decimal128(_, _)) => {
coercion_decimal_mathematics_type(mathematics_op, lhs_type, rhs_type)
}
(Null, dec_type @ Decimal128(_, _)) | (dec_type @ Decimal128(_, _), Null) => {
Some(dec_type.clone())
}
(Decimal128(_, _), _) => {
let converted_decimal_type = coerce_numeric_type_to_decimal(rhs_type);
match converted_decimal_type {
Expand Down Expand Up @@ -616,19 +619,12 @@ fn eq_coercion(lhs_type: &DataType, rhs_type: &DataType) -> Option<DataType> {
}

/// coercion rules from NULL type. Since NULL can be casted to most of types in arrow,
/// either lhs or rhs is NULL, if NULL can be casted to type of the other side, the coecion is valid.
/// either lhs or rhs is NULL, if NULL can be casted to type of the other side, the coercion is valid.
fn null_coercion(lhs_type: &DataType, rhs_type: &DataType) -> Option<DataType> {
match (lhs_type, rhs_type) {
(DataType::Null, _) => {
if can_cast_types(&DataType::Null, rhs_type) {
Some(rhs_type.clone())
} else {
None
}
}
(_, DataType::Null) => {
if can_cast_types(&DataType::Null, lhs_type) {
Some(lhs_type.clone())
(DataType::Null, other_type) | (other_type, DataType::Null) => {
if can_cast_types(&DataType::Null, other_type) {
Some(other_type.clone())
} else {
None
}
Expand Down Expand Up @@ -671,6 +667,7 @@ mod tests {
DataType::Float64,
DataType::Decimal128(38, 10),
DataType::Decimal128(20, 8),
DataType::Null,
];
let result_types = [
DataType::Decimal128(20, 3),
Expand All @@ -681,6 +678,7 @@ mod tests {
DataType::Decimal128(32, 15),
DataType::Decimal128(38, 10),
DataType::Decimal128(25, 8),
DataType::Decimal128(20, 3),
];
let comparison_op_types = [
Operator::NotEq,
Expand Down Expand Up @@ -770,7 +768,7 @@ mod tests {
}

#[test]
fn test_dictionary_type_coersion() {
fn test_dictionary_type_coercion() {
use DataType::*;

let lhs_type = Dictionary(Box::new(Int8), Box::new(Int32));
Expand Down

0 comments on commit a080c03

Please sign in to comment.