Ryan Skraba created AVRO-4215:
---------------------------------

             Summary: [Java] FastReader fails on some logical type conversions
                 Key: AVRO-4215
                 URL: https://issues.apache.org/jira/browse/AVRO-4215
             Project: Apache Avro
          Issue Type: Bug
          Components: java
    Affects Versions: 1.12.1, 1.13.0
            Reporter: Ryan Skraba


The property org.apache.avro.fastread has been set to **true** by default, but 
causes a behaviour change when a schema is evolved with a union and logical 
type:

{code}
    @Test
    public void testWidenUnionIntToDate() {
        GenericData model = SpecificData.get().setFastReaderEnabled(true);

        // ["int"]
        final Schema writeSchema = SchemaBuilder.unionOf().intType().endUnion();
        final byte[] serialized;
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
            Encoder encoder = EncoderFactory.get().binaryEncoder(baos, null);
            DatumWriter<Integer> w = new GenericDatumWriter<>(writeSchema, 
model);
            w.write(1000, encoder);
            encoder.flush();
            serialized= baos.toByteArray();
        } catch (IOException ioe) {
            throw new RuntimeException((ioe));
        }

        // {"type":"int","logicalType":"date"}
        final Schema readSchema = 
LogicalTypes.date().addToSchema(Schema.create(Schema.Type.INT));
        final Object deserialized;
        try (ByteArrayInputStream bais = new ByteArrayInputStream(serialized)) {
            Decoder decoder = DecoderFactory.get().directBinaryDecoder(bais, 
null);
            DatumReader<?> r = new GenericDatumReader<>(writeSchema,  
readSchema, model);
            deserialized = r.read(null, decoder);
        } catch (IOException ioe) {
            throw new RuntimeException((ioe));
        }

        assertThat(deserialized, hasToString(containsString("1972-09-27")));
    }
{code}

Fails with:

{code}
org.apache.avro.AvroRuntimeException: Cannot convert 1972-09-27:LocalDate: 
expected generic type

        at 
org.apache.avro.Conversions.convertToLogicalType(Conversions.java:326)
        at 
org.apache.avro.io.FastReaderBuilder.lambda$applyConversions$11(FastReaderBuilder.java:263)
        at 
org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:150)
        at 
com.skraba.avro.enchiridion.core.evolution.EvolveWidenPrimitivesWithLogicalTypesTest.testForJira(EvolveWidenPrimitivesWithLogicalTypesTest.java:277)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
Caused by: java.lang.ClassCastException: class java.time.LocalDate cannot be 
cast to class java.lang.Integer (java.time.LocalDate and java.lang.Integer are 
in module java.base of loader 'bootstrap')
        at 
org.apache.avro.Conversions.convertToLogicalType(Conversions.java:313)
        ... 6 more
{code}

If you setFastReaderEnabled(false) in this test, the read works.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to