@@ -360,6 +360,7 @@ mod tests {
360360 use vortex_array:: serde:: ArrayParts ;
361361 use vortex_array:: serde:: SerializeOptions ;
362362 use vortex_array:: session:: ArraySessionExt ;
363+ use vortex_buffer:: BitBuffer ;
363364 use vortex_buffer:: ByteBufferMut ;
364365 use vortex_buffer:: buffer;
365366 use vortex_session:: VortexSession ;
@@ -414,6 +415,26 @@ mod tests {
414415 assert_eq ! ( typed. dtype( ) , & DType :: Variant ( Nullability :: Nullable ) ) ;
415416 }
416417
418+ #[ test]
419+ fn test_serde_roundtrip_with_nullable_validity ( ) {
420+ let metadata =
421+ VarBinViewArray :: from_iter_bin ( [ b"\x01 \x00 " , b"\x01 \x00 " , b"\x01 \x00 " ] ) . into_array ( ) ;
422+ let value = VarBinViewArray :: from_iter_bin ( [ b"\x10 " , b"\x11 " , b"\x12 " ] ) . into_array ( ) ;
423+ let validity =
424+ vortex_array:: validity:: Validity :: from ( BitBuffer :: from_iter ( [ true , false , true ] ) ) ;
425+
426+ let pv = ParquetVariantArray :: try_new_with_validity ( validity, metadata, Some ( value) , None )
427+ . unwrap ( ) ;
428+ let array = pv. into_array ( ) ;
429+ let decoded = roundtrip ( array. clone ( ) ) ;
430+
431+ assert ! ( array. array_eq( & decoded, Precision :: Value ) ) ;
432+ assert_eq ! ( decoded. dtype( ) , & DType :: Variant ( Nullability :: Nullable ) ) ;
433+ let decoded_pv = decoded. as_opt :: < ParquetVariant > ( ) . unwrap ( ) ;
434+ assert ! ( decoded_pv. value_array( ) . is_some( ) ) ;
435+ assert ! ( decoded_pv. typed_value_array( ) . is_none( ) ) ;
436+ }
437+
417438 #[ test]
418439 fn test_serde_roundtrip_typed_value_int32 ( ) {
419440 let outer_metadata =
0 commit comments