From 25930202dee5651ebf70170dbeca791239fdc0fe Mon Sep 17 00:00:00 2001 From: Liam Bao Date: Fri, 24 Apr 2026 19:32:00 -0400 Subject: [PATCH] Fix JSON reader panic for non-nullable zero-size FixedSizeList --- arrow-json/src/reader/list_array.rs | 8 +++++++- arrow-json/src/reader/mod.rs | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/arrow-json/src/reader/list_array.rs b/arrow-json/src/reader/list_array.rs index ac574fab1615..713447540876 100644 --- a/arrow-json/src/reader/list_array.rs +++ b/arrow-json/src/reader/list_array.rs @@ -215,7 +215,13 @@ impl ArrayDecoder for FixedSizeListArrayDecoder { let values = self.decoder.decode(tape, &child_pos)?; let nulls = nulls.as_mut().map(|x| NullBuffer::new(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 04fe207c27ec..b25a3d3a4832 100644 --- a/arrow-json/src/reader/mod.rs +++ b/arrow-json/src/reader/mod.rs @@ -2368,6 +2368,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]}"#;