Description
When using avro reflection to create PTypes, the type might represent a union type, as specified by the @Union annotation. Derived types from this, such as tableOf() and collections() will create a null union from this (already union) type and create a nested union which throws an AvroRuntimeException.
@org.apache.avro.reflect.Union(
{ Foo1.class, Foo2.class })
public static interface Foo {
public String getFoo();
}
public static class Foo1 implements Foo {
private final Double value = 1.0;
@Override
public String getFoo()
}
public static class Foo2 implements Foo {
private final Integer value = 2;
@Override
public String getFoo() { return value.toString(); }
}
Schema schema = ReflectData.get().getSchema(Foo.class);
AvroType<Foo> ptype = Avros.reflects(Foo.class, schema);
Avros.tableOf(Avros.strings(), ptype);
Avros.collections(ptype);
Exception in thread "main" org.apache.avro.AvroRuntimeException: Nested union: [["double","string"],"null"]
...
Seems like the methods Avros.allowNulls() and AvroTableType.nullable() both are calling Schema.createUnion(unionSchema, nullSchema), and could add an extra case statement to use the already existing union schema.