Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
viirya committed Jul 3, 2023
1 parent 88342e1 commit ae446cb
Showing 1 changed file with 55 additions and 2 deletions.
57 changes: 55 additions & 2 deletions arrow-arith/src/arithmetic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1702,10 +1702,12 @@ pub fn multiply_fixed_point_scalar_checked(
left: &PrimitiveArray<Decimal128Type>,
scalar: i128,
required_scale: i8,
scalar_precision: u8,
scalar_scale: i8,
) -> Result<PrimitiveArray<Decimal128Type>, ArrowError> {
let (precision, product_scale, divisor) = get_fixed_point_info(
(left.precision(), left.scale()),
(left.precision(), left.scale()),
(scalar_precision, scalar_scale),
required_scale,
)?;

Expand Down Expand Up @@ -1747,10 +1749,12 @@ pub fn multiply_fixed_point_scalar(
left: &PrimitiveArray<Decimal128Type>,
scalar: i128,
required_scale: i8,
scalar_precision: u8,
scalar_scale: i8,
) -> Result<PrimitiveArray<Decimal128Type>, ArrowError> {
let (precision, product_scale, divisor) = get_fixed_point_info(
(left.precision(), left.scale()),
(left.precision(), left.scale()),
(scalar_precision, scalar_scale),
required_scale,
)?;

Expand Down Expand Up @@ -4236,6 +4240,55 @@ mod tests {
assert_eq!(&expected, &result);
}

#[test]
fn test_decimal_multiply_fixed_point_scalar() {
// [123456789]
let a = Decimal128Array::from(vec![123456789000000000000000000])
.with_precision_and_scale(38, 18)
.unwrap();

// 10
let b = 10000000000000000000;

// `multiply_scalar` overflows on this case.
let result = multiply_scalar(&a, b).unwrap();
let expected =
Decimal128Array::from(vec![-16672482290199102048610367863168958464])
.with_precision_and_scale(38, 10)
.unwrap();
assert_eq!(&expected, &result);

// Avoid overflow by reducing the scale.
let result = multiply_fixed_point_scalar(&a, b, 28, 38, 18).unwrap();
// [1234567890]
let expected =
Decimal128Array::from(vec![12345678900000000000000000000000000000])
.with_precision_and_scale(38, 28)
.unwrap();

assert_eq!(&expected, &result);
assert_eq!(
result.value_as_string(0),
"1234567890.0000000000000000000000000000"
);
}

#[test]
fn test_decimal_multiply_fixed_point_scalar_checked_overflow() {
// [99999999999123456789]
let a = Decimal128Array::from(vec![99999999999123456789000000000000000000])
.with_precision_and_scale(38, 18)
.unwrap();

// 9999999999910
let b = 9999999999910000000000000000000;

let err = multiply_fixed_point_scalar_checked(&a, b, 28, 38, 18).unwrap_err();
assert!(err.to_string().contains(
"Overflow happened on: 99999999999123456789000000000000000000 * 9999999999910000000000000000000"
));
}

#[test]
fn test_timestamp_second_add_interval() {
// timestamp second + interval year month
Expand Down

0 comments on commit ae446cb

Please sign in to comment.