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/