[
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)