@@ -8,8 +8,8 @@ use std::ops::BitAnd;
88use vortex_dtype:: NativePType ;
99use vortex_mask:: Mask ;
1010use vortex_vector:: {
11- BoolVector , NullVector , PrimitiveVector , StructVector , Vector , match_each_pvector ,
12- match_each_vector,
11+ BoolVector , NullVector , PVector , PrimitiveVector , StructVector , VarBinType , VarBinVector ,
12+ Vector , match_each_pvector , match_each_vector,
1313} ;
1414
1515/// Trait for masking the validity of an array or vector.
@@ -37,7 +37,8 @@ impl MaskValidity for NullVector {
3737impl MaskValidity for BoolVector {
3838 fn mask_validity ( self , mask : & Mask ) -> Self {
3939 let ( bits, validity) = self . into_parts ( ) ;
40- Self :: new ( bits, validity. bitand ( mask) )
40+ // SAFETY: we are preserving the original bits buffer and only modifying the validity.
41+ unsafe { Self :: new_unchecked ( bits, validity. bitand ( mask) ) }
4142 }
4243}
4344
@@ -47,16 +48,26 @@ impl MaskValidity for PrimitiveVector {
4748 }
4849}
4950
50- impl < T : NativePType > MaskValidity for vortex_vector :: PVector < T > {
51+ impl < T : NativePType > MaskValidity for PVector < T > {
5152 fn mask_validity ( self , mask : & Mask ) -> Self {
5253 let ( data, validity) = self . into_parts ( ) ;
53- Self :: new ( data, validity. bitand ( mask) )
54+ // SAFETY: we are preserving the original data buffer and only modifying the validity.
55+ unsafe { Self :: new_unchecked ( data, validity. bitand ( mask) ) }
56+ }
57+ }
58+
59+ impl < T : VarBinType > MaskValidity for VarBinVector < T > {
60+ fn mask_validity ( self , mask : & Mask ) -> Self {
61+ let ( views, buffers, validity) = self . into_parts ( ) ;
62+ // SAFETY: we are preserving the original views and buffers, only modifying the validity.
63+ unsafe { Self :: new_unchecked ( views, buffers, validity. bitand ( mask) ) }
5464 }
5565}
5666
5767impl MaskValidity for StructVector {
5868 fn mask_validity ( self , mask : & Mask ) -> Self {
5969 let ( fields, validity) = self . into_parts ( ) ;
60- StructVector :: new ( fields, validity. bitand ( mask) )
70+ // SAFETY: we are preserving the original fields and only modifying the validity.
71+ unsafe { StructVector :: new_unchecked ( fields, validity. bitand ( mask) ) }
6172 }
6273}
0 commit comments