Specific Compiler fails to handle union with two fixed branches
---------------------------------------------------------------

                 Key: AVRO-361
                 URL: https://issues.apache.org/jira/browse/AVRO-361
             Project: Avro
          Issue Type: Bug
          Components: java
    Affects Versions: 1.3.0
            Reporter: Scott Carey
             Fix For: 1.3.0


The following record fails to compile with the specific compiler:
{code}
{"name": "ipAddr", "type": "record", "fields":[
  {"name": "addr", "type": [
    {"name": "IPv6", "type": "fixed", "size": 16 },
    {"name": "IPv4", "type": "fixed", "size": 4 }]
  }
 ]
}   
{code}

The stack trace is:
{noformat}
org.apache.avro.AvroRuntimeException: Ambiguous union: 
[{"type":"fixed","name":"IPv6","size":16},{"type":"fixed","name":"IPv4","size":4}]
        at org.apache.avro.Schema$UnionSchema.<init>(Schema.java:613)
        at org.apache.avro.Schema.parse(Schema.java:874)
        at org.apache.avro.Schema.parse(Schema.java:825)
        at org.apache.avro.Schema.parse(Schema.java:709)
        at 
org.apache.avro.specific.SpecificCompiler.compileSchema(SpecificCompiler.java:111)\
{noformat}

This is on trunk:

$ svn info
Path: .
URL: http://svn.apache.org/repos/asf/hadoop/avro/trunk/lang/java
Repository Root: http://svn.apache.org/repos/asf
Repository UUID: 13f79535-47bb-0310-9956-ffa450edef68
Revision: 901469


The code for UnionSchema in Schema.java has this constructor: 
{code}
public UnionSchema(List<Schema> types) {
      super(Type.UNION);
      this.types = types;
      int seen = 0;
      for (Schema type : types) {                 // check legality of union
        switch (type.getType()) {
        case UNION: 
          throw new AvroRuntimeException("Nested union: "+this);
        case RECORD:
          if (type.getName() != null)
            continue;
        default:
          int mask = 1 << type.getType().ordinal();
          if ((seen & mask) != 0)
            throw new AvroRuntimeException("Ambiguous union: "+this);
          seen |= mask;
        }
      }
    }
{code}

That allows only one member of any type other than RECORD.  The spec says:
{quote}
Unions may not contain more than one schema with the same
type, except for the named types record, fixed and enum.
{quote}

The code above does not adhere to this.

I am attaching a patch for only this code, but a unit test with a test schema 
that has two records, two fixed, and two enum in it as well as one of each of 
the unnamed types is probably necessary as well.  I am not yet familiar with 
the test infrastructure.
I am also not familiar with what else this may impact.


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to