diff --git a/arrow/src/array/array.rs b/arrow/src/array/array.rs index d715bc49eb61..7a1796b52078 100644 --- a/arrow/src/array/array.rs +++ b/arrow/src/array/array.rs @@ -657,6 +657,28 @@ mod tests { } } + #[test] + fn test_null_map() { + let data_type = DataType::Map( + Box::new(Field::new( + "entry", + DataType::Struct(vec![ + Field::new("key", DataType::Utf8, false), + Field::new("value", DataType::Int32, true), + ]), + false, + )), + false, + ); + let array = new_null_array(&data_type, 9); + let a = array.as_any().downcast_ref::().unwrap(); + assert_eq!(a.len(), 9); + assert_eq!(a.value_offsets()[9], 0i32); + for i in 0..9 { + assert!(a.is_null(i)); + } + } + #[test] fn test_null_dictionary() { let values = vec![None, None, None, None, None, None, None, None, None] diff --git a/arrow/src/json/reader.rs b/arrow/src/json/reader.rs index 0b220eb25ab6..2e716eb0565c 100644 --- a/arrow/src/json/reader.rs +++ b/arrow/src/json/reader.rs @@ -1224,6 +1224,14 @@ impl Decoder { }) .collect::(), ) as ArrayRef), + DataType::Binary => Ok(Arc::new( + rows.iter() + .map(|row| { + let maybe_value = row.get(field.name()); + maybe_value.and_then(|value| value.as_str()) + }) + .collect::(), + ) as ArrayRef), DataType::List(ref list_field) => { match list_field.data_type() { DataType::Dictionary(ref key_ty, _) => { @@ -2963,6 +2971,38 @@ mod tests { assert_eq!(batch.num_rows(), 3); } + #[test] + fn test_json_read_binary_structs() { + let schema = Schema::new(vec![Field::new("c1", DataType::Binary, true)]); + let decoder = Decoder::new(Arc::new(schema), 1024, None); + let batch = decoder + .next_batch( + &mut vec![ + Ok(serde_json::json!({ + "c1": "₁₂₃", + })), + Ok(serde_json::json!({ + "c1": "foo", + })), + ] + .into_iter(), + ) + .unwrap() + .unwrap(); + let data = batch.columns().iter().collect::>(); + + let schema = Schema::new(vec![Field::new("c1", DataType::Binary, true)]); + let binary_values = BinaryArray::from(vec!["₁₂₃".as_bytes(), "foo".as_bytes()]); + let expected_batch = + RecordBatch::try_new(Arc::new(schema), vec![Arc::new(binary_values)]) + .unwrap(); + let expected_data = expected_batch.columns().iter().collect::>(); + + assert_eq!(data, expected_data); + assert_eq!(batch.num_columns(), 1); + assert_eq!(batch.num_rows(), 2); + } + #[test] fn test_json_iterator() { let builder = ReaderBuilder::new().infer_schema(None).with_batch_size(5);