Exception when attempting to read modified schema containing deleted field
--------------------------------------------------------------------------
Key: AVRO-891
URL: https://issues.apache.org/jira/browse/AVRO-891
Project: Avro
Issue Type: Bug
Components: java
Affects Versions: 1.5.4
Environment: OSX 10.7
Reporter: Alex Holmes
An AvroRuntimeException exception is thrown when attempting to read an Avro
file serialized with an older version of a schema containing a field which has
been subsequently removed in the newer schema.
*Exception*
{code}
Exception in thread "main" org.apache.avro.AvroRuntimeException: Bad index
at Record.put(Unknown Source)
at org.apache.avro.generic.GenericData.setField(GenericData.java:463)
at
org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:166)
at
org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:138)
at
org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:129)
at org.apache.avro.file.DataFileStream.next(DataFileStream.java:233)
at org.apache.avro.file.DataFileStream.next(DataFileStream.java:220)
at Read.readFromAvro(Unknown Source)
at Read.main(Unknown Source)
{code}
*Steps to reproduce*
# Generate code for schema v1 and v2
# Write an Avro file with the v1 code-generated Record class using the
DataFileWriter and SpecificDatumWriter
# (informational only) Read the Avro file using the v1 code-generated Record
class using DataFileStream and SpecificDatumReader (output follows)
{code}
Record@2ec791b9[name=r1,id=1]
Record@bd86fd3[name=r2,id=2]
{code}
# Read the Avro file using the v2 code-generated Record class using
DataFileStream and SpecificDatumReader
*Schema details*
v1 schema:
{code}
{"name": "Record", "type": "record",
"fields": [
{"name": "name", "type": "string"},
{"name": "id", "type": "int"}
]
}
{code}
v2 schema:
{code}
{"name": "Record", "type": "record",
"fields": [
{"name": "name", "type": "string"}
]
}
{code}
*Write code*
{code}
public static Record createRecord(String name, int id) {
Record record = new Record();
record.name = name;
record.id = id;
return record;
}
public static void writeToAvro(OutputStream outputStream)
throws IOException {
DataFileWriter<Record> writer =
new DataFileWriter<Record>(new SpecificDatumWriter<Record>());
writer.create(Record.SCHEMA$, outputStream);
writer.append(createRecord("r1", 1));
writer.append(createRecord("r2", 2));
writer.close();
outputStream.close();
}
{code}
*Read code*
{code}
public static void readFromAvro(InputStream is) throws IOException {
DataFileStream<Record> reader = new DataFileStream<Record>(
is, new SpecificDatumReader<Record>());
for (Record a : reader) {
System.out.println(ToStringBuilder.reflectionToString(a));
}
IOUtils.cleanup(null, is);
IOUtils.cleanup(null, reader);
}
{code}
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira