@@ -437,22 +437,20 @@ where
437437
438438 for & start in starts {
439439 let start = start. as_ ( ) ;
440- let end = start
441- . checked_add ( length)
442- . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray range overflows usize" ) ) ?;
443440 if length == 0 {
444441 continue ;
445442 }
446443
447- let byte_start = offsets[ start] . as_ ( ) ;
448- let byte_end = offsets[ end] . as_ ( ) ;
444+ let offset_range = & offsets[ start..] [ ..=length] ;
445+ let byte_start = offset_range[ 0 ] . as_ ( ) ;
446+ let byte_end = offset_range[ length] . as_ ( ) ;
449447 vortex_ensure ! (
450448 byte_start <= byte_end && byte_end <= data. len( ) ,
451449 "VarBin offsets range {byte_start}..{byte_end} exceeds data length {}" ,
452450 data. len( )
453451 ) ;
454452
455- for & offset in & offsets [ start + 1 ..=end ] {
453+ for & offset in & offset_range [ 1 ..] {
456454 let offset = offset. as_ ( ) ;
457455 let relative = offset. checked_sub ( byte_start) . ok_or_else ( || {
458456 vortex_err ! ( "VarBin offsets are not monotonic at offset {offset}" )
@@ -471,16 +469,14 @@ where
471469 let mut new_data = ByteBufferMut :: with_capacity ( output_bytes) ;
472470 for & start in starts {
473471 let start = start. as_ ( ) ;
474- let end = start
475- . checked_add ( length)
476- . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray range overflows usize" ) ) ?;
477472 if length == 0 {
478473 continue ;
479474 }
480475
481- let byte_start = offsets[ start] . as_ ( ) ;
482- let byte_end = offsets[ end] . as_ ( ) ;
483- new_data. extend_from_slice ( & data[ byte_start..byte_end] ) ;
476+ let offset_range = & offsets[ start..] [ ..=length] ;
477+ let byte_start = offset_range[ 0 ] . as_ ( ) ;
478+ let byte_end = offset_range[ length] . as_ ( ) ;
479+ new_data. extend_from_slice ( & data[ byte_start..] [ ..byte_end - byte_start] ) ;
484480 }
485481
486482 let offsets = PrimitiveArray :: new ( new_offsets. freeze ( ) , Validity :: NonNullable )
@@ -514,25 +510,23 @@ where
514510 for ( & start, & length) in starts. iter ( ) . zip_eq ( lengths) {
515511 let start = start. as_ ( ) ;
516512 let length = length. as_ ( ) ;
517- let end = start
518- . checked_add ( length)
519- . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray range overflows usize" ) ) ?;
520513 computed_len = computed_len
521514 . checked_add ( length)
522515 . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray output length overflows usize" ) ) ?;
523516 if length == 0 {
524517 continue ;
525518 }
526519
527- let byte_start = offsets[ start] . as_ ( ) ;
528- let byte_end = offsets[ end] . as_ ( ) ;
520+ let offset_range = & offsets[ start..] [ ..=length] ;
521+ let byte_start = offset_range[ 0 ] . as_ ( ) ;
522+ let byte_end = offset_range[ length] . as_ ( ) ;
529523 vortex_ensure ! (
530524 byte_start <= byte_end && byte_end <= data. len( ) ,
531525 "VarBin offsets range {byte_start}..{byte_end} exceeds data length {}" ,
532526 data. len( )
533527 ) ;
534528
535- for & offset in & offsets [ start + 1 ..=end ] {
529+ for & offset in & offset_range [ 1 ..] {
536530 let offset = offset. as_ ( ) ;
537531 let relative = offset. checked_sub ( byte_start) . ok_or_else ( || {
538532 vortex_err ! ( "VarBin offsets are not monotonic at offset {offset}" )
@@ -556,16 +550,14 @@ where
556550 for ( & start, & length) in starts. iter ( ) . zip_eq ( lengths) {
557551 let start = start. as_ ( ) ;
558552 let length = length. as_ ( ) ;
559- let end = start
560- . checked_add ( length)
561- . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray range overflows usize" ) ) ?;
562553 if length == 0 {
563554 continue ;
564555 }
565556
566- let byte_start = offsets[ start] . as_ ( ) ;
567- let byte_end = offsets[ end] . as_ ( ) ;
568- new_data. extend_from_slice ( & data[ byte_start..byte_end] ) ;
557+ let offset_range = & offsets[ start..] [ ..=length] ;
558+ let byte_start = offset_range[ 0 ] . as_ ( ) ;
559+ let byte_end = offset_range[ length] . as_ ( ) ;
560+ new_data. extend_from_slice ( & data[ byte_start..] [ ..byte_end - byte_start] ) ;
569561 }
570562
571563 let offsets = PrimitiveArray :: new ( new_offsets. freeze ( ) , Validity :: NonNullable )
0 commit comments