in datafusion/proto/src/logical_plan/mod.rs [1950:2132]
fn round_trip_scalar_values() {
let should_pass: Vec<ScalarValue> = vec![
ScalarValue::Boolean(None),
ScalarValue::Float32(None),
ScalarValue::Float64(None),
ScalarValue::Int8(None),
ScalarValue::Int16(None),
ScalarValue::Int32(None),
ScalarValue::Int64(None),
ScalarValue::UInt8(None),
ScalarValue::UInt16(None),
ScalarValue::UInt32(None),
ScalarValue::UInt64(None),
ScalarValue::Utf8(None),
ScalarValue::LargeUtf8(None),
ScalarValue::new_list(None, DataType::Boolean),
ScalarValue::Date32(None),
ScalarValue::Boolean(Some(true)),
ScalarValue::Boolean(Some(false)),
ScalarValue::Float32(Some(1.0)),
ScalarValue::Float32(Some(f32::MAX)),
ScalarValue::Float32(Some(f32::MIN)),
ScalarValue::Float32(Some(-2000.0)),
ScalarValue::Float64(Some(1.0)),
ScalarValue::Float64(Some(f64::MAX)),
ScalarValue::Float64(Some(f64::MIN)),
ScalarValue::Float64(Some(-2000.0)),
ScalarValue::Int8(Some(i8::MIN)),
ScalarValue::Int8(Some(i8::MAX)),
ScalarValue::Int8(Some(0)),
ScalarValue::Int8(Some(-15)),
ScalarValue::Int16(Some(i16::MIN)),
ScalarValue::Int16(Some(i16::MAX)),
ScalarValue::Int16(Some(0)),
ScalarValue::Int16(Some(-15)),
ScalarValue::Int32(Some(i32::MIN)),
ScalarValue::Int32(Some(i32::MAX)),
ScalarValue::Int32(Some(0)),
ScalarValue::Int32(Some(-15)),
ScalarValue::Int64(Some(i64::MIN)),
ScalarValue::Int64(Some(i64::MAX)),
ScalarValue::Int64(Some(0)),
ScalarValue::Int64(Some(-15)),
ScalarValue::UInt8(Some(u8::MAX)),
ScalarValue::UInt8(Some(0)),
ScalarValue::UInt16(Some(u16::MAX)),
ScalarValue::UInt16(Some(0)),
ScalarValue::UInt32(Some(u32::MAX)),
ScalarValue::UInt32(Some(0)),
ScalarValue::UInt64(Some(u64::MAX)),
ScalarValue::UInt64(Some(0)),
ScalarValue::Utf8(Some(String::from("Test string "))),
ScalarValue::LargeUtf8(Some(String::from("Test Large utf8"))),
ScalarValue::Date32(Some(0)),
ScalarValue::Date32(Some(i32::MAX)),
ScalarValue::Date32(None),
ScalarValue::Date64(Some(0)),
ScalarValue::Date64(Some(i64::MAX)),
ScalarValue::Date64(None),
ScalarValue::Time32Second(Some(0)),
ScalarValue::Time32Second(Some(i32::MAX)),
ScalarValue::Time32Second(None),
ScalarValue::Time32Millisecond(Some(0)),
ScalarValue::Time32Millisecond(Some(i32::MAX)),
ScalarValue::Time32Millisecond(None),
ScalarValue::Time64Microsecond(Some(0)),
ScalarValue::Time64Microsecond(Some(i64::MAX)),
ScalarValue::Time64Microsecond(None),
ScalarValue::Time64Nanosecond(Some(0)),
ScalarValue::Time64Nanosecond(Some(i64::MAX)),
ScalarValue::Time64Nanosecond(None),
ScalarValue::TimestampNanosecond(Some(0), None),
ScalarValue::TimestampNanosecond(Some(i64::MAX), None),
ScalarValue::TimestampNanosecond(Some(0), Some("UTC".into())),
ScalarValue::TimestampNanosecond(None, None),
ScalarValue::TimestampMicrosecond(Some(0), None),
ScalarValue::TimestampMicrosecond(Some(i64::MAX), None),
ScalarValue::TimestampMicrosecond(Some(0), Some("UTC".into())),
ScalarValue::TimestampMicrosecond(None, None),
ScalarValue::TimestampMillisecond(Some(0), None),
ScalarValue::TimestampMillisecond(Some(i64::MAX), None),
ScalarValue::TimestampMillisecond(Some(0), Some("UTC".into())),
ScalarValue::TimestampMillisecond(None, None),
ScalarValue::TimestampSecond(Some(0), None),
ScalarValue::TimestampSecond(Some(i64::MAX), None),
ScalarValue::TimestampSecond(Some(0), Some("UTC".into())),
ScalarValue::TimestampSecond(None, None),
ScalarValue::IntervalDayTime(Some(IntervalDayTimeType::make_value(0, 0))),
ScalarValue::IntervalDayTime(Some(IntervalDayTimeType::make_value(1, 2))),
ScalarValue::IntervalDayTime(Some(IntervalDayTimeType::make_value(
i32::MAX,
i32::MAX,
))),
ScalarValue::IntervalDayTime(None),
ScalarValue::IntervalMonthDayNano(Some(
IntervalMonthDayNanoType::make_value(0, 0, 0),
)),
ScalarValue::IntervalMonthDayNano(Some(
IntervalMonthDayNanoType::make_value(1, 2, 3),
)),
ScalarValue::IntervalMonthDayNano(Some(
IntervalMonthDayNanoType::make_value(i32::MAX, i32::MAX, i64::MAX),
)),
ScalarValue::IntervalMonthDayNano(None),
ScalarValue::new_list(
Some(vec![
ScalarValue::Float32(Some(-213.1)),
ScalarValue::Float32(None),
ScalarValue::Float32(Some(5.5)),
ScalarValue::Float32(Some(2.0)),
ScalarValue::Float32(Some(1.0)),
]),
DataType::Float32,
),
ScalarValue::new_list(
Some(vec![
ScalarValue::new_list(None, DataType::Float32),
ScalarValue::new_list(
Some(vec![
ScalarValue::Float32(Some(-213.1)),
ScalarValue::Float32(None),
ScalarValue::Float32(Some(5.5)),
ScalarValue::Float32(Some(2.0)),
ScalarValue::Float32(Some(1.0)),
]),
DataType::Float32,
),
]),
DataType::List(new_arc_field("item", DataType::Float32, true)),
),
ScalarValue::Dictionary(
Box::new(DataType::Int32),
Box::new(ScalarValue::Utf8(Some("foo".into()))),
),
ScalarValue::Dictionary(
Box::new(DataType::Int32),
Box::new(ScalarValue::Utf8(None)),
),
ScalarValue::Binary(Some(b"bar".to_vec())),
ScalarValue::Binary(None),
ScalarValue::LargeBinary(Some(b"bar".to_vec())),
ScalarValue::LargeBinary(None),
ScalarValue::Struct(
Some(vec![
ScalarValue::Int32(Some(23)),
ScalarValue::Boolean(Some(false)),
]),
Fields::from(vec![
Field::new("a", DataType::Int32, true),
Field::new("b", DataType::Boolean, false),
]),
),
ScalarValue::Struct(
None,
Fields::from(vec![
Field::new("a", DataType::Int32, true),
Field::new("a", DataType::Boolean, false),
]),
),
ScalarValue::FixedSizeBinary(
b"bar".to_vec().len() as i32,
Some(b"bar".to_vec()),
),
ScalarValue::FixedSizeBinary(0, None),
ScalarValue::FixedSizeBinary(5, None),
];
for test_case in should_pass.into_iter() {
let proto: super::protobuf::ScalarValue = (&test_case)
.try_into()
.expect("failed conversion to protobuf");
let roundtrip: ScalarValue = (&proto)
.try_into()
.expect("failed conversion from protobuf");
assert_eq!(
test_case, roundtrip,
"ScalarValue was not the same after round trip!\n\n\
Input: {test_case:?}\n\nRoundtrip: {roundtrip:?}"
);
}
}