[ 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.