@@ -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