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(())
+    }
 }

Reply via email to