[
https://issues.apache.org/jira/browse/AVRO-2490?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ryan Skraba resolved AVRO-2490.
-------------------------------
Fix Version/s: (was: 1.8.2)
(was: 1.9.0)
Resolution: Not A Bug
> Unable to add field to existing avro schema
> -------------------------------------------
>
> Key: AVRO-2490
> URL: https://issues.apache.org/jira/browse/AVRO-2490
> Project: Apache Avro
> Issue Type: Bug
> Reporter: Martin Mucha
> Priority: Major
>
> As described in
> [https://docs.oracle.com/database/nosql-12.1.3.4/GettingStartedGuide/schemaevolution.html#changeschema-rules]
>
> I should be able to extend AVRO schema by adding optional and(or?)
> default-having field. If I do that though, deserialization fails for me. It
> happens for version 1.8.2 and 1.9.0 as well.
>
> Some cases:
> A) If I add new field defined as:
> {code:java}
> { "name": "newColumn", "type": ["null","string"], "default": null}{code}
> deserialization will fail with:
>
> {code:java}
> Caused by: java.lang.ArrayIndexOutOfBoundsException: 5 at
> org.apache.avro.io.parsing.Symbol$Alternative.getSymbol(Symbol.java:424) at
> org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290) at
> org.apache.avro.io.parsing.Parser.advance(Parser.java:88) at
> org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267) at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
> at
> org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:232)
> at
> org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
> at
> org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:232)
> at
> org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:145)
> at
> tech.allegro.schema.json2avro.converter.JsonAvroConverter.convertToJson(JsonAvroConverter.java:83){code}
>
> if I add new field defined as:
> {code:java}
> { "name": "newColumn", "type": "string", "default": ""}{code}
> {{or}}
> {code:java}
> { "name": "newColumn", "type": "string", "default": "incorrect"}{code}
> (assuming I will fix it later in app)
> deserialization will fail with:
>
> {code:java}
> Caused by: org.apache.avro.AvroRuntimeException: Malformed data. Length is
> negative: -1 at
> org.apache.avro.io.BinaryDecoder.doReadBytes(BinaryDecoder.java:336) at
> org.apache.avro.io.BinaryDecoder.readString(BinaryDecoder.java:263) at
> org.apache.avro.io.ResolvingDecoder.readString(ResolvingDecoder.java:201) at
> org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:422)
> at
> org.apache.avro.generic.GenericDatumReader.readString(GenericDatumReader.java:414)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:181)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
> at
> org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:232)
> at
> org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:179)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
> at
> org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:232)
> at
> org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:222)
> at
> org.apache.avro.generic.GenericDatumReader.readWithoutConversion(GenericDatumReader.java:175)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:153)
> at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:145)
> at
> tech.allegro.schema.json2avro.converter.JsonAvroConverter.convertToJson(JsonAvroConverter.java:83){code}
>
> {{what code does fail like that(that ± content of method convertToJson in
> JsonAvroConverter as seen in stacktrace.):}}
> {code:java}
> BinaryDecoder binaryDecoder = DecoderFactory.get().binaryDecoder(avro,
> (BinaryDecoder)null);
> GenericRecord record = (GenericRecord)(new
> GenericDatumReader(schema)).read((Object)null, binaryDecoder);{code}
> the second line produces given errors. Without new column added,
> deserialization works.
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)