This is an automated email from the ASF dual-hosted git repository.
tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/master by this push:
new 6455e3401 Prevent precision=0 for decimal type (#3162)
6455e3401 is described below
commit 6455e340168595e8c69f8d4bae59487e651bd513
Author: Vrishabh <[email protected]>
AuthorDate: Tue Nov 22 22:25:36 2022 +0530
Prevent precision=0 for decimal type (#3162)
* Adding decimal precision checks
* Doc edits
---
arrow-array/src/array/primitive_array.rs | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/arrow-array/src/array/primitive_array.rs
b/arrow-array/src/array/primitive_array.rs
index 195e2dc19..487fc2a17 100644
--- a/arrow-array/src/array/primitive_array.rs
+++ b/arrow-array/src/array/primitive_array.rs
@@ -993,12 +993,13 @@ impl<T: ArrowPrimitiveType> From<ArrayData> for
PrimitiveArray<T> {
impl<T: DecimalType + ArrowPrimitiveType> PrimitiveArray<T> {
/// Returns a Decimal array with the same data as self, with the
- /// specified precision.
+ /// specified precision and scale.
///
/// Returns an Error if:
- /// 1. `precision` is larger than `T:MAX_PRECISION`
- /// 2. `scale` is larger than `T::MAX_SCALE`
- /// 3. `scale` is > `precision`
+ /// - `precision` is zero
+ /// - `precision` is larger than `T:MAX_PRECISION`
+ /// - `scale` is larger than `T::MAX_SCALE`
+ /// - `scale` is > `precision`
pub fn with_precision_and_scale(
self,
precision: u8,
@@ -1025,18 +1026,24 @@ impl<T: DecimalType + ArrowPrimitiveType>
PrimitiveArray<T> {
precision: u8,
scale: u8,
) -> Result<(), ArrowError> {
+ if precision == 0 {
+ return Err(ArrowError::InvalidArgumentError(format!(
+ "precision cannot be 0, has to be between [1, {}]",
+ T::MAX_PRECISION
+ )));
+ }
if precision > T::MAX_PRECISION {
return Err(ArrowError::InvalidArgumentError(format!(
"precision {} is greater than max {}",
precision,
- Decimal128Type::MAX_PRECISION
+ T::MAX_PRECISION
)));
}
if scale > T::MAX_SCALE {
return Err(ArrowError::InvalidArgumentError(format!(
"scale {} is greater than max {}",
scale,
- Decimal128Type::MAX_SCALE
+ T::MAX_SCALE
)));
}
if scale > precision {
@@ -1934,6 +1941,14 @@ mod tests {
arr.validate_decimal_precision(5).unwrap();
}
+ #[test]
+ #[should_panic(expected = "precision cannot be 0, has to be between [1,
38]")]
+ fn test_decimal_array_with_precision_zero() {
+ Decimal128Array::from_iter_values([12345, 456])
+ .with_precision_and_scale(0, 2)
+ .unwrap();
+ }
+
#[test]
#[should_panic(expected = "precision 40 is greater than max 38")]
fn test_decimal_array_with_precision_and_scale_invalid_precision() {