[ 
https://issues.apache.org/jira/browse/AVRO-4215?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ASF GitHub Bot updated AVRO-4215:
---------------------------------
    Labels: pull-request-available  (was: )

> [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
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> 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
(v10.3.26#10030026)

Reply via email to