@@ -614,10 +614,12 @@ impl<'a> MutableArrayData<'a> {
614
614
615
615
/// Extends this [MutableArrayData] with null elements, disregarding the bound arrays
616
616
pub fn extend_nulls ( & mut self , len : usize ) {
617
- // TODO: null_buffer should probably be extended here as well
618
- // otherwise is_valid() could later panic
619
- // add test to confirm
620
617
self . data . null_count += len;
618
+
619
+ let null_bytes_count = bit_util:: ceil ( self . data . len + len, 8 ) ;
620
+ if null_bytes_count > self . data . null_buffer . len ( ) {
621
+ self . data . null_buffer . resize ( null_bytes_count, 0x00 ) ;
622
+ }
621
623
( self . extend_nulls ) ( & mut self . data , len) ;
622
624
self . data . len += len;
623
625
}
@@ -730,6 +732,39 @@ mod tests {
730
732
assert_eq ! ( array, expected) ;
731
733
}
732
734
735
+ #[ test]
736
+ fn test_extend_nulls ( ) {
737
+ let b = UInt8Array :: from ( vec ! [ Some ( 1 ) , Some ( 2 ) , Some ( 3 ) ] ) ;
738
+ let arrays = vec ! [ b. data( ) ] ;
739
+ let mut a = MutableArrayData :: new ( arrays, true , 2 ) ;
740
+ assert_eq ! ( a. data. null_buffer. len( ) , 1 ) ;
741
+ a. extend ( 0 , 0 , 3 ) ;
742
+ a. extend_nulls ( 6 ) ;
743
+ assert_eq ! ( a. data. null_buffer. len( ) , 2 ) ;
744
+ let result = a. freeze ( ) ;
745
+ let array = UInt8Array :: from ( result) ;
746
+ assert_eq ! ( array. data( ) . null_buffer( ) . unwrap( ) . len( ) , 2 ) ;
747
+ let expected = UInt8Array :: from ( vec ! [ Some ( 1 ) , Some ( 2 ) , Some ( 3 ) , None , None , None , None , None , None ] ) ;
748
+ assert_eq ! ( array, expected) ;
749
+
750
+ let b = UInt8Array :: from ( vec ! [ Some ( 1 ) , Some ( 2 ) , Some ( 3 ) ] ) ;
751
+ let arrays = vec ! [ b. data( ) ] ;
752
+ let mut a = MutableArrayData :: new ( arrays, true , 2 ) ;
753
+ assert_eq ! ( a. data. null_buffer. len( ) , 1 ) ;
754
+ a. extend ( 0 , 0 , 3 ) ;
755
+ a. extend_nulls ( 6 ) ;
756
+ assert_eq ! ( a. data. null_buffer. len( ) , 2 ) ;
757
+ a. extend ( 0 , 0 , 3 ) ;
758
+ assert_eq ! ( a. data. null_buffer. len( ) , 2 ) ;
759
+ let result = a. freeze ( ) ;
760
+ let array = UInt8Array :: from ( result) ;
761
+ assert_eq ! ( array. data( ) . null_buffer( ) . unwrap( ) . len( ) , 2 ) ;
762
+ let expected = UInt8Array :: from ( vec ! [ Some ( 1 ) , Some ( 2 ) , Some ( 3 ) , None , None , None , None , None , None , Some ( 1 ) , Some ( 2 ) , Some ( 3 ) ] ) ;
763
+ assert_eq ! ( array, expected) ;
764
+
765
+ }
766
+
767
+
733
768
#[ test]
734
769
fn test_list_null_offset ( ) -> Result < ( ) > {
735
770
let int_builder = Int64Builder :: new ( 24 ) ;
0 commit comments