@@ -22,8 +22,6 @@ use crate::arrays::dict::TakeExecute;
2222use crate :: arrays:: list:: ListArrayExt ;
2323use crate :: arrays:: piecewise_sequence:: UnitMultiplierLengths ;
2424use crate :: arrays:: piecewise_sequence:: execute_unit_multiplier_index_arrays;
25- use crate :: arrays:: piecewise_sequence:: validate_index_ranges;
26- use crate :: arrays:: piecewise_sequence:: validate_index_ranges_constant;
2725use crate :: arrays:: primitive:: PrimitiveArrayExt ;
2826use crate :: builders:: ArrayBuilder ;
2927use crate :: builders:: PrimitiveBuilder ;
@@ -309,7 +307,14 @@ where
309307 S : UnsignedPType ,
310308 Offset : UnsignedPType ,
311309{
312- validate_index_ranges_constant ( array. len ( ) , starts, length, output_len) ?;
310+ let computed_len = starts
311+ . len ( )
312+ . checked_mul ( length)
313+ . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray output length overflows usize" ) ) ?;
314+ vortex_ensure ! (
315+ computed_len == output_len,
316+ "PiecewiseSequenceArray expanded length {computed_len} does not match declared length {output_len}"
317+ ) ;
313318 let total_elements =
314319 piecewise_list_elements_len_constant ( array. elements ( ) . len ( ) , offsets, starts, length) ?;
315320 let validity = array. validity ( ) ?. take ( indices_ref) ?;
@@ -347,7 +352,17 @@ where
347352 L : UnsignedPType ,
348353 Offset : UnsignedPType ,
349354{
350- validate_index_ranges ( array. len ( ) , starts, lengths, output_len) ?;
355+ let mut computed_len = 0usize ;
356+ for & length in lengths {
357+ let length: usize = length. as_ ( ) ;
358+ computed_len = computed_len
359+ . checked_add ( length)
360+ . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray output length overflows usize" ) ) ?;
361+ }
362+ vortex_ensure ! (
363+ computed_len == output_len,
364+ "PiecewiseSequenceArray expanded length {computed_len} does not match declared length {output_len}"
365+ ) ;
351366 let total_elements =
352367 piecewise_list_elements_len ( array. elements ( ) . len ( ) , offsets, starts, lengths) ?;
353368
@@ -390,13 +405,13 @@ where
390405 let mut total = 0usize ;
391406 for & start in starts {
392407 let start: usize = start. as_ ( ) ;
393- let end = start + length;
394408 if length == 0 {
395409 continue ;
396410 }
397411
398- let element_start: usize = offsets[ start] . as_ ( ) ;
399- let element_end: usize = offsets[ end] . as_ ( ) ;
412+ let offset_range = & offsets[ start..] [ ..=length] ;
413+ let element_start: usize = offset_range[ 0 ] . as_ ( ) ;
414+ let element_end: usize = offset_range[ length] . as_ ( ) ;
400415 vortex_ensure ! (
401416 element_start <= element_end && element_end <= elements_len,
402417 "List offsets range {element_start}..{element_end} exceeds elements length {elements_len}" ,
@@ -423,13 +438,13 @@ where
423438 for ( & start, & length) in starts. iter ( ) . zip_eq ( lengths) {
424439 let start: usize = start. as_ ( ) ;
425440 let length: usize = length. as_ ( ) ;
426- let end = start + length;
427441 if length == 0 {
428442 continue ;
429443 }
430444
431- let element_start: usize = offsets[ start] . as_ ( ) ;
432- let element_end: usize = offsets[ end] . as_ ( ) ;
445+ let offset_range = & offsets[ start..] [ ..=length] ;
446+ let element_start: usize = offset_range[ 0 ] . as_ ( ) ;
447+ let element_end: usize = offset_range[ length] . as_ ( ) ;
433448 vortex_ensure ! (
434449 element_start <= element_end && element_end <= elements_len,
435450 "List offsets range {element_start}..{element_end} exceeds elements length {elements_len}" ,
@@ -465,14 +480,14 @@ where
465480 new_offsets. push ( OutputOffset :: zero ( ) ) ;
466481 for & start in starts {
467482 let start: usize = start. as_ ( ) ;
468- let end = start + length;
469483 if length == 0 {
470484 continue ;
471485 }
472486
473- let element_start: usize = offsets[ start] . as_ ( ) ;
474- let element_end: usize = offsets[ end] . as_ ( ) ;
475- for & offset in & offsets[ start + 1 ..=end] {
487+ let offset_range = & offsets[ start..] [ ..=length] ;
488+ let element_start: usize = offset_range[ 0 ] . as_ ( ) ;
489+ let element_end: usize = offset_range[ length] . as_ ( ) ;
490+ for & offset in & offset_range[ 1 ..] {
476491 let offset: usize = offset. as_ ( ) ;
477492 let relative = offset
478493 . checked_sub ( element_start)
@@ -535,14 +550,14 @@ where
535550 for ( & start, & length) in starts. iter ( ) . zip_eq ( lengths) {
536551 let start: usize = start. as_ ( ) ;
537552 let length: usize = length. as_ ( ) ;
538- let end = start + length;
539553 if length == 0 {
540554 continue ;
541555 }
542556
543- let element_start: usize = offsets[ start] . as_ ( ) ;
544- let element_end: usize = offsets[ end] . as_ ( ) ;
545- for & offset in & offsets[ start + 1 ..=end] {
557+ let offset_range = & offsets[ start..] [ ..=length] ;
558+ let element_start: usize = offset_range[ 0 ] . as_ ( ) ;
559+ let element_end: usize = offset_range[ length] . as_ ( ) ;
560+ for & offset in & offset_range[ 1 ..] {
546561 let offset: usize = offset. as_ ( ) ;
547562 let relative = offset
548563 . checked_sub ( element_start)
0 commit comments