diff --git a/src/io/parquet/read/mod.rs b/src/io/parquet/read/mod.rs index c25451ebedd..e4579cdbfd7 100644 --- a/src/io/parquet/read/mod.rs +++ b/src/io/parquet/read/mod.rs @@ -4,7 +4,6 @@ use std::{ collections::VecDeque, io::{Read, Seek}, - iter::FromIterator, sync::Arc, }; @@ -327,22 +326,22 @@ fn page_iter_to_array> 8 * (16 - n) - }) - .collect::>(); + let values = fixed_size_binary_array + .values() + .chunks_exact(n) + .map(|value: &[u8]| { + // Copy the fixed-size byte value to the start of a 16 byte stack + // allocated buffer, then use an arithmetic right shift to fill in + // MSBs, which accounts for leading 1's in negative (two's complement) + // values. + let mut bytes = [0u8; 16]; + bytes[..n].copy_from_slice(value); + i128::from_be_bytes(bytes) >> (8 * (16 - n)) + }) + .collect::>(); let validity = fixed_size_binary_array.validity().cloned(); - let i128_array = PrimitiveArray::::from_data(data_type, values.into(), validity); + let i128_array = + PrimitiveArray::::from_data(data_type, values.into(), validity); Ok(Box::new(i128_array) as _) } _ => unreachable!(),