@@ -34,11 +34,11 @@ pub fn fill_null_canonical_array(
3434
3535 Ok ( match canonical {
3636 Canonical :: Null ( array) => ConstantArray :: new ( fill_value. clone ( ) , array. len ( ) ) . into_array ( ) ,
37- Canonical :: Bool ( array) => fill_bool_array ( & array, fill_value, result_nullability) ,
38- Canonical :: Primitive ( array) => fill_primitive_array ( & array, fill_value, result_nullability) ,
39- Canonical :: Decimal ( array) => fill_decimal_array ( & array, fill_value, result_nullability) ,
37+ Canonical :: Bool ( array) => fill_bool_array ( array, fill_value, result_nullability) ,
38+ Canonical :: Primitive ( array) => fill_primitive_array ( array, fill_value, result_nullability) ,
39+ Canonical :: Decimal ( array) => fill_decimal_array ( array, fill_value, result_nullability) ,
4040 Canonical :: VarBinView ( array) => {
41- fill_varbinview_array ( & array, fill_value, result_nullability)
41+ fill_varbinview_array ( array, fill_value, result_nullability)
4242 }
4343 Canonical :: Struct ( _)
4444 | Canonical :: List ( _)
@@ -48,7 +48,7 @@ pub fn fill_null_canonical_array(
4848}
4949
5050fn fill_bool_array (
51- array : & BoolArray ,
51+ array : BoolArray ,
5252 fill_value : & Scalar ,
5353 result_nullability : Nullability ,
5454) -> ArrayRef {
@@ -59,28 +59,37 @@ fn fill_bool_array(
5959
6060 match array. validity ( ) {
6161 Validity :: NonNullable | Validity :: AllValid => {
62- BoolArray :: new ( array. to_bit_buffer ( ) , result_nullability. into ( ) ) . into_array ( )
62+ BoolArray :: new ( array. into_bit_buffer ( ) , result_nullability. into ( ) ) . into_array ( )
6363 }
6464 Validity :: AllInvalid => ConstantArray :: new ( fill_value. clone ( ) , array. len ( ) ) . into_array ( ) ,
6565 Validity :: Array ( validity_array) => {
66- let validity_bool_array = validity_array. to_bool ( ) ;
67- let validity_bits = validity_bool_array. to_bit_buffer ( ) ;
68- let data_bits = array. to_bit_buffer ( ) ;
69-
70- let mut new_bits = data_bits. into_mut ( ) ;
71-
72- ( !validity_bits)
73- . set_indices ( )
74- . for_each ( |i| new_bits. set_to ( i, fill_bool) ) ;
66+ let validity_bits = validity_array. to_bool ( ) . into_bit_buffer ( ) ;
67+ let data_bits = array. into_bit_buffer ( ) ;
68+
69+ let new_bits = match data_bits. try_into_mut ( ) {
70+ Ok ( mut buf) => {
71+ ( !validity_bits)
72+ . set_indices ( )
73+ . for_each ( |i| buf. set_to ( i, fill_bool) ) ;
74+ buf. freeze ( )
75+ }
76+ Err ( data_bits) => {
77+ if fill_bool {
78+ data_bits | !validity_bits
79+ } else {
80+ data_bits & validity_bits
81+ }
82+ }
83+ } ;
7584
76- BoolArray :: new ( new_bits. freeze ( ) , result_nullability. into ( ) ) . into_array ( )
85+ BoolArray :: new ( new_bits, result_nullability. into ( ) ) . into_array ( )
7786 }
7887 }
7988}
8089
8190#[ expect( clippy:: cognitive_complexity) ]
8291fn fill_primitive_array (
83- array : & PrimitiveArray ,
92+ array : PrimitiveArray ,
8493 fill_value : & Scalar ,
8594 result_nullability : Nullability ,
8695) -> ArrayRef {
@@ -117,7 +126,7 @@ fn fill_primitive_array(
117126}
118127
119128fn fill_decimal_array (
120- array : & DecimalArray ,
129+ array : DecimalArray ,
121130 fill_value : & Scalar ,
122131 result_nullability : Nullability ,
123132) -> ArrayRef {
@@ -161,7 +170,7 @@ fn fill_decimal_array(
161170}
162171
163172fn fill_varbinview_array (
164- array : & VarBinViewArray ,
173+ array : VarBinViewArray ,
165174 fill_value : & Scalar ,
166175 result_nullability : Nullability ,
167176) -> ArrayRef {
0 commit comments