Hi Gerald,

Thank you for pointing this out. Luckily someone else beat you to it, and
reported it as AVRO-4027 <https://issues.apache.org/jira/browse/AVRO-4027>. The
associated PR#3071 <https://github.com/apache/avro/pull/3071> has been
merged, so the issue will be fixed in the next release.

Kind regards,
Oscar

On Tue, 18 Feb 2025 at 12:36, Gerald Schermann via user <
user@avro.apache.org> wrote:

> Hi all,
>
> while updating one of our Avro contracts we realized that the IDL to Avro
> Schema conversion tool no longer supports empty maps as default values. Now
> we are wondering whether this is by design or is there a regression
> involved?
>
> Here is a small Avro IDL example to reproduce:
>
> namespace Some.Demo.Space;
>
> schema TestRecord;
>
> record TestRecord {
>     long SomeNumber;
>     array<int> SomeNumbers = [];
>     map<string> SomeMap = {};
> }
>
> When trying to convert this to an Avro Schema the conversion crashes:
>
> java -jar avro-tools-1.12.0.jar idl "$(pwd)/example.avdl"
> Exception in thread "main" org.apache.avro.SchemaParseException:
> java.lang.NullPointerException: Cannot invoke
> "org.antlr.v4.runtime.Token.getText()" because "stringToken" is null
>         at org.apache.avro.idl.IdlReader.parse(IdlReader.java:224)
>         at org.apache.avro.idl.IdlReader.parse(IdlReader.java:187)
>         at org.apache.avro.idl.IdlReader.parse(IdlReader.java:172)
>         at org.apache.avro.tool.IdlTool.run(IdlTool.java:70)
>         at org.apache.avro.tool.Main.run(Main.java:67)
>         at org.apache.avro.tool.Main.main(Main.java:56)
> Caused by: java.lang.NullPointerException: Cannot invoke
> "org.antlr.v4.runtime.Token.getText()" because "stringToken" is null
>         at
> org.apache.avro.idl.IdlReader$IdlParserListener.getString(IdlReader.java:975)
>         at
> org.apache.avro.idl.IdlReader$IdlParserListener.exitJsonPair(IdlReader.java:926)
>         at
> org.apache.avro.idl.IdlParser$JsonPairContext.exitRule(IdlParser.java:2558)
>         at
> org.antlr.v4.runtime.Parser.triggerExitRuleEvent(Parser.java:410)
>         at org.antlr.v4.runtime.Parser.exitRule(Parser.java:642)
>         at org.apache.avro.idl.IdlParser.idlFile(IdlParser.java:289)
>         at org.apache.avro.idl.IdlReader.parse(IdlReader.java:220)
>         ... 5 more
>
> The same happens when using the "old" protocol syntax:
> @namespace("Some.Demo.Space")
> protocol TestProtocol {
>     record TestRecord {
>         long SomeNumber;
>         array<int> SomeNumbers = [];
>         map<string> SomeMap = {};
>     }
> }
>
> java -jar avro-tools-1.12.0.jar idl2schemata "$(pwd)/example_old.avdl" out
> Exception in thread "main" org.apache.avro.SchemaParseException:
> java.lang.NullPointerException: Cannot invoke
> "org.antlr.v4.runtime.Token.getText()" because "stringToken" is null
>         at org.apache.avro.idl.IdlReader.parse(IdlReader.java:224)
>         at org.apache.avro.idl.IdlReader.parse(IdlReader.java:187)
>         at org.apache.avro.idl.IdlReader.parse(IdlReader.java:172)
>         at
> org.apache.avro.tool.IdlToSchemataTool.run(IdlToSchemataTool.java:67)
>         at org.apache.avro.tool.Main.run(Main.java:67)
>         at org.apache.avro.tool.Main.main(Main.java:56)
> Caused by: java.lang.NullPointerException: Cannot invoke
> "org.antlr.v4.runtime.Token.getText()" because "stringToken" is null
>         at
> org.apache.avro.idl.IdlReader$IdlParserListener.getString(IdlReader.java:975)
>         at
> org.apache.avro.idl.IdlReader$IdlParserListener.exitJsonPair(IdlReader.java:926)
>         at
> org.apache.avro.idl.IdlParser$JsonPairContext.exitRule(IdlParser.java:2558)
>         at
> org.antlr.v4.runtime.Parser.triggerExitRuleEvent(Parser.java:410)
>         at org.antlr.v4.runtime.Parser.exitRule(Parser.java:642)
>         at org.apache.avro.idl.IdlParser.idlFile(IdlParser.java:289)
>         at org.apache.avro.idl.IdlReader.parse(IdlReader.java:220)
>         ... 5 more
>
> However, the conversion works fine for versions prior to 1.12.0:
> java -jar avro-tools-1.11.3.jar idl2schemata "$(pwd)/example_old.avdl" out
>
> The default value is properly propagated to the resulting Avro Schema:
> {
>  "type" : "record",
>  "name" : "TestRecord",
>  "namespace" : "Some.Demo.Space",
>  "fields" : [ {
>    "name" : "SomeNumber",
>    "type" : "long"
>  }, {
>    "name" : "SomeNumbers",
>    "type" : {
>      "type" : "array",
>      "items" : "int"
>    },
>    "default" : [ ]
>  }, {
>    "name" : "SomeMap",
>    "type" : {
>      "type" : "map",
>      "values" : "string"
>    },
>    "default" : { }
>  } ]
> }
>
> Thanks,
> Gerald



-- 

✉️ Oscar Westra van Holthe - Kind <opw...@apache.org>🌐
https://github.com/opwvhk/

Reply via email to