diff --git a/datafusion/proto/proto/datafusion.proto b/datafusion/proto/proto/datafusion.proto index 023655de8efdf..4c56b2f081edc 100644 --- a/datafusion/proto/proto/datafusion.proto +++ b/datafusion/proto/proto/datafusion.proto @@ -770,6 +770,11 @@ message StructValue { repeated Field fields = 3; } +message ScalarFixedSizeBinary{ + bytes values = 1; + int32 length = 2; +} + message ScalarValue{ // was PrimitiveScalarType null_value = 19; reserved 19; @@ -808,6 +813,7 @@ message ScalarValue{ int64 time64_value = 30; IntervalMonthDayNanoValue interval_month_day_nano = 31; StructValue struct_value = 32; + ScalarFixedSizeBinary fixed_size_binary_value = 34; } } diff --git a/datafusion/proto/src/from_proto.rs b/datafusion/proto/src/from_proto.rs index 23cd02dd3f248..0c35859a53366 100644 --- a/datafusion/proto/src/from_proto.rs +++ b/datafusion/proto/src/from_proto.rs @@ -651,6 +651,9 @@ impl TryFrom<&protobuf::ScalarValue> for ScalarValue { Self::Struct(values, Box::new(fields)) } + Value::FixedSizeBinaryValue(v) => { + Self::FixedSizeBinary(v.length, Some(v.clone().values)) + } }) } } diff --git a/datafusion/proto/src/lib.rs b/datafusion/proto/src/lib.rs index 21ded84a57ca7..1552542a10710 100644 --- a/datafusion/proto/src/lib.rs +++ b/datafusion/proto/src/lib.rs @@ -682,6 +682,12 @@ mod roundtrip_tests { 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() { diff --git a/datafusion/proto/src/to_proto.rs b/datafusion/proto/src/to_proto.rs index 635d2932bd61e..bdfe5becae135 100644 --- a/datafusion/proto/src/to_proto.rs +++ b/datafusion/proto/src/to_proto.rs @@ -1033,9 +1033,14 @@ impl TryFrom<&ScalarValue> for protobuf::ScalarValue { Value::LargeBinaryValue(s.to_owned()) }) } - scalar::ScalarValue::FixedSizeBinary(_, _) => Err(Error::General( - "FixedSizeBinary is not yet implemented".to_owned(), - )), + scalar::ScalarValue::FixedSizeBinary(length, val) => { + create_proto_scalar(val, &data_type, |s| { + Value::FixedSizeBinaryValue(protobuf::ScalarFixedSizeBinary { + values: s.to_owned(), + length: *length, + }) + }) + } datafusion::scalar::ScalarValue::Time64(v) => { create_proto_scalar(v, &data_type, |v| Value::Time64Value(*v))