Sachin Goyal created AVRO-1650:
----------------------------------

             Summary: Avro deserialization fails depending on the value of 
integer/long fields
                 Key: AVRO-1650
                 URL: https://issues.apache.org/jira/browse/AVRO-1650
             Project: Avro
          Issue Type: Bug
            Reporter: Sachin Goyal


Here is a test that fails depending on the value of the zipCode integer.

{code}
public class TestBinaryDecoderSeparateSchema {

  @Test
  public void checkAvroWithoutEmbeddedSchema () throws Exception {

    log ("\n\n\nBeginning without-schema\n");
    Person datum = new Person();

    ReflectData rdata = ReflectData.AllowNull.get();
    Schema schema = rdata.getSchema(Person.class);

    // Write avro as binary
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DatumWriter<Person> dout = new ReflectDatumWriter<Person>(Person.class, 
rdata);
    Encoder encoder = EncoderFactory.get().binaryEncoder(baos, null);
    dout.write(datum, encoder);
    encoder.flush();
    byte[] bytes = baos.toByteArray();
    String binaryString = new String (bytes);
    log (binaryString);

    // Read avro binary string into GenericRecord
    BinaryDecoder decoder = 
DecoderFactory.get().binaryDecoder(binaryString.getBytes(), null);
    GenericDatumReader<GenericRecord> datumReader = new 
GenericDatumReader<GenericRecord> ();
    datumReader.setSchema(schema);
    GenericRecord record = datumReader.read(null, decoder);
    log ("Read zipCode = " + record.get("zipCode"));
  }

  @Test
  public void checkAvroWithEmbeddedSchema () throws Exception {

    log ("\n\n\nBeginning with-schema\n");
    Person datum = new Person();

    ReflectData rdata = ReflectData.AllowNull.get();
    Schema schema = rdata.getSchema(Person.class);

    // Write avro with embedded schema
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ReflectDatumWriter<Person> dout = new ReflectDatumWriter<Person> 
(Person.class, rdata);
    DataFileWriter<Person> fileWriter = new DataFileWriter<Person> (dout);
    fileWriter.create(schema, baos);
    fileWriter.append(datum);
    fileWriter.close();
    byte[] bytes = baos.toByteArray();
    String binaryString = new String (bytes);
    log (binaryString);

    // Read avro with embedded schema
    GenericDatumReader<GenericRecord> datumReader = new 
GenericDatumReader<GenericRecord> ();
    SeekableByteArrayInput avroInputStream = new SeekableByteArrayInput(bytes);
    DataFileReader<GenericRecord> fileReader =
            new DataFileReader<GenericRecord>(avroInputStream, datumReader);

    schema = fileReader.getSchema();
    GenericRecord record = null;
    List<GenericRecord> records = new ArrayList<GenericRecord> ();
    while (fileReader.hasNext())
        records.add (fileReader.next(record));

    log ("Read " + records.size() + " records");
   log ("Read zipCode = " + records.get(0).get("zipCode"));
  }

  private static class Person {
    Integer zipCode = 90900;
  }

  private static void log (String s) {
    System.out.println (s);
  }
}
{code}

\\
*Issues:*
# zipCode = 1, no exception but data zipCode is readWrong
# zipCode = 90900, exception in checkAvroWithoutEmbeddedSchema()
{color:red}
java.io.IOException: Invalid int encoding
at org.apache.avro.io.BinaryDecoder.readInt(BinaryDecoder.java:145)
at org.apache.avro.io.ValidatingDecoder.readInt(ValidatingDecoder.java:83)
at 
org.apache.avro.generic.GenericDatumReader.readInt(GenericDatumReader.java:444)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:159)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155)
at 
org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
at 
org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155)
at 
org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
at 
org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
at org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)
at 
org.apache.avro.io.TestBinaryDecoderSeparateSchema.checkAvroWithoutEmbeddedSchema(TestBinaryDecoderSeparateSchema.java:68)
{color}

\\
Am I even supposed to read/write like the way shown in 
checkAvroWithoutEmbeddedSchema()?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to