@@ -179,18 +179,21 @@ impl VariantArray {
179
179
/// Note: Does not do deep validation of the [`Variant`], so it is up to the
180
180
/// caller to ensure that the metadata and value were constructed correctly.
181
181
pub fn value ( & self , index : usize ) -> Variant < ' _ , ' _ > {
182
- match & self . shredding_state {
183
- ShreddingState :: Unshredded { value } => {
182
+ match ( self . shredding_state . value_field ( ) , self . shredding_state . typed_value_field ( ) ) {
183
+ ( Some ( value) , None ) => {
184
+ // Unshredded case
184
185
Variant :: new ( self . metadata . value ( index) , value. value ( index) )
185
186
}
186
- ShreddingState :: PerfectlyShredded { typed_value, .. } => {
187
+ ( None , Some ( typed_value) ) => {
188
+ // PerfectlyShredded case
187
189
if typed_value. is_null ( index) {
188
190
Variant :: Null
189
191
} else {
190
192
typed_value_to_variant ( typed_value, index)
191
193
}
192
194
}
193
- ShreddingState :: ImperfectlyShredded { value, typed_value } => {
195
+ ( Some ( value) , Some ( typed_value) ) => {
196
+ // ImperfectlyShredded case
194
197
if typed_value. is_null ( index) {
195
198
Variant :: new ( self . metadata . value ( index) , value. value ( index) )
196
199
} else {
@@ -256,7 +259,7 @@ impl VariantArray {
256
259
/// additional fields), or NULL (`v:a` was an object containing only the single expected field `b`).
257
260
///
258
261
/// Finally, `v.typed_value.a.typed_value.b.value` is either NULL (`v:a.b` was an integer) or else a
259
- /// variant value.
262
+ /// variant value (which could be `Variant::Null`) .
260
263
#[ derive( Debug ) ]
261
264
pub struct ShreddedVariantFieldArray {
262
265
/// Reference to the underlying StructArray
@@ -361,7 +364,10 @@ impl Array for ShreddedVariantFieldArray {
361
364
}
362
365
363
366
fn nulls ( & self ) -> Option < & NullBuffer > {
364
- self . inner . nulls ( )
367
+ // According to the shredding spec, ShreddedVariantFieldArray should be
368
+ // physically non-nullable - SQL NULL is inferred by both value and
369
+ // typed_value being physically NULL
370
+ None
365
371
}
366
372
367
373
fn get_buffer_memory_size ( & self ) -> usize {
@@ -451,6 +457,8 @@ impl ShreddingState {
451
457
ShreddingState :: PartiallyShredded { metadata, .. } => metadata,
452
458
ShreddingState :: AllNull { metadata } => metadata,
453
459
}
460
+
461
+ Ok ( Self { value, typed_value } )
454
462
}
455
463
456
464
/// Return a reference to the value field, if present
@@ -506,7 +514,7 @@ impl ShreddingState {
506
514
///
507
515
/// TODO: move to arrow crate
508
516
#[ derive( Debug , Default , Clone ) ]
509
- pub struct StructArrayBuilder {
517
+ pub ( crate ) struct StructArrayBuilder {
510
518
fields : Vec < FieldRef > ,
511
519
arrays : Vec < ArrayRef > ,
512
520
nulls : Option < NullBuffer > ,
0 commit comments