Max Gekk created SPARK-60743:
--------------------------------

             Summary: make_timestamp silently wraps an out-of-range seconds 
value
                 Key: SPARK-60743
                 URL: https://issues.apache.org/jira/browse/SPARK-60743
             Project: Spark
          Issue Type: Bug
          Components: SQL
    Affects Versions: 5.0.0
            Reporter: Max Gekk


make_timestamp and make_timestamp_ntz take their seconds argument as 
DECIMAL(16, 6), but DateTimeExpressionUtils.makeTimestampMicros narrows its 
unscaled micros to an int:

    // 8 digits cannot overflow Int.
    int totalMicros = (int) secAndMicros.toUnscaledLong();

The comment was true while the input was DECIMAL(8, 6). Since SPARK-36428 
widened it to DECIMAL(16, 6), the cast drops the high bits, and an out-of-range 
seconds value can wrap into a valid one. For example:

    SELECT make_timestamp_ntz(2020, 1, 1, 0, 0, 4324.967296);
    -- 2020-01-01 00:00:30

4324967296 micros wraps to 30000000, exactly 30 seconds, so the query returns a 
timestamp instead of null (ANSI off) or DATETIME_FIELD_OUT_OF_BOUNDS (ANSI on), 
which is what an out-of-range value such as 61 seconds gives. The same holds 
for make_timestamp, for both the interpreted and the generated code, and in 
both modes. Values that wrap to a negative number already fail, but their ANSI 
error reports the wrapped seconds.

Affects 3.2.0 and later.




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

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

Reply via email to