This is an automated email from the ASF dual-hosted git repository. twalthr pushed a commit to branch release-1.7 in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/release-1.7 by this push: new 461076b [FLINK-10009][table] Fix the casting problem for built-in TIMESTAMPADD. 461076b is described below commit 461076b3e276049f14ee0a398dd634f7e4425e1a Author: xuqianjin <x1q...@163.com> AuthorDate: Wed Nov 21 20:00:05 2018 +0800 [FLINK-10009][table] Fix the casting problem for built-in TIMESTAMPADD. This closes #7155 --- .../table/codegen/calls/ScalarOperators.scala | 11 +++- .../table/expressions/ScalarFunctionsTest.scala | 63 +++++++++++++++++++--- 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/ScalarOperators.scala b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/ScalarOperators.scala index 282b167..5a185da 100644 --- a/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/ScalarOperators.scala +++ b/flink-libraries/flink-table/src/main/scala/org/apache/flink/table/codegen/calls/ScalarOperators.scala @@ -839,8 +839,15 @@ object ScalarOperators { generateArithmeticOperator(op, nullCheck, l, left, right, config) case (SqlTimeTypeInfo.DATE, TimeIntervalTypeInfo.INTERVAL_MILLIS) => - generateOperatorIfNotNull(nullCheck, SqlTimeTypeInfo.DATE, left, right) { - (l, r) => s"$l $op ((int) ($r / ${MILLIS_PER_DAY}L))" + resultType match { + case SqlTimeTypeInfo.DATE => + generateOperatorIfNotNull(nullCheck, SqlTimeTypeInfo.DATE, left, right) { + (l, r) => s"$l $op ((int) ($r / ${MILLIS_PER_DAY}L))" + } + case SqlTimeTypeInfo.TIMESTAMP => + generateOperatorIfNotNull(nullCheck, SqlTimeTypeInfo.TIMESTAMP, left, right) { + (l, r) => s"$l * ${MILLIS_PER_DAY}L $op $r" + } } case (SqlTimeTypeInfo.DATE, TimeIntervalTypeInfo.INTERVAL_MONTHS) => diff --git a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala index 60cdda1..31c9b6c 100644 --- a/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala +++ b/flink-libraries/flink-table/src/test/scala/org/apache/flink/table/expressions/ScalarFunctionsTest.scala @@ -2703,16 +2703,67 @@ class ScalarFunctionsTest extends ScalarTypesTestBase { "null") testAllApis( - "2016-06-15".toDate + 1.day, - "'2016-06-15'.toDate + 1.day", - "TIMESTAMPADD(DAY, 1, DATE '2016-06-15')", - "2016-06-16") - - testAllApis( Null(Types.SQL_TIMESTAMP) + 3.months, "Null(SQL_TIMESTAMP) + 3.months", "TIMESTAMPADD(MONTH, 3, CAST(NULL AS TIMESTAMP))", "null") + + // TIMESTAMPADD with DATE returns a TIMESTAMP value for sub-day intervals. + testAllApis("2016-06-15".toDate + 1.month, + "'2016-06-15'.toDate + 1.month", + "timestampadd(MONTH, 1, date '2016-06-15')", + "2016-07-15") + + testAllApis("2016-06-15".toDate + 1.day, + "'2016-06-15'.toDate + 1.day", + "timestampadd(DAY, 1, date '2016-06-15')", + "2016-06-16") + + testAllApis("2016-06-15".toTimestamp - 1.hour, + "'2016-06-15'.toTimestamp - 1.hour", + "timestampadd(HOUR, -1, date '2016-06-15')", + "2016-06-14 23:00:00.0") + + testAllApis("2016-06-15".toTimestamp + 1.minute, + "'2016-06-15'.toTimestamp + 1.minute", + "timestampadd(MINUTE, 1, date '2016-06-15')", + "2016-06-15 00:01:00.0") + + testAllApis("2016-06-15".toTimestamp - 1.second, + "'2016-06-15'.toTimestamp - 1.second", + "timestampadd(SQL_TSI_SECOND, -1, date '2016-06-15')", + "2016-06-14 23:59:59.0") + + testAllApis("2016-06-15".toTimestamp + 1.second, + "'2016-06-15'.toTimestamp + 1.second", + "timestampadd(SECOND, 1, date '2016-06-15')", + "2016-06-15 00:00:01.0") + + testAllApis(Null(Types.SQL_TIMESTAMP) + 1.second, + "Null(SQL_TIMESTAMP) + 1.second", + "timestampadd(SECOND, 1, cast(null as date))", + "null") + + testAllApis(Null(Types.SQL_TIMESTAMP) + 1.day, + "Null(SQL_TIMESTAMP) + 1.day", + "timestampadd(DAY, 1, cast(null as date))", + "null") + + // Round to the last day of previous month + testAllApis("2016-05-31".toDate + 1.month, + "'2016-05-31'.toDate + 1.month", + "timestampadd(MONTH, 1, date '2016-05-31')", + "2016-06-30") + + testAllApis("2016-01-31".toDate + 5.month, + "'2016-01-31'.toDate + 5.month", + "timestampadd(MONTH, 5, date '2016-01-31')", + "2016-06-30") + + testAllApis("2016-03-31".toDate - 1.month, + "'2016-03-31'.toDate - 1.month", + "timestampadd(MONTH, -1, date '2016-03-31')", + "2016-02-29") } // ----------------------------------------------------------------------------------------------