Skip to content

Commit ee08830

Browse files
committed
Inline List PiecewiseSequence range length checks
Signed-off-by: Daniel King <dan@spiraldb.com>
1 parent 11ae1b5 commit ee08830

1 file changed

Lines changed: 33 additions & 18 deletions

File tree

  • vortex-array/src/arrays/list/compute

vortex-array/src/arrays/list/compute/take.rs

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ use crate::arrays::dict::TakeExecute;
2222
use crate::arrays::list::ListArrayExt;
2323
use crate::arrays::piecewise_sequence::UnitMultiplierLengths;
2424
use 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;
2725
use crate::arrays::primitive::PrimitiveArrayExt;
2826
use crate::builders::ArrayBuilder;
2927
use 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

Comments
 (0)