This is an automated email from the ASF dual-hosted git repository.
kriskras99 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/avro-rs.git
The following commit(s) were added to refs/heads/main by this push:
new 9836cec fix: Be more selective when choosing an union when
serializing bytes with schema (#421)
9836cec is described below
commit 9836cecf91d9ca48fb711a0dc275cd0a4579d689
Author: Kriskras99 <[email protected]>
AuthorDate: Wed Jan 21 15:27:05 2026 +0100
fix: Be more selective when choosing an union when serializing bytes with
schema (#421)
* fix: Be more selective when choosing an union when serializing bytes with
schema
* chore: Simplify test
---------
Co-authored-by: default <[email protected]>
---
avro/src/serde/ser_schema.rs | 52 +++++++++++++++++++++++++++++++++++++++-----
1 file changed, 47 insertions(+), 5 deletions(-)
diff --git a/avro/src/serde/ser_schema.rs b/avro/src/serde/ser_schema.rs
index 5a092c5..79a58a6 100644
--- a/avro/src/serde/ser_schema.rs
+++ b/avro/src/serde/ser_schema.rs
@@ -18,7 +18,7 @@
//! Logic for serde-compatible schema-aware serialization
//! which writes directly to a `Write` stream
-use crate::schema::{InnerDecimalSchema, UuidSchema};
+use crate::schema::{DecimalSchema, InnerDecimalSchema, UuidSchema};
use crate::{
bigdecimal::big_decimal_as_bytes,
encode::{encode_int, encode_long},
@@ -1282,15 +1282,33 @@ impl<'s, W: Write> SchemaAwareWriteSerializer<'s, W> {
match variant_schema {
Schema::String
| Schema::Bytes
- | Schema::Uuid(_)
+ | Schema::Uuid(UuidSchema::Bytes | UuidSchema::String)
| Schema::BigDecimal
- | Schema::Fixed(_)
- | Schema::Duration(_)
- | Schema::Decimal(_)
+ | Schema::Decimal(DecimalSchema {
+ inner: InnerDecimalSchema::Bytes,
+ ..
+ })
| Schema::Ref { name: _ } => {
encode_int(i as i32, &mut *self.writer)?;
return self.serialize_bytes_with_schema(value,
variant_schema);
}
+ Schema::Fixed(fixed) |
Schema::Uuid(UuidSchema::Fixed(fixed))
+ if fixed.size == value.len() =>
+ {
+ encode_int(i as i32, &mut *self.writer)?;
+ return self.serialize_bytes_with_schema(value,
variant_schema);
+ }
+ Schema::Decimal(DecimalSchema {
+ inner: InnerDecimalSchema::Fixed(fixed),
+ ..
+ }) if fixed.size >= value.len() => {
+ encode_int(i as i32, &mut *self.writer)?;
+ return self.serialize_bytes_with_schema(value,
variant_schema);
+ }
+ Schema::Duration(_) if value.len() == 12 => {
+ encode_int(i as i32, &mut *self.writer)?;
+ return self.serialize_bytes_with_schema(value,
variant_schema);
+ }
_ => { /* skip */ }
}
}
@@ -3549,4 +3567,28 @@ mod tests {
Ok(())
}
+
+ #[test]
+ fn avro_rs_421_serialize_bytes_union_of_fixed() -> TestResult {
+ let schema = Schema::parse_str(
+ r#"[
+ { "name": "fixed4", "type": "fixed", "size": 4 },
+ { "name": "fixed8", "type": "fixed", "size": 8 }
+ ]"#,
+ )
+ .unwrap();
+
+ let mut buffer: Vec<u8> = Vec::new();
+ let names = HashMap::new();
+ let mut serializer = SchemaAwareWriteSerializer::new(&mut buffer,
&schema, &names, None);
+ let bytes_written = crate::serde_avro_fixed::serialize(&[0, 1, 2, 3],
&mut serializer)?;
+ assert_eq!(bytes_written, 4);
+ let bytes_written =
+ crate::serde_avro_fixed::serialize(&[4, 5, 6, 7, 8, 9, 10, 11],
&mut serializer)?;
+ assert_eq!(bytes_written, 8);
+
+ assert_eq!(buffer, &[0, 0, 1, 2, 3, 2, 4, 5, 6, 7, 8, 9, 10, 11][..]);
+
+ Ok(())
+ }
}