Uploaded image for project: 'Avro'
  1. Avro
  2. 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

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.7.5
    • Fix Version/s: 1.7.6
    • Component/s: java
    • Labels:
      None

      Description

      From email thread on user list

      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
         }
      

      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

         @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);
         }
      

        Attachments

        1. AVRO-1377.patch
          2 kB
          graham sanderson

          Activity

            People

            • Assignee:
              graham.sanderson graham sanderson
              Reporter:
              graham sanderson graham sanderson
            • Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: