avro-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "graham sanderson (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (AVRO-1377) Fields with certained name-spaced schemas (enum, union) inside an un-name-spaced record schema can cause the schema to be serialized incorrectly
Date Mon, 23 Sep 2013 03:28:02 GMT

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

graham sanderson updated AVRO-1377:
-----------------------------------

    Attachment: AVRO-1377.patch

Patch with Doug's suggested fix, and test case to repro the original problem in the style
(and place) that seemed to match the other tests
                
> 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
>         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

Mime
View raw message