@@ -4,7 +4,7 @@ use arrow::{
4
4
array:: {
5
5
Array as ArrowArray , ArrayRef as ArrowArrayRef , ArrowPrimitiveType , BinaryArray ,
6
6
BooleanArray as ArrowBooleanArray , FixedSizeListArray as ArrowFixedSizeListArray ,
7
- ListArray as ArrowListArray , PrimitiveArray as ArrowPrimitiveArray ,
7
+ LargeBinaryArray , ListArray as ArrowListArray , PrimitiveArray as ArrowPrimitiveArray ,
8
8
StringArray as ArrowStringArray , StructArray as ArrowStructArray ,
9
9
} ,
10
10
buffer:: { BooleanBuffer as ArrowBooleanBuffer , Buffer , ScalarBuffer as ArrowScalarBuffer } ,
@@ -533,7 +533,7 @@ where
533
533
} ) )
534
534
}
535
535
536
- // We special case `&[u8]` so that it works both for `List[u8]` and `Binary` arrays.
536
+ // We special case `&[u8]` so that it works both for `List[u8]` and `Binary/LargeBinary ` arrays.
537
537
fn slice_as_u8 < ' a > (
538
538
component_descriptor : ComponentDescriptor ,
539
539
array : & ' a dyn ArrowArray ,
@@ -545,14 +545,28 @@ fn slice_as_u8<'a>(
545
545
let lengths = offsets. lengths ( ) . collect_vec ( ) ;
546
546
547
547
// NOTE: No need for validity checks here, `component_spans` already takes care of that.
548
- Either :: Left ( component_spans. map ( move |span| {
548
+ Either :: Left ( Either :: Left ( component_spans. map ( move |span| {
549
549
let offsets = & offsets[ span. range ( ) ] ;
550
550
let lengths = & lengths[ span. range ( ) ] ;
551
551
izip ! ( offsets, lengths)
552
552
// NOTE: Not an actual clone, just a refbump of the underlying buffer.
553
553
. map ( |( & idx, & len) | values. clone ( ) . slice_with_length ( idx as _ , len) )
554
554
. collect_vec ( )
555
- } ) )
555
+ } ) ) )
556
+ } else if let Some ( binary_array) = array. downcast_array_ref :: < LargeBinaryArray > ( ) {
557
+ let values = binary_array. values ( ) ;
558
+ let offsets = binary_array. offsets ( ) ;
559
+ let lengths = offsets. lengths ( ) . collect_vec ( ) ;
560
+
561
+ // NOTE: No need for validity checks here, `component_spans` already takes care of that.
562
+ Either :: Left ( Either :: Right ( component_spans. map ( move |span| {
563
+ let offsets = & offsets[ span. range ( ) ] ;
564
+ let lengths = & lengths[ span. range ( ) ] ;
565
+ izip ! ( offsets, lengths)
566
+ // NOTE: Not an actual clone, just a refbump of the underlying buffer.
567
+ . map ( |( & idx, & len) | values. clone ( ) . slice_with_length ( idx as _ , len) )
568
+ . collect_vec ( )
569
+ } ) ) )
556
570
} else {
557
571
Either :: Right (
558
572
slice_as_buffer_native :: < arrow:: array:: types:: UInt8Type , u8 > (
0 commit comments