[ https://issues.apache.org/jira/browse/AVRO-3821?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17751104#comment-17751104 ]
ASF subversion and git services commented on AVRO-3821: ------------------------------------------------------- Commit ccde2e5d76b5091a0dcd5ffdba3b5427ab4c2d60 in avro's branch refs/heads/avro-3821-fix-encoding-of-records from Martin Tzvetanov Grigorov [ https://gitbox.apache.org/repos/asf?p=avro.git;h=ccde2e5d7 ] AVRO-3821: [Rust] Encoding records should follow the schema When encoding Value::Record the logic should use the order of the fields in the schema instead of the order in the Value::Record Signed-off-by: Martin Tzvetanov Grigorov <mgrigo...@apache.org> > Rust: Record (de?)serialization is sensitive to order of fields in struct > ------------------------------------------------------------------------- > > Key: AVRO-3821 > URL: https://issues.apache.org/jira/browse/AVRO-3821 > Project: Apache Avro > Issue Type: Bug > Components: rust > Reporter: Renar Narubin > Assignee: Martin Tzvetanov Grigorov > Priority: Major > > A previous issue describes a bug where record validation failed due to a > struct's field declaration order not matching its schema: > https://issues.apache.org/jira/browse/AVRO-3495 > > That issue's fix appears to be incomplete. Validation during writing works, > however the written records cannot be read back - it appears that the fields > are mismatched during deserialization. I've reproduced using the existing > `avro_old_issue_47` test case with a modification to read the data back: > > {code:java} > diff --git a/lang/rust/avro/tests/schema.rs b/lang/rust/avro/tests/schema.rs > index 00be0ab01..d5b1ee904 100644 > --- a/lang/rust/avro/tests/schema.rs > +++ b/lang/rust/avro/tests/schema.rs > @@ -18,6 +18,7 @@ > use std::io::{Cursor, Read}; > > use apache_avro::{ > + from_avro_datum, from_value, > schema::{EnumSchema, FixedSchema, Name, RecordField, RecordSchema}, > to_avro_datum, to_value, > types::{Record, Value}, > @@ -1452,7 +1453,7 @@ fn avro_old_issue_47() -> TestResult { > > use serde::{Deserialize, Serialize}; > > - #[derive(Deserialize, Serialize)] > + #[derive(Deserialize, Serialize, Debug, Clone, PartialEq)] > pub struct MyRecord { > b: String, > a: i64, > @@ -1463,7 +1464,15 @@ fn avro_old_issue_47() -> TestResult { > a: 1, > }; > > - let _ = to_avro_datum(&schema, to_value(record)?)?; > + let serialized_bytes = to_avro_datum(&schema, > to_value(record.clone())?)?; > + > + let deserialized_record = from_value::<MyRecord>(&from_avro_datum( > + &schema, > + &mut Cursor::new(serialized_bytes), > + None, > + )?)?; > + > + assert_eq!(record, deserialized_record); > Ok(()) > } > > {code} > This fails as written, and passes if `a` and `b` are swapped in the MyRecord > definition. > -- This message was sent by Atlassian Jira (v8.20.10#820010)