@@ -121,7 +121,10 @@ impl<T> ArrowReaderBuilder<T> {
121121 /// Enables splitting of row group I/O into multiple reads, with the goal of loading less data
122122 /// into memory at a time.
123123 pub fn with_split_row_group_reads ( self , split_row_group_reads : bool ) -> Self {
124- Self { split_row_group_reads, ..self }
124+ Self {
125+ split_row_group_reads,
126+ ..self
127+ }
125128 }
126129
127130 /// Only read data from the provided row group indexes
@@ -329,7 +332,7 @@ impl ArrowReaderOptions {
329332 ///
330333 /// // Create the reader and read the data using the supplied schema.
331334 /// let mut reader = builder.build().unwrap();
332- /// let _batch = reader.next().unwrap().unwrap();
335+ /// let _batch = reader.next().unwrap().unwrap();
333336 /// ```
334337 pub fn with_schema ( self , schema : SchemaRef ) -> Self {
335338 Self {
@@ -4069,7 +4072,7 @@ mod tests {
40694072 fn test_decimal_roundtrip < T : DecimalType > ( ) {
40704073 // Precision <= 9 -> INT32
40714074 // Precision <= 18 -> INT64
4072- // Precision > 18 -> FIXED_LEN_BYTE_ARRAY
4075+ // Precision > 27 -> FIXED_LEN_BYTE_ARRAY
40734076
40744077 let d = |values : Vec < usize > , p : u8 | {
40754078 let iter = values. into_iter ( ) . map ( T :: Native :: usize_as) ;
@@ -4081,7 +4084,7 @@ mod tests {
40814084 let d1 = d ( vec ! [ 1 , 2 , 3 , 4 , 5 ] , 9 ) ;
40824085 let d2 = d ( vec ! [ 1 , 2 , 3 , 4 , 10 . pow( 10 ) - 1 ] , 10 ) ;
40834086 let d3 = d ( vec ! [ 1 , 2 , 3 , 4 , 10 . pow( 18 ) - 1 ] , 18 ) ;
4084- let d4 = d ( vec ! [ 1 , 2 , 3 , 4 , 10 . pow( 19 ) - 1 ] , 19 ) ;
4087+ let d4 = d ( vec ! [ 1 , 2 , 3 , 4 , 10 . pow( 18 ) - 1 ] , 28 ) ;
40854088
40864089 let batch = RecordBatch :: try_from_iter ( [
40874090 ( "d1" , Arc :: new ( d1) as ArrayRef ) ,
@@ -4113,10 +4116,57 @@ mod tests {
41134116 assert_eq ! ( batch, out) ;
41144117 }
41154118
4119+ fn test_decimal_roundtrip_int96 ( ) {
4120+ // Decimal128 Precision > 18 && <= 27 -> INT96
4121+ // Decimal256 Precision > 18 && <= 27 -> FIXED_LEN_BYTE_ARRAY
4122+
4123+ fn d < T : DecimalType > ( values : Vec < usize > , p : u8 ) -> PrimitiveArray < T > {
4124+ let iter = values. into_iter ( ) . map ( T :: Native :: usize_as) ;
4125+ PrimitiveArray :: < T > :: from_iter_values ( iter)
4126+ . with_precision_and_scale ( p, 2 )
4127+ . unwrap ( )
4128+ }
4129+
4130+ let d1 = d :: < Decimal128Type > ( vec ! [ 1 , 2 , 3 , 4 , 10 . pow( 18 ) - 1 ] , 19 ) ;
4131+ let d2 = d :: < Decimal128Type > ( vec ! [ 1 , 2 , 3 , 4 , 10 . pow( 18 ) - 1 ] , 27 ) ;
4132+ let d3 = d :: < Decimal256Type > ( vec ! [ 1 , 2 , 3 , 4 , 10 . pow( 18 ) - 1 ] , 19 ) ;
4133+ let d4 = d :: < Decimal256Type > ( vec ! [ 1 , 2 , 3 , 4 , 10 . pow( 18 ) - 1 ] , 27 ) ;
4134+
4135+ let batch = RecordBatch :: try_from_iter ( [
4136+ ( "d1" , Arc :: new ( d1) as ArrayRef ) ,
4137+ ( "d2" , Arc :: new ( d2) as ArrayRef ) ,
4138+ ( "d3" , Arc :: new ( d3) as ArrayRef ) ,
4139+ ( "d4" , Arc :: new ( d4) as ArrayRef ) ,
4140+ ] )
4141+ . unwrap ( ) ;
4142+
4143+ let mut buffer = Vec :: with_capacity ( 1024 ) ;
4144+ let mut writer = ArrowWriter :: try_new ( & mut buffer, batch. schema ( ) , None ) . unwrap ( ) ;
4145+ writer. write ( & batch) . unwrap ( ) ;
4146+ writer. close ( ) . unwrap ( ) ;
4147+
4148+ let builder = ParquetRecordBatchReaderBuilder :: try_new ( Bytes :: from ( buffer) ) . unwrap ( ) ;
4149+ let t1 = builder. parquet_schema ( ) . columns ( ) [ 0 ] . physical_type ( ) ;
4150+ assert_eq ! ( t1, PhysicalType :: INT96 ) ;
4151+ let t2 = builder. parquet_schema ( ) . columns ( ) [ 1 ] . physical_type ( ) ;
4152+ assert_eq ! ( t2, PhysicalType :: INT96 ) ;
4153+ let t3 = builder. parquet_schema ( ) . columns ( ) [ 2 ] . physical_type ( ) ;
4154+ assert_eq ! ( t3, PhysicalType :: FIXED_LEN_BYTE_ARRAY ) ;
4155+ let t4 = builder. parquet_schema ( ) . columns ( ) [ 3 ] . physical_type ( ) ;
4156+ assert_eq ! ( t4, PhysicalType :: FIXED_LEN_BYTE_ARRAY ) ;
4157+
4158+ let mut reader = builder. build ( ) . unwrap ( ) ;
4159+ assert_eq ! ( batch. schema( ) , reader. schema( ) ) ;
4160+
4161+ let out = reader. next ( ) . unwrap ( ) . unwrap ( ) ;
4162+ assert_eq ! ( batch, out) ;
4163+ }
4164+
41164165 #[ test]
41174166 fn test_decimal ( ) {
41184167 test_decimal_roundtrip :: < Decimal128Type > ( ) ;
41194168 test_decimal_roundtrip :: < Decimal256Type > ( ) ;
4169+ test_decimal_roundtrip_int96 ( ) ;
41204170 }
41214171
41224172 #[ test]
0 commit comments