[ 
https://issues.apache.org/jira/browse/AVRO-3821?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated AVRO-3821:
---------------------------------
    Labels: pull-request-available  (was: )

> 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
>              Labels: pull-request-available
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> 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)

Reply via email to