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

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

> Allow CAST from a VARIANT timestamp to the other temporal types
> ---------------------------------------------------------------
>
>                 Key: FLINK-41281
>                 URL: https://issues.apache.org/jira/browse/FLINK-41281
>             Project: Flink
>          Issue Type: Improvement
>          Components: Table SQL / API
>            Reporter: Ramin Gharib
>            Assignee: Ramin Gharib
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 2.5.0
>
>
> h3. Problem
> A cast from {{VARIANT}} accepts a timestamp only for its own type. A variant 
> {{TIMESTAMP_LTZ}} casts to {{TIMESTAMP_LTZ(p)}} and fails for every other 
> temporal target. With the session time zone {{Europe/Berlin}} and 
> {{v_timestamp_ltz = CAST(TO_TIMESTAMP_LTZ(1704151800123, 3) AS VARIANT)}}, 
> the instant {{2024-01-01 23:30:00.123Z}}:
> ||Query||Today||Proposed||
> |{{CAST(v_timestamp_ltz AS TIMESTAMP(3))}}|fails with {{Cannot cast a VARIANT 
> TIMESTAMP_LTZ value to TIMESTAMP(3). A VARIANT cast does not change the type 
> of the stored value, so cast it to its own type first and then convert with a 
> regular cast.}}|{{2024-01-02 00:30:00.123}}|
> |{{CAST(v_timestamp_ltz AS DATE)}}|fails with {{VariantTypeException: 
> Expected type DATE but got TIMESTAMP_LTZ}}|{{2024-01-02}}|
> |{{CAST(v_timestamp_ltz AS TIME(3))}}|fails with {{Cannot cast a VARIANT 
> TIMESTAMP_LTZ value to TIME(3). ...}}|{{00:30:00.123}}|
> Today a user has to know the stored kind and nest two casts, such as 
> {{CAST(CAST(v AS TIMESTAMP_LTZ(3)) AS DATE)}}. A column that mixes 
> {{TIMESTAMP}} and {{TIMESTAMP_LTZ}} values needs a chain of {{TRY_CAST}} 
> calls.
> h3. Proposal
> A stored {{TIMESTAMP}} or {{TIMESTAMP_LTZ}}, including the nanosecond kinds, 
> casts to the other temporal types the same way a regular cast from that type 
> does, using the session time zone.
> ||Stored kind||Today||Adds||
> |{{TIMESTAMP}}, {{TIMESTAMP_NS}}|{{TIMESTAMP(p)}}|{{TIMESTAMP_LTZ(p)}}, 
> {{DATE}}, {{TIME(p)}}|
> |{{TIMESTAMP_LTZ}}, 
> {{TIMESTAMP_LTZ_NS}}|{{TIMESTAMP_LTZ(p)}}|{{TIMESTAMP(p)}}, {{DATE}}, 
> {{TIME(p)}}|
> |{{DATE}}|{{DATE}}|nothing|
> |{{TIME}}|{{TIME(p)}}|nothing|
> * {{DATE}} and {{TIME}} stay own-type only. Widening them would add something 
> the value never had: a time of day, a date, or a zone offset. The regular 
> {{TIME}} to {{TIMESTAMP}} cast shows the problem, since it fills in 
> 1970-01-01 (FLINK-24423).
> * A {{DATE}} target that gets any other kind fails with the standard VARIANT 
> cast message instead of the raw {{VariantTypeException}}.
> * {{VARIANT_GET}} and {{TRY_VARIANT_GET}} follow the same rules.
> * Values are read through {{java.time}}, not the millisecond helpers of the 
> regular casts, which are wrong before 1970 (FLINK-41280).
> * The VARIANT section of {{data-types.md}} is updated.
> Trade-off: casts to {{DATE}} and {{TIME}} drop part of the timestamp, while 
> the numeric rule rejects {{7.2}} to {{INT}}. Cutting off fractional seconds 
> beyond the target precision is already allowed, and Spark, Snowflake and 
> Trino apply their regular cast rules here.
> h3. Tests
> * The queries above, for {{TIMESTAMP}} and {{TIMESTAMP_LTZ}} with the micro 
> and nanosecond kinds, in two session time zones.
> * A value before 1970 to {{DATE}} and {{TIME}}.
> * Stored {{DATE}} and {{TIME}} still fail for the other targets, and 
> {{TRY_CAST}} returns NULL.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to