You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Yubao Liu (Jira)" <ji...@apache.org> on 2020/03/06 07:39:00 UTC
[jira] [Created] (AVRO-2772) wrong union schema forward
compatibility
Yubao Liu created AVRO-2772:
-------------------------------
Summary: wrong union schema forward compatibility
Key: AVRO-2772
URL: https://issues.apache.org/jira/browse/AVRO-2772
Project: Apache Avro
Issue Type: Bug
Components: java
Affects Versions: 1.9.2
Environment: JDK 13, Maven 3.6.3, avro 1.9.2.
Reporter: Yubao Liu
Attachments: avro-union.tar.gz
{code:java}
protocol Test {
record A {
int amount;
}
record B {
int amount;
}
record C {
// old:
union { A } c;
// new:
union { A, B} c;
}
}
{code}
The old C schema has "union {A} c;", new C schema has "union {A, B} c;", suppose we use new C schema and write a B object for field "c", and use old C schema to read it back, AVRO will happily return a "A" object for field "c", this is surprising.
The new and old schema are mutual compatible according to AVRO schema validator.
Attached a maven project to demonstrate the issue, here is the output:
{code}
readerSchema and writerSchema are mutual compatible
writerSchema unionSchemas.size()=2
writerSchema unionSchemas.get(1)={"type":"record","name":"B","fields":[{"name":"amount","type":"int"}]}
r={"c": {"amount": 12}}
r.c.schema={"type":"record","name":"B","fields":[{"name":"amount","type":"int"}]}
r2={"c": {"amount": 12}}
r2.c.schema={"type":"record","name":"A","fields":[{"name":"amount","type":"int"}]}
{code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)