sepuri sai krishna created FLINK-40897:
------------------------------------------

             Summary: TIMESTAMPDIFF returns wrong results and fails with 
scala.MatchError for TIME operands
                 Key: FLINK-40897
                 URL: https://issues.apache.org/jira/browse/FLINK-40897
             Project: Flink
          Issue Type: Bug
          Components: Table SQL / Planner
    Affects Versions: 2.3.0, 2.4.0
            Reporter: sepuri sai krishna


{{TIMESTAMPDIFF}} misbehaves in two ways when one or both operands are
{{TIME}}. Both are reproducible on {{master}} and on released 2.3.0.

h3. 1. Wrong results for year-month units between two TIME values

{code:sql}
SELECT TIMESTAMPDIFF(YEAR,    TIME '12:00:00', TIME '13:00:00'); -- returns 9856
SELECT TIMESTAMPDIFF(QUARTER, TIME '12:00:00', TIME '13:00:00'); -- returns 
39425
SELECT TIMESTAMPDIFF(MONTH,   TIME '12:00:00', TIME '13:00:00'); -- returns 
118277
{code}

All three should be {{0}}: the two values are one hour apart.

Flink contradicts itself here. Casting the second operand to {{TIMESTAMP}} does
not change the meaning of the query, but it does change the answer:

|| Expression || Returns ||
| {{TIMESTAMPDIFF(MONTH, TIME '12:00:00', TIME '13:00:00')}} | {{118277}} |
| {{TIMESTAMPDIFF(MONTH, TIME '12:00:00', CAST(TIME '13:00:00' AS TIMESTAMP))}} 
| {{0}} |
| {{TIMESTAMPDIFF(YEAR, TIME '12:00:00', CAST(TIME '13:00:00' AS TIMESTAMP))}} 
| {{0}} |

The day-time units on the same pair are correct
({{TIMESTAMPDIFF(SECOND, TIME '12:00:00', TIME '13:00:00')}} returns {{3600}}),
so on {{master}} only the {{TIME}}/{{TIME}} year-month combination is affected.

On 2.3.0 the {{TIME}}/{{DATE}} pairs are wrong as well:

|| Expression || 2.3.0 || master || Expected ||
| {{TIMESTAMPDIFF(MONTH, TIME '12:00:00', DATE '2021-03-31')}} | {{-1418716}} | 
{{614}} | {{614}} |
| {{TIMESTAMPDIFF(MONTH, DATE '2021-03-31', TIME '12:00:00')}} | {{1418716}} | 
{{-614}} | {{-614}} |

h3. 2. scala.MatchError for day-time units mixing TIME with DATE or TIMESTAMP

{code:sql}
SELECT TIMESTAMPDIFF(DAY, TIME '12:00:00', TIMESTAMP '2021-03-31 02:00:00');
SELECT TIMESTAMPDIFF(DAY, TIMESTAMP '2021-03-31 02:00:00', TIME '12:00:00');
SELECT TIMESTAMPDIFF(HOUR, TIME '12:00:00', DATE '2021-03-31');
SELECT TIMESTAMPDIFF(DAY, DATE '2021-03-31', TIME '12:00:00');
{code}

{noformat}
scala.MatchError: (TIMESTAMP_WITHOUT_TIME_ZONE,TIME_WITHOUT_TIME_ZONE) (of 
class scala.Tuple2)
        at 
org.apache.flink.table.planner.codegen.calls.ScalarOperatorGens$.$anonfun$generateTemporalPlusMinus$9(ScalarOperatorGens.scala:261)
        at 
org.apache.flink.table.planner.codegen.calls.ScalarOperatorGens$.$anonfun$generateOperatorIfNotNull$1(ScalarOperatorGens.scala:2053)
        at 
org.apache.flink.table.planner.codegen.GenerateUtils$.generateCallIfArgsNotNull(GenerateUtils.scala:59)
        at 
org.apache.flink.table.planner.codegen.calls.ScalarOperatorGens$.generateTemporalPlusMinus(ScalarOperatorGens.scala:260)
{noformat}

Every day-time unit ({{DAY}}, {{HOUR}}, {{MINUTE}}, {{SECOND}}, {{WEEK}}) fails
for these operand pairs, in both orders. On {{master}} the year-month units on
the same pairs succeed and return correct values; on 2.3.0 see the table above.

h3. Impact

Symptom 1 is silent: a wrong number is returned with nothing logged, so a query
that groups or filters on the result produces incorrect output with no
indication of a problem.

Symptom 2 is a plan-time failure, so the query cannot run at all.

h3. Scope

Verified against constant-folded literals and against real table columns, on
{{master}} and on the released 2.3.0 jars.

Related: FLINK-39385 fixed the same {{MatchError}} for the {{TIME}}/{{TIME}}
pair in 2.3.0. The pairs above were not covered.



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

Reply via email to