This is an automated email from the ASF dual-hosted git repository.

alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/main by this push:
     new 188a141954 Fix validation logic in `StructArray::try_new` to account 
for array.logical_nulls() returning Some() and null_count == 0 (#7436)
188a141954 is described below

commit 188a1419545aa3e560d807e7440912e4b53c3179
Author: Phillip LeBlanc <[email protected]>
AuthorDate: Sat May 10 01:57:39 2025 +0900

    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
---
 arrow-array/src/array/struct_array.rs | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/arrow-array/src/array/struct_array.rs 
b/arrow-array/src/array/struct_array.rs
index d934942563..e6d12a5ad5 100644
--- a/arrow-array/src/array/struct_array.rs
+++ b/arrow-array/src/array/struct_array.rs
@@ -168,7 +168,9 @@ impl StructArray {
 
             if !f.is_nullable() {
                 if let Some(a) = a.logical_nulls() {
-                    if !nulls.as_ref().map(|n| 
n.contains(&a)).unwrap_or_default() {
+                    if !nulls.as_ref().map(|n| 
n.contains(&a)).unwrap_or_default()
+                        && a.null_count() > 0
+                    {
                         return Err(ArrowError::InvalidArgumentError(format!(
                             "Found unmasked nulls for non-nullable StructArray 
field {:?}",
                             f.name()
@@ -922,4 +924,23 @@ mod tests {
         );
         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]")
     }
+
+    #[test]
+    fn test_struct_array_logical_nulls() {
+        // Field is non-nullable
+        let field = Field::new("a", DataType::Int32, false);
+        let values = vec![1, 2, 3];
+        // Create a NullBuffer with all bits set to valid (true)
+        let nulls = NullBuffer::from(vec![true, true, true]);
+        let array = Int32Array::new(values.into(), Some(nulls));
+        let child = Arc::new(array) as ArrayRef;
+        assert!(child.logical_nulls().is_some());
+        assert_eq!(child.logical_nulls().unwrap().null_count(), 0);
+
+        let fields = Fields::from(vec![field]);
+        let arrays = vec![child];
+        let nulls = None;
+
+        StructArray::try_new(fields, arrays, nulls).expect("should not error");
+    }
 }

Reply via email to