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

ASF GitHub Bot updated FLINK-39789:
-----------------------------------
    Labels: pull-request-available  (was: )

> AvroSchemaConverter.convertToDataType(String) ignores local-timestamp-* and 
> timestamp-nanos logical types, silently maps to BIGINT
> ----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: FLINK-39789
>                 URL: https://issues.apache.org/jira/browse/FLINK-39789
>             Project: Flink
>          Issue Type: Bug
>    Affects Versions: 2.1.0
>            Reporter: Shekhar Prasad Rajak
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 2.2.2
>
>
> AvroSchemaConverter.convertToDataType(String avroSchemaString) is the only 
> public Avro→Flink type-mapping entry point. It silently drops the logical 
> type for several Avro long logical types and returns BIGINT, which then 
> produces a Flink RowType that is incompatible with TimestampData values at 
> runtime.
> The internal two-arg convertToDataType(Schema, boolean) does contain branches 
> for local-timestamp-millis and local-timestamp-micros, but they are reached 
> only when the boolean is false. The single-arg public API hard-codes the 
> boolean to true, so those branches are unreachable from any public API. There 
> are also no branches at all for timestamp-nanos or local-timestamp-nanos.
> String avro =
>     "{ \"type\": \"record\", \"name\": \"R\", \"fields\": ["
>         + "{ \"name\": \"ts\", \"type\": { \"type\": \"long\","
>         + "    \"logicalType\": \"local-timestamp-micros\" } } ] }";
> DataType dt = AvroSchemaConverter.convertToDataType(avro);
> System.out.println(dt);
> // Current : ROW<`ts` BIGINT NOT NULL> NOT NULL
> // Expected: ROW<`ts` TIMESTAMP(6) NOT NULL> NOT NULL
> Because of that : 
> ```
> RowType row = (RowType) 
> AvroSchemaConverter.convertToDataType(avro).getLogicalType();
> RowData.FieldGetter getter = RowData.createFieldGetter(row.getTypeAt(0), 0);
> GenericRowData data = new GenericRowData(1);
> data.setField(0, TimestampData.fromEpochMillis(0L));   // semantically 
> correct value
> getter.getFieldOrNull(data);
> // java.lang.ClassCastException:
> //   class org.apache.flink.table.data.TimestampData cannot be cast to class 
> java.lang.Long
> ```



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to