in datafusion/proto/src/logical_plan/mod.rs [2171:2324]
fn round_trip_datatype() {
let test_cases: Vec<DataType> = vec![
DataType::Null,
DataType::Boolean,
DataType::Int8,
DataType::Int16,
DataType::Int32,
DataType::Int64,
DataType::UInt8,
DataType::UInt16,
DataType::UInt32,
DataType::UInt64,
DataType::Float16,
DataType::Float32,
DataType::Float64,
DataType::Timestamp(TimeUnit::Second, None),
DataType::Timestamp(TimeUnit::Millisecond, None),
DataType::Timestamp(TimeUnit::Microsecond, None),
DataType::Timestamp(TimeUnit::Nanosecond, None),
DataType::Timestamp(TimeUnit::Nanosecond, Some("UTC".into())),
DataType::Date32,
DataType::Date64,
DataType::Time32(TimeUnit::Second),
DataType::Time32(TimeUnit::Millisecond),
DataType::Time32(TimeUnit::Microsecond),
DataType::Time32(TimeUnit::Nanosecond),
DataType::Time64(TimeUnit::Second),
DataType::Time64(TimeUnit::Millisecond),
DataType::Time64(TimeUnit::Microsecond),
DataType::Time64(TimeUnit::Nanosecond),
DataType::Duration(TimeUnit::Second),
DataType::Duration(TimeUnit::Millisecond),
DataType::Duration(TimeUnit::Microsecond),
DataType::Duration(TimeUnit::Nanosecond),
DataType::Interval(IntervalUnit::YearMonth),
DataType::Interval(IntervalUnit::DayTime),
DataType::Binary,
DataType::FixedSizeBinary(0),
DataType::FixedSizeBinary(1234),
DataType::FixedSizeBinary(-432),
DataType::LargeBinary,
DataType::Utf8,
DataType::LargeUtf8,
DataType::Decimal128(7, 12),
// Recursive list tests
DataType::List(new_arc_field("Level1", DataType::Binary, true)),
DataType::List(new_arc_field(
"Level1",
DataType::List(new_arc_field(
"Level2",
DataType::FixedSizeBinary(53),
false,
)),
true,
)),
// Fixed size lists
DataType::FixedSizeList(new_arc_field("Level1", DataType::Binary, true), 4),
DataType::FixedSizeList(
new_arc_field(
"Level1",
DataType::List(new_arc_field(
"Level2",
DataType::FixedSizeBinary(53),
false,
)),
true,
),
41,
),
// Struct Testing
DataType::Struct(Fields::from(vec![
Field::new("nullable", DataType::Boolean, false),
Field::new("name", DataType::Utf8, false),
Field::new("datatype", DataType::Binary, false),
])),
DataType::Struct(Fields::from(vec![
Field::new("nullable", DataType::Boolean, false),
Field::new("name", DataType::Utf8, false),
Field::new("datatype", DataType::Binary, false),
Field::new(
"nested_struct",
DataType::Struct(Fields::from(vec![
Field::new("nullable", DataType::Boolean, false),
Field::new("name", DataType::Utf8, false),
Field::new("datatype", DataType::Binary, false),
])),
true,
),
])),
DataType::Union(
UnionFields::new(
vec![7, 5, 3],
vec![
Field::new("nullable", DataType::Boolean, false),
Field::new("name", DataType::Utf8, false),
Field::new("datatype", DataType::Binary, false),
],
),
UnionMode::Sparse,
),
DataType::Union(
UnionFields::new(
vec![5, 8, 1],
vec![
Field::new("nullable", DataType::Boolean, false),
Field::new("name", DataType::Utf8, false),
Field::new("datatype", DataType::Binary, false),
Field::new_struct(
"nested_struct",
vec![
Field::new("nullable", DataType::Boolean, false),
Field::new("name", DataType::Utf8, false),
Field::new("datatype", DataType::Binary, false),
],
true,
),
],
),
UnionMode::Dense,
),
DataType::Dictionary(
Box::new(DataType::Utf8),
Box::new(DataType::Struct(Fields::from(vec![
Field::new("nullable", DataType::Boolean, false),
Field::new("name", DataType::Utf8, false),
Field::new("datatype", DataType::Binary, false),
]))),
),
DataType::Dictionary(
Box::new(DataType::Decimal128(10, 50)),
Box::new(DataType::FixedSizeList(
new_arc_field("Level1", DataType::Binary, true),
4,
)),
),
DataType::Map(
new_arc_field(
"entries",
DataType::Struct(Fields::from(vec![
Field::new("keys", DataType::Utf8, false),
Field::new("values", DataType::Int32, true),
])),
true,
),
false,
),
];
for test_case in test_cases.into_iter() {
let proto: super::protobuf::ArrowType = (&test_case).try_into().unwrap();
let roundtrip: DataType = (&proto).try_into().unwrap();
assert_eq!(format!("{test_case:?}"), format!("{roundtrip:?}"));
}
}