Max Gekk created SPARK-57832:
--------------------------------

             Summary: Support timestamp - timestamp subtraction for 
nanosecond-precision timestamps (microsecond-precision interval result)
                 Key: SPARK-57832
                 URL: https://issues.apache.org/jira/browse/SPARK-57832
             Project: Spark
          Issue Type: Sub-task
          Components: SQL
    Affects Versions: 4.3.0
            Reporter: Max Gekk


This sub-task is part of the umbrella SPARK-56822 (timestamps with nanosecond 
precision).

h2. Problem
{{SubtractTimestamps}} (datetimeExpressions.scala ~L4040-4090) types both 
operands as {{AnyTimestampType}} (microsecond only) and evaluates on {{Long}} 
micros, returning {{DayTimeIntervalType()}} (or legacy 
{{CalendarIntervalType}}). Subtracting two nanosecond timestamps ({{ts_nanos - 
ts_nanos}}) currently fails analysis. The SPIP had deferred this because the 
day-time interval result type has only microsecond precision; per decision we 
now support it and accept the microsecond-precision result.

h2. Goal
Allow {{TIMESTAMP_NTZ(p) - TIMESTAMP_NTZ(p)}} and {{TIMESTAMP_LTZ(p) - 
TIMESTAMP_LTZ(p)}} (and microsecond/nanosecond mixed operands via existing 
widening, SPARK-57454), returning a {{DayTimeIntervalType}} computed from the 
two {{TimestampNanosVal}} values. The result is microsecond-precision: the 
sub-microsecond remainder difference is dropped, with the rounding/truncation 
rule documented (default: truncate toward the microsecond grid, i.e. compute 
from epoch micros).

h2. Scope
Extend {{SubtractTimestamps.inputTypes}} to accept {{AnyTimestampNanoType}}; 
add a {{TimestampNanosVal}} eval/codegen branch computing {{leftMicros - 
rightMicros}} (documented handling of the {{nanosWithinMicro}} remainder); keep 
the result type {{DayTimeIntervalType()}} / legacy {{CalendarIntervalType}} 
unchanged; ensure mixed-precision operands resolve through type coercion. Wire 
the nanosecond cases into the subtraction path in 
{{BinaryArithmeticWithDatetimeResolver}} if needed.

h2. Non-goals
No new sub-microsecond interval type; the day-time interval remains 
microsecond-precision (this is the accepted precision loss).

h2. Acceptance criteria
* {{ts_nanos - ts_nanos}} returns a {{DayTimeIntervalType}} value equal to the 
microsecond-grid difference; NTZ/LTZ zone semantics match the microsecond 
behavior; mixed microsecond/nanosecond operands work; interpreted + codegen 
tested.

h2. Testing
{{DateExpressionsSuite}}; {{timestamp-ntz-nanos.sql}} / 
{{timestamp-ltz-nanos.sql}} golden files.

h2. Dependencies
None hard - coordinate with the overflow/range-hardening sub-task; mixed 
microsecond/nanosecond operands via resolved SPARK-57454.




--
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