Skip to content

Commit 188a141

Browse files
Fix validation logic in StructArray::try_new to account for array.logical_nulls() returning Some() and null_count == 0 (#7436)
* Fix a validation check in StructArray::try_new for unmasked nulls * Add test for logical_nulls returning Some() * Better assert * Review feedback * ci
1 parent 689897e commit 188a141

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

arrow-array/src/array/struct_array.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,9 @@ impl StructArray {
168168

169169
if !f.is_nullable() {
170170
if let Some(a) = a.logical_nulls() {
171-
if !nulls.as_ref().map(|n| n.contains(&a)).unwrap_or_default() {
171+
if !nulls.as_ref().map(|n| n.contains(&a)).unwrap_or_default()
172+
&& a.null_count() > 0
173+
{
172174
return Err(ArrowError::InvalidArgumentError(format!(
173175
"Found unmasked nulls for non-nullable StructArray field {:?}",
174176
f.name()
@@ -922,4 +924,23 @@ mod tests {
922924
);
923925
assert_eq!(format!("{arr:?}"), "StructArray\n-- validity:\n[\n valid,\n null,\n valid,\n null,\n valid,\n null,\n valid,\n null,\n valid,\n null,\n ...10 elements...,\n valid,\n null,\n valid,\n null,\n valid,\n null,\n valid,\n null,\n valid,\n null,\n]\n[\n-- child 0: \"c\" (Int32)\nPrimitiveArray<Int32>\n[\n 0,\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9,\n ...10 elements...,\n 20,\n 21,\n 22,\n 23,\n 24,\n 25,\n 26,\n 27,\n 28,\n 29,\n]\n]")
924926
}
927+
928+
#[test]
929+
fn test_struct_array_logical_nulls() {
930+
// Field is non-nullable
931+
let field = Field::new("a", DataType::Int32, false);
932+
let values = vec![1, 2, 3];
933+
// Create a NullBuffer with all bits set to valid (true)
934+
let nulls = NullBuffer::from(vec![true, true, true]);
935+
let array = Int32Array::new(values.into(), Some(nulls));
936+
let child = Arc::new(array) as ArrayRef;
937+
assert!(child.logical_nulls().is_some());
938+
assert_eq!(child.logical_nulls().unwrap().null_count(), 0);
939+
940+
let fields = Fields::from(vec![field]);
941+
let arrays = vec![child];
942+
let nulls = None;
943+
944+
StructArray::try_new(fields, arrays, nulls).expect("should not error");
945+
}
925946
}

0 commit comments

Comments
 (0)