[
https://issues.apache.org/jira/browse/AVRO-3821?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17754415#comment-17754415
]
ASF subversion and git services commented on AVRO-3821:
-------------------------------------------------------
Commit d05ca14e7de4281f5db464546dbc89537db1bcb1 in avro's branch
refs/heads/dependabot/cargo/lang/rust/master/color-backtrace-0.6.0 from Martin
Grigorov
[ https://gitbox.apache.org/repos/asf?p=avro.git;h=d05ca14e7 ]
AVRO-3821: [Rust] Encoding records should follow the schema (#2417)
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 <[email protected]>
> 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
> Fix For: 1.12.0, 1.11.3
>
> Time Spent: 20m
> 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)