liukun4515 commented on code in PR #2376: URL: https://github.com/apache/arrow-rs/pull/2376#discussion_r941925548
########## arrow/src/compute/kernels/cast.rs: ########## @@ -1252,34 +1265,125 @@ const fn time_unit_multiple(unit: &TimeUnit) -> i64 { } /// Cast one type of decimal array to another type of decimal array -fn cast_decimal_to_decimal( +fn cast_decimal_to_decimal<const BYTE_WIDTH1: usize, const BYTE_WIDTH2: usize>( array: &ArrayRef, input_scale: &usize, output_precision: &usize, output_scale: &usize, ) -> Result<ArrayRef> { - let array = array.as_any().downcast_ref::<Decimal128Array>().unwrap(); - - let output_array = if input_scale > output_scale { + if input_scale > output_scale { // For example, input_scale is 4 and output_scale is 3; // Original value is 11234_i128, and will be cast to 1123_i128. let div = 10_i128.pow((input_scale - output_scale) as u32); - array - .iter() - .map(|v| v.map(|v| v.as_i128() / div)) - .collect::<Decimal128Array>() + if BYTE_WIDTH1 == 16 { + let array = array.as_any().downcast_ref::<Decimal128Array>().unwrap(); + let iter = array.iter().map(|v| v.map(|v| v.as_i128() / div)); + if BYTE_WIDTH2 == 16 { + let output_array = iter + .collect::<Decimal128Array>() + .with_precision_and_scale(*output_precision, *output_scale)?; + + Ok(Arc::new(output_array)) + } else { + let output_array = iter + .map(|v| v.map(BigInt::from)) + .collect::<Decimal256Array>() + .with_precision_and_scale(*output_precision, *output_scale)?; + + Ok(Arc::new(output_array)) + } + } else { + let array = array.as_any().downcast_ref::<Decimal256Array>().unwrap(); + let iter = array.iter().map(|v| v.map(|v| v.to_big_int().div(div))); + if BYTE_WIDTH2 == 16 { + let values = iter + .map(|v| { + if v.is_none() { + Ok(None) + } else { + v.and_then(|v| v.to_i128()) + .ok_or_else(|| { + ArrowError::InvalidArgumentError( + "Cannot be casted to 128-bit integer for Decimal128" + .to_string(), Review Comment: ```suggestion format!("{:?} cannot be casted to 128-bit integer for Decimal128", v) ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org