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)