[ https://issues.apache.org/jira/browse/AVRO-1891?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16956389#comment-16956389 ]
Randi Thomas edited comment on AVRO-1891 at 10/21/19 9:26 PM: -------------------------------------------------------------- with 1.9.1 I am getting {code:java} Not in union ["null",{"type":"long","logicalType":"timestamp-millis"}]: 2019-10-18T03:20:49.777Z{code} Which upon debugging comes to GenericData.resolveUnion() having an empty conversionsByClass map. And following back up it looks like SpecificDatumWriter.writeField() checks for a logical type on the union itself instead of the union members. Upon not finding any logical types it then calls writeWithoutConversion(). That method resolves the union, but the logicalType conversion map is empty. I am not sure what to do about it yet. But logicalTypes in unions still seems broken at least in this code path. **update I have not gotten to the bug yet, but found that it applies to using ReflectDatumWriter(Schema). Using SpecificDatumWriter with the class or Schema constructor does not throw an exception when serializing the same datum. was (Author: randith): with 1.9.1 I am getting {code:java} Not in union ["null",{"type":"long","logicalType":"timestamp-millis"}]: 2019-10-18T03:20:49.777Z{code} Which upon debugging comes to GenericData.resolveUnion() having an empty conversionsByClass map. And following back up it looks like SpecificDatumWriter.writeField() checks for a logical type on the union itself instead of the union members. Upon not finding any logical types it then calls writeWithoutConversion(). That method resolves the union, but the logicalType conversion map is empty. I am not sure what to do about it yet. But logicalTypes in unions still seems broken at least in this code path. > Generated Java code fails with union containing logical type > ------------------------------------------------------------ > > Key: AVRO-1891 > URL: https://issues.apache.org/jira/browse/AVRO-1891 > Project: Apache Avro > Issue Type: Bug > Components: java, logical types > Affects Versions: 1.8.1 > Reporter: Ross Black > Priority: Blocker > Fix For: 1.8.3, 1.9.1 > > Attachments: AVRO-1891.patch, AVRO-1891.yshi.1.patch, > AVRO-1891.yshi.2.patch, AVRO-1891.yshi.3.patch, AVRO-1891.yshi.4.patch > > > Example schema: > {code} > { > "type": "record", > "name": "RecordV1", > "namespace": "org.brasslock.event", > "fields": [ > { "name": "first", "type": ["null", {"type": "long", > "logicalType":"timestamp-millis"}]} > ] > } > {code} > The avro compiler generates a field using the relevant joda class: > {code} > public org.joda.time.DateTime first > {code} > Running the following code to perform encoding: > {code} > final RecordV1 record = new > RecordV1(DateTime.parse("2016-07-29T10:15:30.00Z")); > final DatumWriter<RecordV1> datumWriter = new > SpecificDatumWriter<>(record.getSchema()); > final ByteArrayOutputStream stream = new ByteArrayOutputStream(8192); > final BinaryEncoder encoder = > EncoderFactory.get().directBinaryEncoder(stream, null); > datumWriter.write(record, encoder); > encoder.flush(); > final byte[] bytes = stream.toByteArray(); > {code} > fails with the exception stacktrace: > {code} > org.apache.avro.AvroRuntimeException: Unknown datum type > org.joda.time.DateTime: 2016-07-29T10:15:30.000Z > at org.apache.avro.generic.GenericData.getSchemaName(GenericData.java:741) > at > org.apache.avro.specific.SpecificData.getSchemaName(SpecificData.java:293) > at org.apache.avro.generic.GenericData.resolveUnion(GenericData.java:706) > at > org.apache.avro.generic.GenericDatumWriter.resolveUnion(GenericDatumWriter.java:192) > at > org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:110) > at > org.apache.avro.specific.SpecificDatumWriter.writeField(SpecificDatumWriter.java:87) > at > org.apache.avro.generic.GenericDatumWriter.writeRecord(GenericDatumWriter.java:143) > at > org.apache.avro.generic.GenericDatumWriter.writeWithoutConversion(GenericDatumWriter.java:105) > at > org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:73) > at > org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:60) > at > org.brasslock.avro.compiler.GeneratedRecordTest.shouldEncodeLogicalTypeInUnion(GeneratedRecordTest.java:82) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) > at > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) > at > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) > at > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) > at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) > at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) > at org.junit.runners.ParentRunner.run(ParentRunner.java:363) > at org.junit.runner.JUnitCore.run(JUnitCore.java:137) > at > com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) > at > com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) > at > com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:253) > at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) > {code} > The failure can be fixed by explicitly adding the relevant conversion(s) to > DatumWriter / SpecificData: > {code} > final RecordV1 record = new > RecordV1(DateTime.parse("2007-12-03T10:15:30.00Z")); > final SpecificData specificData = new SpecificData(); > specificData.addLogicalTypeConversion(new > TimeConversions.TimestampConversion()); > final DatumWriter<RecordV1> datumWriter = new > SpecificDatumWriter<>(record.getSchema(), specificData); > final ByteArrayOutputStream stream = new > ByteArrayOutputStream(AvroUtil.DEFAULT_BUFFER_SIZE); > final BinaryEncoder encoder = > EncoderFactory.get().directBinaryEncoder(stream, null); > datumWriter.write(record, encoder); > encoder.flush(); > final byte[] bytes = stream.toByteArray(); > {code} -- This message was sent by Atlassian Jira (v8.3.4#803005)