On Fri, 6 Dec 2019 at 10:38, Ryan Skraba <r...@skraba.com> wrote:

> Hello!   I had a Java unit test ready to go (looking at default values
> for complex types for AVRO-2636), so just reporting back (the easy
> work!):
>

Thanks for the responses!


> 1. In Java, the schema above is parsed without error, but when
> attempting to use the default value, it fails with a
> NullPointerException (trying to find the symbol C in E1).
>

I tried it with gogen-avro <https://github.com/actgardner/gogen-avro> and I
had a similar issue. It generates invalid Go code as output.

2. If you were to disambiguate the symbols using the Avro JSON
> encoding ("default": [{"E1":"B"},{"E2":"A"},{"E2":"C"}]), Java fails
> while parsing the schema:
>
> org.apache.avro.AvroTypeException: Invalid default for field F:
> [{"E1":"B"},{"E2":"A"},{"E2":"C"}] not a
>
> {"type":"array","items":[{"type":"enum","name":"E1","symbols":["A","B"]},{"type":"enum","name":"E2","symbols":["B","A","C"]}]}
> at org.apache.avro.Schema.validateDefault(Schema.java:1542)
> at org.apache.avro.Schema.access$500(Schema.java:87)
> at org.apache.avro.Schema$Field.<init>(Schema.java:523)
> at org.apache.avro.Schema.parse(Schema.java:1649)
> at org.apache.avro.Schema$Parser.parse(Schema.java:1396)
> at org.apache.avro.Schema$Parser.parse(Schema.java:1384)
>
> It seems that Java implements `Only the first schema in any union can
> be used in a default value` as opposed to `Default values for union
> fields correspond to the first schema in the union` (in the example,
> it isn't a union field).
>
> Naively, I would expect any JSON encoded data to be a valid default
> value (which is not what the spec says).  Does anyone know why the
> "first schema only" rule was added to the spec?
>

Yes, I think the authors missed a trick here. I suspect things would be
cleaner if the default value was encoded in exactly the way as JSON-encoded
Avro values. As things currently are, an implementer needs to implement two
slightly different ways of translating from JSON to an Avro value.

  cheers,
    rog.

Reply via email to