Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 36 additions & 10 deletions arrow-schema/src/datatype_parse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,15 @@ impl<'a> Parser<'a> {
///
/// TODO: support metadata: `nullable Int64, metadata: {"foo2": "value"}`
fn parse_list_field(&mut self, context: &str) -> ArrowResult<Field> {
let nullable = self.parse_opt_nullable();
let mut nullable = self.parse_opt_nullable();
// Introduction of the "nullable" token led to a breaking API change. As a temporary
// workaround we'll always treat lists as nullable to match past behavior.
// This should be reverted for 58.0.0.
//
// See https://github.com/apache/arrow-rs/issues/8883
if !context.contains("Fixed") {
nullable = true;
}
let data_type = self.parse_next_type()?;

// the field name (if exists) must be after a comma
Expand Down Expand Up @@ -1033,36 +1041,38 @@ mod test {
DataType::Struct(Fields::from(vec![Field::new("f1", DataType::Int64, true)])),
DataType::Struct(Fields::empty()),
DataType::List(Arc::new(Field::new_list_field(DataType::Int64, true))),
DataType::List(Arc::new(Field::new_list_field(DataType::Int64, false))),
// List(Int64) will still be treated as nullable for now. Uncomment in 58.0.0.
// See https://github.com/apache/arrow-rs/issues/8883
//DataType::List(Arc::new(Field::new_list_field(DataType::Int64, false))),
DataType::List(Arc::new(Field::new("Int64", DataType::Int64, true))),
DataType::List(Arc::new(Field::new("Int64", DataType::Int64, false))),
//DataType::List(Arc::new(Field::new("Int64", DataType::Int64, false))),
DataType::List(Arc::new(Field::new(
"nested_list",
DataType::List(Arc::new(Field::new("Int64", DataType::Int64, true))),
true,
))),
DataType::ListView(Arc::new(Field::new_list_field(DataType::Int64, true))),
DataType::ListView(Arc::new(Field::new_list_field(DataType::Int64, false))),
//DataType::ListView(Arc::new(Field::new_list_field(DataType::Int64, false))),
DataType::ListView(Arc::new(Field::new("Int64", DataType::Int64, true))),
DataType::ListView(Arc::new(Field::new("Int64", DataType::Int64, false))),
//DataType::ListView(Arc::new(Field::new("Int64", DataType::Int64, false))),
DataType::ListView(Arc::new(Field::new(
"nested_list_view",
DataType::ListView(Arc::new(Field::new("Int64", DataType::Int64, true))),
true,
))),
DataType::LargeList(Arc::new(Field::new_list_field(DataType::Int64, true))),
DataType::LargeList(Arc::new(Field::new_list_field(DataType::Int64, false))),
//DataType::LargeList(Arc::new(Field::new_list_field(DataType::Int64, false))),
DataType::LargeList(Arc::new(Field::new("Int64", DataType::Int64, true))),
DataType::LargeList(Arc::new(Field::new("Int64", DataType::Int64, false))),
//DataType::LargeList(Arc::new(Field::new("Int64", DataType::Int64, false))),
DataType::LargeList(Arc::new(Field::new(
"nested_large_list",
DataType::LargeList(Arc::new(Field::new("Int64", DataType::Int64, true))),
true,
))),
DataType::LargeListView(Arc::new(Field::new_list_field(DataType::Int64, true))),
DataType::LargeListView(Arc::new(Field::new_list_field(DataType::Int64, false))),
//DataType::LargeListView(Arc::new(Field::new_list_field(DataType::Int64, false))),
DataType::LargeListView(Arc::new(Field::new("Int64", DataType::Int64, true))),
DataType::LargeListView(Arc::new(Field::new("Int64", DataType::Int64, false))),
//DataType::LargeListView(Arc::new(Field::new("Int64", DataType::Int64, false))),
DataType::LargeListView(Arc::new(Field::new(
"nested_large_list_view",
DataType::LargeListView(Arc::new(Field::new("Int64", DataType::Int64, true))),
Expand Down Expand Up @@ -1360,13 +1370,29 @@ mod test {
])),
),
(r#"Struct()"#, Struct(Fields::empty())),
(
"List(Int64)",
List(Arc::new(Field::new_list_field(Int64, true))),
),
(
"LargeList(Int64)",
LargeList(Arc::new(Field::new_list_field(Int64, true))),
),
(
"ListView(Int64)",
ListView(Arc::new(Field::new_list_field(Int64, true))),
),
(
"LargeListView(Int64)",
LargeListView(Arc::new(Field::new_list_field(Int64, true))),
),
];

for (data_type_string, expected_data_type) in cases {
let parsed_data_type = parse_data_type(data_type_string).unwrap();
assert_eq!(
parsed_data_type, expected_data_type,
"Parsing '{data_type_string}', expecting '{expected_data_type}'"
"Parsing '{data_type_string}', expecting '{expected_data_type}', got '{parsed_data_type}'"
);
}
}
Expand Down
Loading