@@ -257,6 +257,13 @@ pub fn record_batch_to_duckdb_data_chunk(
257
257
fn primitive_array_to_flat_vector < T : ArrowPrimitiveType > ( array : & PrimitiveArray < T > , out_vector : & mut FlatVector ) {
258
258
// assert!(array.len() <= out_vector.capacity());
259
259
out_vector. copy :: < T :: Native > ( array. values ( ) ) ;
260
+ if let Some ( nulls) = array. nulls ( ) {
261
+ for ( i, null) in nulls. into_iter ( ) . enumerate ( ) {
262
+ if !null {
263
+ out_vector. set_null ( i) ;
264
+ }
265
+ }
266
+ }
260
267
}
261
268
262
269
fn primitive_array_to_flat_vector_cast < T : ArrowPrimitiveType > (
@@ -267,6 +274,13 @@ fn primitive_array_to_flat_vector_cast<T: ArrowPrimitiveType>(
267
274
let array = arrow:: compute:: kernels:: cast:: cast ( array, & data_type) . unwrap ( ) ;
268
275
let out_vector: & mut FlatVector = out_vector. as_mut_any ( ) . downcast_mut ( ) . unwrap ( ) ;
269
276
out_vector. copy :: < T :: Native > ( array. as_primitive :: < T > ( ) . values ( ) ) ;
277
+ if let Some ( nulls) = array. nulls ( ) {
278
+ for ( i, null) in nulls. iter ( ) . enumerate ( ) {
279
+ if !null {
280
+ out_vector. set_null ( i) ;
281
+ }
282
+ }
283
+ }
270
284
}
271
285
272
286
fn primitive_array_to_vector ( array : & dyn Array , out : & mut dyn Vector ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
@@ -655,7 +669,7 @@ mod test {
655
669
db. register_table_function :: < ArrowVTab > ( "arrow" ) ?;
656
670
657
671
// Roundtrip a record batch from Rust to DuckDB and back to Rust
658
- let schema = Schema :: new ( vec ! [ Field :: new( "a" , input_array. data_type( ) . clone( ) , false ) ] ) ;
672
+ let schema = Schema :: new ( vec ! [ Field :: new( "a" , input_array. data_type( ) . clone( ) , true ) ] ) ;
659
673
660
674
let rb = RecordBatch :: try_new ( Arc :: new ( schema) , vec ! [ Arc :: new( input_array. clone( ) ) ] ) ?;
661
675
let param = arrow_recordbatch_to_query_params ( rb) ;
@@ -746,6 +760,22 @@ mod test {
746
760
Ok ( ( ) )
747
761
}
748
762
763
+ #[ test]
764
+ fn test_primitive_roundtrip_contains_nulls ( ) -> Result < ( ) , Box < dyn Error > > {
765
+ let mut builder = arrow:: array:: PrimitiveBuilder :: < arrow:: datatypes:: Int32Type > :: new ( ) ;
766
+ builder. append_value ( 1 ) ;
767
+ builder. append_null ( ) ;
768
+ builder. append_value ( 3 ) ;
769
+ builder. append_null ( ) ;
770
+ builder. append_null ( ) ;
771
+ builder. append_value ( 6 ) ;
772
+ let array = builder. finish ( ) ;
773
+
774
+ check_rust_primitive_array_roundtrip ( array. clone ( ) , array) ?;
775
+
776
+ Ok ( ( ) )
777
+ }
778
+
749
779
#[ test]
750
780
fn test_timestamp_roundtrip ( ) -> Result < ( ) , Box < dyn Error > > {
751
781
check_rust_primitive_array_roundtrip ( Int32Array :: from ( vec ! [ 1 , 2 , 3 ] ) , Int32Array :: from ( vec ! [ 1 , 2 , 3 ] ) ) ?;
0 commit comments