Skip to content

Commit 885f31e

Browse files
committed
Ensure that a null index cannot create a panic
1 parent 286ddfe commit 885f31e

File tree

1 file changed

+25
-7
lines changed

1 file changed

+25
-7
lines changed

arrow-select/src/take.rs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -705,15 +705,33 @@ fn take_fixed_size_binary<IndexType: ArrowPrimitiveType>(
705705

706706
let values_buffer = values.values().as_slice();
707707
let mut values_buffer_builder = BufferBuilder::new(indices.len() * size_usize);
708-
let array_iter = indices.values().iter().map(|idx| {
709-
let offset = idx.as_usize() * size_usize;
710-
&values_buffer[offset..offset + size_usize]
711-
});
712-
for slice in array_iter {
713-
values_buffer_builder.append_slice(slice);
708+
709+
if indices.null_count() == 0 {
710+
let array_iter = indices.values().iter().map(|idx| {
711+
let offset = idx.as_usize() * size_usize;
712+
&values_buffer[offset..offset + size_usize]
713+
});
714+
for slice in array_iter {
715+
values_buffer_builder.append_slice(slice);
716+
}
717+
} else {
718+
// The indices nullability cannot be ignored here because the values buffer may contain
719+
// nulls which should not cause a panic.
720+
let array_iter = indices.iter().map(|idx| {
721+
idx.map(|idx| {
722+
let offset = idx.as_usize() * size_usize;
723+
&values_buffer[offset..offset + size_usize]
724+
})
725+
});
726+
for slice in array_iter {
727+
match slice {
728+
None => values_buffer_builder.append_n(size_usize, 0),
729+
Some(slice) => values_buffer_builder.append_slice(slice),
730+
}
731+
}
714732
}
715-
let values_buffer = values_buffer_builder.finish();
716733

734+
let values_buffer = values_buffer_builder.finish();
717735
let value_nulls = take_nulls(values.nulls(), indices);
718736
let final_nulls = NullBuffer::union(value_nulls.as_ref(), indices.nulls());
719737

0 commit comments

Comments
 (0)