diff --git a/arrow-ipc/src/writer.rs b/arrow-ipc/src/writer.rs index 8f36f8c04dc0..b2fcec08d845 100644 --- a/arrow-ipc/src/writer.rs +++ b/arrow-ipc/src/writer.rs @@ -1374,8 +1374,8 @@ mod tests { use std::io::Seek; use std::sync::Arc; - use arrow_array::builder::PrimitiveRunBuilder; use arrow_array::builder::UnionBuilder; + use arrow_array::builder::{ListBuilder, PrimitiveRunBuilder, UInt32Builder}; use arrow_array::types::*; use arrow_schema::DataType; @@ -2106,4 +2106,39 @@ mod tests { assert_eq!(expected, actual); } } + + #[test] + fn encode_lists() { + let val_inner = Field::new("item", DataType::UInt32, true); + let val_list_field = Field::new_list("val", val_inner, false); + + let schema = Arc::new(Schema::new(vec![val_list_field])); + + let values = { + let u32 = UInt32Builder::new(); + let mut ls = ListBuilder::new(u32); + + for list in vec![vec![1u32, 2, 3], vec![4, 5, 6], vec![7, 8, 9, 10]] { + for value in list { + ls.values().append_value(value); + } + ls.append(true) + } + + ls.finish() + }; + + let batch = + RecordBatch::try_new(Arc::clone(&schema), vec![Arc::new(values)]).unwrap(); + let batch = batch.slice(1, 1); + + let mut writer = FileWriter::try_new(Vec::::new(), &schema).unwrap(); + writer.write(&batch).unwrap(); + writer.finish().unwrap(); + let data = writer.into_inner().unwrap(); + + let mut reader = FileReader::try_new(Cursor::new(data), None).unwrap(); + let batch2 = reader.next().unwrap().unwrap(); + assert_eq!(batch, batch2); + } }