diff --git a/arrow-json/src/reader/list_array.rs b/arrow-json/src/reader/list_array.rs index 778b2e2804e3..63644964c30c 100644 --- a/arrow-json/src/reader/list_array.rs +++ b/arrow-json/src/reader/list_array.rs @@ -209,7 +209,13 @@ impl ArrayDecoder for FixedSizeListArrayDecoder { let values = self.decoder.decode(tape, &child_pos)?; let nulls = nulls.as_mut().and_then(|x| x.finish()); - let array = FixedSizeListArray::try_new(self.field.clone(), self.size, values, nulls)?; + let array = FixedSizeListArray::try_new_with_length( + self.field.clone(), + self.size, + values, + nulls, + pos.len(), + )?; Ok(Arc::new(array)) } } diff --git a/arrow-json/src/reader/mod.rs b/arrow-json/src/reader/mod.rs index 3cd45bb82416..b0a2c9fc25f4 100644 --- a/arrow-json/src/reader/mod.rs +++ b/arrow-json/src/reader/mod.rs @@ -2369,6 +2369,32 @@ mod tests { assert!(values.is_null(5)); } + #[test] + fn test_fixed_size_list_zero_size_non_nullable() { + let buf = r#" + {"a": []} + {"a": []} + {"a": []} + "#; + + let field = Field::new_list_field(DataType::Int32, true); + let schema = Arc::new(Schema::new(vec![Field::new( + "a", + DataType::FixedSizeList(Arc::new(field), 0), + false, + )])); + + let batches = do_read(buf, 1024, false, false, schema); + assert_eq!(batches.len(), 1); + + let col = batches[0].column(0).as_fixed_size_list(); + assert_eq!(col.len(), 3); + assert_eq!(col.value_length(), 0); + + let values = col.values().as_primitive::(); + assert!(values.values().is_empty()); + } + #[test] fn test_fixed_size_list_wrong_size() { let buf = r#"{"a": [1, 2, 3]}"#;