[ https://issues.apache.org/jira/browse/AVRO-2872?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17293807#comment-17293807 ]
Ryan Skraba commented on AVRO-2872: ----------------------------------- I think most actual use cases of UNION are to make a field nullable, so it should be alright to apply your fix if and only if the UNION contains a logical type plus NULL. Other cases should be rare, so if we maintain the existing behaviour for UNIONs with three branches, or two logical types or some other non-obvious conversion, then we are (at worst) _equally_ buggy as we are today for those cases. That's why I'm curious about the symptoms we're seeing today! I would expect the first three fields in the following record to find the Converter correctly -- today only the first one does! {code} { "type": "record", "name": "Messages", "fields": [ { "name": "timestamp", "type": { "type": "long", "logicalType": "timestamp-millis" } }, { "name": "unionWithOnlyTimestamp", "type": [ { "type": "long", "logicalType": "timestamp-millis" } ] }, { "name": "nullableTimestamp", "type": [ "null", { "type": "long", "logicalType": "timestamp-millis" } ] }, { "name": "dateOrTimestamp", "type": [ { "type": "int", "logicalType": "date" }, { "type": "long", "logicalType": "timestamp-millis" } ] }] } {code} > 'conversions' array is not populated for Avro Union Logicaltype fields > ----------------------------------------------------------------------- > > Key: AVRO-2872 > URL: https://issues.apache.org/jira/browse/AVRO-2872 > Project: Apache Avro > Issue Type: Bug > Components: logical types > Affects Versions: 1.9.2 > Environment: * Apache Avro Version [1.9.2] > * Java Version [11] > Reporter: Pádraig de Buitléar > Priority: Minor > > Steps to reproduce : > # Using the maven/gradle plugin generate code with the following avsc: > > {code:java} > { > "type": "record", > "name": "Messages", > "namespace": "com.somedomain", > "fields": [ > { > "name": "start", > "type": { > "type": "long", > "logicalType": "timestamp-millis" > } > }, > { > "name": "optional_date", > "type": [ > "null", > { > "type": "long", > "logicalType": "timestamp-millis" > } > ], > "default": null > } > ] > }{code} > > *Actual behavior* > In the generated code, the return types of the getter methods for both > fields are correct, however the conversions array only has an element for the > field which isn't a union. > > {code:java} > private static final org.apache.avro.Conversion<?>[] conversions = > new org.apache.avro.Conversion<?>[] { > new org.apache.avro.data.TimeConversions.TimestampMillisConversion(), > null, > null > }; > {code} > > *Expected output:* > Based on the above avsc the following is expected. > > {code:java} > private static final org.apache.avro.Conversion[] conversions = > new org.apache.avro.Conversion[] { > new org.apache.avro.data.TimeConversions.TimestampMillisConversion(), > new org.apache.avro.data.TimeConversions.TimestampMillisConversion(), > null > }; > {code} > > > -- This message was sent by Atlassian Jira (v8.3.4#803005)