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

Max Gekk resolved SPARK-57490.
------------------------------
    Fix Version/s: 4.3.0
       Resolution: Fixed

Issue resolved by pull request 56544
[https://github.com/apache/spark/pull/56544]

> Support CAST between nanosecond timestamp types of different precision
> ----------------------------------------------------------------------
>
>                 Key: SPARK-57490
>                 URL: https://issues.apache.org/jira/browse/SPARK-57490
>             Project: Spark
>          Issue Type: Sub-task
>          Components: SQL
>    Affects Versions: 4.3.0
>            Reporter: Max Gekk
>            Assignee: Max Gekk
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 4.3.0
>
>
> h2. Summary
> Add support for {{CAST}} between same-family nanosecond-precision timestamp 
> types of
> different precision:
> * {{TIMESTAMP_NTZ(p1)}} <-> {{TIMESTAMP_NTZ(p2)}}
> * {{TIMESTAMP_LTZ(q1)}} <-> {{TIMESTAMP_LTZ(q2)}}
> where {{p1, p2, q1, q2}} are in {{[7, 9]}}.
> h2. Background
> The nanosecond-capable timestamp types {{TIMESTAMP_NTZ(p)}} and 
> {{TIMESTAMP_LTZ(p)}}
> (p in [7, 9]) are gated behind {{spark.sql.timestampNanosTypes.enabled}}. 
> Casts between
> these types and their microsecond counterparts ({{TIMESTAMP_NTZ}} / 
> {{TIMESTAMP}}), as
> well as to/from {{DATE}} and {{STRING}}, are already supported. However, 
> casting between
> two nanosecond timestamps of the *same family but different precision* was 
> not allowed:
> such a cast is currently absent from {{Cast.canCast}} / {{Cast.canAnsiCast}} 
> and fails
> type checking.
> h2. Semantics
> Both {{TimestampNTZNanosType}} and {{TimestampLTZNanosType}} share the same 
> physical
> value {{TimestampNanosVal(epochMicros, nanosWithinMicro)}} (nanosWithinMicro 
> in [0, 999]).
> A same-family cross-precision cast keeps {{epochMicros}} unchanged and only 
> adjusts the
> sub-microsecond component:
> * *Widening* (target precision >= source precision): lossless; the value is 
> unchanged.
> * *Narrowing* (target precision < source precision): floors 
> {{nanosWithinMicro}} toward
>   the past to the target precision step (drop the lowest {{9 - precision}} 
> sub-microsecond
>   digits), consistent with the existing nanos -> micros narrowing rule.
> No time-zone conversion is involved (the conversion stays within one family).
> h2. Store-assignment / up-cast contract
> Following the established micros <-> nanos precedent:
> * Widening (lossless) is allowed as an ANSI store assignment but is not an 
> up-cast.
> * Narrowing (lossy) is explicit-CAST only (rejected by both up-cast and store 
> assignment).
> * Equal precision is the identity cast.
> h2. Scope
> * In scope: same-family cross-precision casts (NTZ<->NTZ, LTZ<->LTZ).
> * Out of scope: cross-family precision casts (e.g. {{TIMESTAMP_NTZ(9)}} ->
>   {{TIMESTAMP_LTZ(7)}}) and implicit type coercion / 
> {{findWiderDateTimeType}} widening
>   for mixed-precision nanos operands (UNION, COALESCE, IF). These can be 
> handled as
>   follow-ups.



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to