@@ -327,6 +327,7 @@ impl<'a> ArrayVariantToArrowRowBuilder<'a> {
327327 ) -> Result < Self > {
328328 use ArrayVariantToArrowRowBuilder :: * ;
329329
330+ // Make List/ListView builders without repeating the constructor boilerplate.
330331 macro_rules! make_list_builder {
331332 ( $variant: ident, $offset: ty, $is_view: expr, $field: ident) => {
332333 $variant( VariantToListArrowRowBuilder :: <$offset, $is_view>:: try_new(
@@ -401,11 +402,12 @@ where
401402 cast_options : & ' a CastOptions ,
402403 capacity : usize ,
403404 ) -> Result < Self > {
404- let mut offsets = Vec :: with_capacity ( capacity. checked_add ( 1 ) . ok_or_else ( || {
405- ArrowError :: ComputeError (
406- "Capacity exceeded usize::MAX when reserving list offsets" . to_string ( ) ,
407- )
408- } ) ?) ;
405+ if capacity >= isize:: MAX as usize {
406+ return Err ( ArrowError :: ComputeError (
407+ "Capacity exceeds isize::MAX when reserving list offsets" . to_string ( ) ,
408+ ) ) ;
409+ }
410+ let mut offsets = Vec :: with_capacity ( capacity + 1 ) ;
409411 offsets. push ( O :: ZERO ) ;
410412 let element_builder = make_variant_to_shredded_variant_arrow_row_builder (
411413 element_data_type,
@@ -449,7 +451,8 @@ where
449451 ) ;
450452
451453 if IS_VIEW {
452- let mut sizes = Vec :: with_capacity ( self . offsets . len ( ) . saturating_sub ( 1 ) ) ;
454+ // NOTE: `offsets` is never empty (constructor pushes an entry)
455+ let mut sizes = Vec :: with_capacity ( self . offsets . len ( ) - 1 ) ;
453456 for i in 1 ..self . offsets . len ( ) {
454457 sizes. push ( self . offsets [ i] - self . offsets [ i - 1 ] ) ;
455458 }
0 commit comments