Skip to content

Commit 4bbc307

Browse files
authored
fix: Appending null values to element array builders of StructBuilder for null row in a StructArray (apache#78)
1 parent 4c5fc75 commit 4bbc307

File tree

4 files changed

+428
-263
lines changed

4 files changed

+428
-263
lines changed

core/src/execution/shuffle/list.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
use crate::{
1919
errors::CometError,
20-
execution::shuffle::row::{append_field, SparkUnsafeObject},
20+
execution::shuffle::row::{append_field, SparkUnsafeObject, SparkUnsafeRow},
2121
};
2222
use arrow_array::builder::{
2323
ArrayBuilder, BinaryBuilder, BooleanBuilder, Date32Builder, Decimal128Builder, Float32Builder,
@@ -102,6 +102,7 @@ macro_rules! define_append_element {
102102
let is_null = list.is_null_at(idx);
103103

104104
if is_null {
105+
// Append a null value to the element builder.
105106
element_builder.append_null();
106107
} else {
107108
$accessor(element_builder, list, idx);
@@ -284,6 +285,7 @@ pub fn append_list_element<T: ArrayBuilder>(
284285
let is_null = list.is_null_at(idx);
285286

286287
if is_null {
288+
// Append a null value to element builder.
287289
element_builder.append_null();
288290
} else {
289291
element_builder.append_value(list.get_decimal(idx, *p))
@@ -313,21 +315,22 @@ pub fn append_list_element<T: ArrayBuilder>(
313315
}
314316
*/
315317
DataType::Struct(fields) => {
316-
let element_builder: &mut StructBuilder = list_builder
318+
let struct_builder: &mut StructBuilder = list_builder
317319
.values()
318320
.as_any_mut()
319321
.downcast_mut::<StructBuilder>()
320322
.unwrap();
321323
let is_null = list.is_null_at(idx);
322324

323-
if is_null {
324-
element_builder.append_null();
325+
let nested_row = if is_null {
326+
SparkUnsafeRow::default()
325327
} else {
326-
let nested_row = list.get_struct(idx, fields.len());
327-
element_builder.append(true);
328-
for (field_idx, field) in fields.into_iter().enumerate() {
329-
append_field(field.data_type(), element_builder, &nested_row, field_idx);
330-
}
328+
list.get_struct(idx, fields.len())
329+
};
330+
331+
struct_builder.append(!is_null);
332+
for (field_idx, field) in fields.into_iter().enumerate() {
333+
append_field(field.data_type(), struct_builder, &nested_row, field_idx)?;
331334
}
332335
}
333336
_ => {

0 commit comments

Comments
 (0)