From 0c3c686aa9b22a39b184167a3f2406dc92c86864 Mon Sep 17 00:00:00 2001 From: Remzi Yang <59198230+HaoYang670@users.noreply.github.com> Date: Fri, 12 Aug 2022 21:05:43 +0800 Subject: [PATCH] Make the API of `fn Decimal:new` be consistent with `fn Decimal:try_new_bytes` and add length bound for `Decimal::raw_value` (#2405) * add bound Signed-off-by: remzi <13716567376yh@gmail.com> * update doc Signed-off-by: remzi <13716567376yh@gmail.com> Signed-off-by: remzi <13716567376yh@gmail.com> --- arrow/src/array/array_decimal.rs | 2 ++ arrow/src/util/decimal.rs | 11 +++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/arrow/src/array/array_decimal.rs b/arrow/src/array/array_decimal.rs index 0565a402725..ed1d3102a13 100644 --- a/arrow/src/array/array_decimal.rs +++ b/arrow/src/array/array_decimal.rs @@ -122,6 +122,8 @@ impl BasicDecimalArray { self.raw_value_data_ptr().offset(pos as isize), Self::VALUE_LENGTH as usize, ) + .try_into() + .unwrap() }; BasicDecimal::::new(self.precision(), self.scale(), raw_val) } diff --git a/arrow/src/util/decimal.rs b/arrow/src/util/decimal.rs index 96399b87020..1b9cf80fd11 100644 --- a/arrow/src/util/decimal.rs +++ b/arrow/src/util/decimal.rs @@ -64,8 +64,7 @@ impl BasicDecimal { Self::MAX_PRECISION_SCALE_CONSTRUCTOR_DEFAULT_TYPE.3; /// Tries to create a decimal value from precision, scale and bytes. - /// If the length of bytes isn't same as the bit width of this decimal, - /// returning an error. The bytes should be stored in little-endian order. + /// The bytes should be stored in little-endian order. /// /// Safety: /// This method doesn't validate if the decimal value represented by the bytes @@ -114,17 +113,17 @@ impl BasicDecimal { /// Creates a decimal value from precision, scale, and bytes. /// /// Safety: - /// This method doesn't check if the length of bytes is compatible with this decimal. + /// This method doesn't check if the precision and scale are valid. /// Use `try_new_from_bytes` for safe constructor. - pub fn new(precision: usize, scale: usize, bytes: &[u8]) -> Self { + pub fn new(precision: usize, scale: usize, bytes: &[u8; BYTE_WIDTH]) -> Self { Self { precision, scale, - value: bytes.try_into().unwrap(), + value: *bytes, } } /// Returns the raw bytes of the integer representation of the decimal. - pub fn raw_value(&self) -> &[u8] { + pub fn raw_value(&self) -> &[u8; BYTE_WIDTH] { &self.value }