@@ -22,8 +22,6 @@ use crate::arrays::VarBinArray;
2222use crate :: arrays:: dict:: TakeExecute ;
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 :: arrays:: varbin:: VarBinArrayExt ;
2927use crate :: dtype:: DType ;
@@ -424,15 +422,24 @@ where
424422 Offset : IntegerPType ,
425423 NewOffset : IntegerPType ,
426424{
427- validate_index_ranges_constant ( offsets. len ( ) - 1 , starts, length, output_len) ?;
425+ let computed_len = starts
426+ . len ( )
427+ . checked_mul ( length)
428+ . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray output length overflows usize" ) ) ?;
429+ vortex_ensure ! (
430+ computed_len == output_len,
431+ "PiecewiseSequenceArray expanded length {computed_len} does not match declared length {output_len}"
432+ ) ;
428433
429434 let mut new_offsets = BufferMut :: < NewOffset > :: with_capacity ( output_len + 1 ) ;
430435 new_offsets. push ( NewOffset :: zero ( ) ) ;
431436 let mut output_bytes = 0usize ;
432437
433438 for & start in starts {
434439 let start = start. as_ ( ) ;
435- let end = start + length;
440+ let end = start
441+ . checked_add ( length)
442+ . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray range overflows usize" ) ) ?;
436443 if length == 0 {
437444 continue ;
438445 }
@@ -464,7 +471,9 @@ where
464471 let mut new_data = ByteBufferMut :: with_capacity ( output_bytes) ;
465472 for & start in starts {
466473 let start = start. as_ ( ) ;
467- let end = start + length;
474+ let end = start
475+ . checked_add ( length)
476+ . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray range overflows usize" ) ) ?;
468477 if length == 0 {
469478 continue ;
470479 }
@@ -497,16 +506,20 @@ where
497506 Offset : IntegerPType ,
498507 NewOffset : IntegerPType ,
499508{
500- validate_index_ranges ( offsets. len ( ) - 1 , starts, lengths, output_len) ?;
501-
502509 let mut new_offsets = BufferMut :: < NewOffset > :: with_capacity ( output_len + 1 ) ;
503510 new_offsets. push ( NewOffset :: zero ( ) ) ;
504511 let mut output_bytes = 0usize ;
512+ let mut computed_len = 0usize ;
505513
506514 for ( & start, & length) in starts. iter ( ) . zip_eq ( lengths) {
507515 let start = start. as_ ( ) ;
508516 let length = length. as_ ( ) ;
509- let end = start + length;
517+ let end = start
518+ . checked_add ( length)
519+ . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray range overflows usize" ) ) ?;
520+ computed_len = computed_len
521+ . checked_add ( length)
522+ . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray output length overflows usize" ) ) ?;
510523 if length == 0 {
511524 continue ;
512525 }
@@ -534,12 +547,18 @@ where
534547 . checked_add ( byte_end - byte_start)
535548 . ok_or_else ( || vortex_err ! ( "PiecewiseSequence VarBin output byte length overflow" ) ) ?;
536549 }
550+ vortex_ensure ! (
551+ computed_len == output_len,
552+ "PiecewiseSequenceArray expanded length {computed_len} does not match declared length {output_len}"
553+ ) ;
537554
538555 let mut new_data = ByteBufferMut :: with_capacity ( output_bytes) ;
539556 for ( & start, & length) in starts. iter ( ) . zip_eq ( lengths) {
540557 let start = start. as_ ( ) ;
541558 let length = length. as_ ( ) ;
542- let end = start + length;
559+ let end = start
560+ . checked_add ( length)
561+ . ok_or_else ( || vortex_err ! ( "PiecewiseSequenceArray range overflows usize" ) ) ?;
543562 if length == 0 {
544563 continue ;
545564 }
0 commit comments