From 121666e464170d7dce41bfd61de001a19affde72 Mon Sep 17 00:00:00 2001 From: Liang-Chi Hsieh Date: Thu, 1 Feb 2024 00:36:34 -0800 Subject: [PATCH] Add more debugging info to StructBuilder validate_content (#5357) --- arrow-array/src/builder/struct_builder.rs | 24 ++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/arrow-array/src/builder/struct_builder.rs b/arrow-array/src/builder/struct_builder.rs index 196ae8092b85..917b58522f66 100644 --- a/arrow-array/src/builder/struct_builder.rs +++ b/arrow-array/src/builder/struct_builder.rs @@ -18,7 +18,7 @@ use crate::builder::*; use crate::{ArrayRef, StructArray}; use arrow_buffer::NullBufferBuilder; -use arrow_schema::{DataType, Fields, IntervalUnit, TimeUnit}; +use arrow_schema::{DataType, Fields, IntervalUnit, SchemaBuilder, TimeUnit}; use std::any::Any; use std::sync::Arc; @@ -286,9 +286,21 @@ impl StructBuilder { if self.fields.len() != self.field_builders.len() { panic!("Number of fields is not equal to the number of field_builders."); } - if !self.field_builders.iter().all(|x| x.len() == self.len()) { - panic!("StructBuilder and field_builders are of unequal lengths."); - } + self.field_builders.iter().enumerate().for_each(|(idx, x)| { + if x.len() != self.len() { + let builder = SchemaBuilder::from(&self.fields); + let schema = builder.finish(); + + panic!("{}", format!( + "StructBuilder ({:?}) and field_builder with index {} ({:?}) are of unequal lengths: ({} != {}).", + schema, + idx, + self.fields[idx].data_type(), + self.len(), + x.len() + )); + } + }); } } @@ -558,7 +570,9 @@ mod tests { } #[test] - #[should_panic(expected = "StructBuilder and field_builders are of unequal lengths.")] + #[should_panic( + expected = "StructBuilder (Schema { fields: [Field { name: \"f1\", data_type: Int32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }, Field { name: \"f2\", data_type: Boolean, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {} }) and field_builder with index 1 (Boolean) are of unequal lengths: (2 != 1)." + )] fn test_struct_array_builder_unequal_field_builders_lengths() { let mut int_builder = Int32Builder::with_capacity(10); let mut bool_builder = BooleanBuilder::new();