[
https://issues.apache.org/jira/browse/AVRO-1377?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
graham sanderson updated AVRO-1377:
-----------------------------------
Fix Version/s: 1.7.6
Status: Patch Available (was: Open)
> Fields with certained name-spaced schemas (enum, union) inside an
> un-name-spaced record schema can cause the schema to be serialized incorrectly
> ------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: AVRO-1377
> URL: https://issues.apache.org/jira/browse/AVRO-1377
> Project: Avro
> Issue Type: Bug
> Components: java
> Affects Versions: 1.7.5
> Reporter: graham sanderson
> Fix For: 1.7.6
>
> Attachments: AVRO-1377.patch
>
>
> From email thread on user list
> {code}
> Here is a condensed example of a problem I just came across
> @Test
> void testNamespaceBleed() throws Exception {
> Schema schema = SchemaBuilder.record("test").fields()
>
> .name("field1").type().enumeration("Bar").namespace("com.foo").symbols("x").noDefault()
>
> .name("field2").type().record("Humbug").namespace("com.foo").fields().endRecord().noDefault()
> .endRecord();
> String schemaString = schema.toString(true);
> Schema schema2 = new Schema.Parser().parse(schemaString);
> Assert.assertEquals(schema, schema2); // one would hope this were true
> }
> {code}
> Basically the use case (which may not be very common) is with the first
> (namespaced) schema in a record without a namespace being an enum. Because
> the serialization of the enum schema does not save and restore the namespace,
> it becomes the default namespace (for serialization) of other fields that
> follow in the same record (so field2 is written without a namespace since it
> is in the default namespace, but when the schema is deserialized the same bug
> does not occur and so it appears a "Humbug" rather than "com.foo.Humbug")
> Note, the following (and of course most others) all work
> {code}
> @Test
> void testNoNamespaceBleed() throws Exception {
> // works because the enclosing record has a namespace
> Schema schema =
> SchemaBuilder.record("test").namespace("com.foo").fields()
>
> .name("field1").type().enumeration("Bar").namespace("com.foo").symbols("x").noDefault()
>
> .name("field2").type().record("Humbug").namespace("com.foo").fields().endRecord().noDefault()
> .endRecord();
> String schemaString = schema.toString(true);
> Schema schema2 = new Schema.Parser().parse(schemaString);
> Assert.assertEquals(schema,schema2);
> // works because the enclosing record has a namespace (even though
> different)
> schema = SchemaBuilder.record("test").namespace("com.bar").fields()
>
> .name("field1").type().enumeration("Bar").namespace("com.foo").symbols("x").noDefault()
>
> .name("field2").type().record("Humbug").namespace("com.foo").fields().endRecord().noDefault()
> .endRecord();
> schemaString = schema.toString(true);
> schema2 = new Schema.Parser().parse(schemaString);
> Assert.assertEquals(schema,schema2);
> // works because the enum and the field are in different namespaces
> schema = SchemaBuilder.record("test").fields()
>
> .name("field1").type().enumeration("Bar").namespace("com.bar").symbols("x").noDefault()
>
> .name("field2").type().record("Humbug").namespace("com.foo").fields().endRecord().noDefault()
> .endRecord();
> schemaString = schema.toString(true);
> schema2 = new Schema.Parser().parse(schemaString);
> Assert.assertEquals(schema,schema2);
> }
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira