diff --git a/arrow-cast/src/cast/decimal.rs b/arrow-cast/src/cast/decimal.rs index ba82ca9040c7..fee9c007c0ae 100644 --- a/arrow-cast/src/cast/decimal.rs +++ b/arrow-cast/src/cast/decimal.rs @@ -167,8 +167,7 @@ where let array: PrimitiveArray = if input_scale == output_scale && input_precision <= output_precision { array.clone() - } else if input_scale < output_scale { - // the scale doesn't change, but precision may change and cause overflow + } else if input_scale <= output_scale { convert_to_bigger_or_equal_scale_decimal::( array, input_scale, diff --git a/arrow-cast/src/cast/mod.rs b/arrow-cast/src/cast/mod.rs index 440d0a8becde..00d6b149647b 100644 --- a/arrow-cast/src/cast/mod.rs +++ b/arrow-cast/src/cast/mod.rs @@ -9980,7 +9980,26 @@ mod tests { }; let result = cast_with_options(&array, &output_type, &options); assert_eq!(result.unwrap_err().to_string(), - "Invalid argument error: 123456790 is too large to store in a Decimal128 of precision 6. Max is 999999"); + "Invalid argument error: 123456789 is too large to store in a Decimal128 of precision 6. Max is 999999"); + } + + #[test] + fn test_decimal_to_decimal_same_scale() { + let array = vec![Some(520)]; + let array = create_decimal_array(array, 4, 2).unwrap(); + let input_type = DataType::Decimal128(4, 2); + let output_type = DataType::Decimal128(3, 2); + assert!(can_cast_types(&input_type, &output_type)); + + let options = CastOptions { + safe: false, + ..Default::default() + }; + let result = cast_with_options(&array, &output_type, &options); + assert_eq!( + result.unwrap().as_primitive::().value(0), + 520 + ); } #[test]