@@ -102,12 +102,37 @@ unsafe fn take_primitive_unchecked<T: NativePType, I: NativePType + AsPrimitive<
102102
103103#[ cfg( test) ]
104104mod test {
105+ use vortex_buffer:: buffer;
106+ use vortex_scalar:: Scalar ;
107+
105108 use crate :: array:: primitive:: compute:: take:: take_primitive;
109+ use crate :: array:: { BoolArray , PrimitiveArray } ;
110+ use crate :: compute:: { scalar_at, take} ;
111+ use crate :: validity:: Validity ;
112+ use crate :: IntoArray as _;
106113
107114 #[ test]
108115 fn test_take ( ) {
109116 let a = vec ! [ 1i32 , 2 , 3 , 4 , 5 ] ;
110117 let result = take_primitive ( & a, & [ 0 , 0 , 4 , 2 ] ) ;
111118 assert_eq ! ( result. as_slice( ) , & [ 1i32 , 1 , 5 , 3 ] ) ;
112119 }
120+
121+ #[ test]
122+ fn test_take_with_null_indices ( ) {
123+ let values = PrimitiveArray :: new (
124+ buffer ! [ 1i32 , 2 , 3 , 4 , 5 ] ,
125+ Validity :: Array ( BoolArray :: from_iter ( [ true , true , false , false , true ] ) . into_array ( ) ) ,
126+ ) ;
127+ let indices = PrimitiveArray :: new (
128+ buffer ! [ 0 , 3 , 4 ] ,
129+ Validity :: Array ( BoolArray :: from_iter ( [ true , true , false ] ) . into_array ( ) ) ,
130+ ) ;
131+ let actual = take ( values, indices) . unwrap ( ) ;
132+ assert_eq ! ( scalar_at( & actual, 0 ) . unwrap( ) , Scalar :: from( Some ( 1 ) ) ) ;
133+ // position 3 is null
134+ assert_eq ! ( scalar_at( & actual, 1 ) . unwrap( ) , Scalar :: null_typed:: <i32 >( ) ) ;
135+ // the third index is null
136+ assert_eq ! ( scalar_at( & actual, 2 ) . unwrap( ) , Scalar :: null_typed:: <i32 >( ) ) ;
137+ }
113138}
0 commit comments