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

Philip Zeyliger commented on AVRO-361:
--------------------------------------

Scott,

I looked at the patch and only saw changes to Schema.java.  Did you intend to 
include a test?

Looking at the code, it may be appropriate to check that for the named types, 
we only use a given name once, so it's possible to just throw all the types in 
a set by name, and make sure they're different.

-- Philip

> 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
>
>         Attachments: AVRO-361.patch
>
>
> 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