[ 
https://issues.apache.org/jira/browse/AVRO-1377?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13770078#comment-13770078
 ] 

graham sanderson commented on AVRO-1377:
----------------------------------------

Repsonse from Doug:

Graham,

This does indeed look like a bug that affects printing of both enum
and fixed schemas that have a namespace when nested within a record
with no namespace.  The fix seems as simple as the following:

{code}
--- Schema.java (revision 1522738)
+++ Schema.java (working copy)
@@ -458,8 +458,6 @@
      if (space != null) {
        if (!space.equals(names.space()))
          gen.writeStringField("namespace", space);
-        if (names.space() == null)                // default namespace
-          names.space(space);
      } else if (names.space() != null) {         // null within non-null
        gen.writeStringField("namespace", "");
      }
{code}

Please file an issue in Jira.

Thanks,

Doug

                
> Fields with certained named schemas (enum, union) inside un-named 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
>
> 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

Reply via email to