This is an automated email from the ASF dual-hosted git repository. jark pushed a commit to branch release-1.9 in repository https://gitbox.apache.org/repos/asf/flink.git
commit d61e6069985e20912443406c0492a169443b4c06 Author: Jark Wu <imj...@gmail.com> AuthorDate: Thu Aug 8 10:21:06 2019 +0800 [FLINK-13561][table-planner-blink] Fix wrong result of TIMESTAMPADD(HOUR, interval, DATE) TIMESTAMPADD(HOUR, -1, DATE '2016-06-15') will get a wrong result of "2016-06-15", which should be "2016-06-14 23:00:00.000". This is a cherry-pick of FLINK-10009 to blink planner. --- .../planner/codegen/calls/ScalarOperatorGens.scala | 11 ++++-- .../planner/expressions/ScalarFunctionsTest.scala | 42 ++++++++++------------ 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala b/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala index e992a1b..5cc5412 100644 --- a/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala +++ b/flink-table/flink-table-planner-blink/src/main/scala/org/apache/flink/table/planner/codegen/calls/ScalarOperatorGens.scala @@ -168,8 +168,15 @@ object ScalarOperatorGens { generateBinaryArithmeticOperator(ctx, op, left.resultType, left, right) case (DATE, INTERVAL_DAY_TIME) => - generateOperatorIfNotNull(ctx, new DateType(), left, right) { - (l, r) => s"$l $op ((int) ($r / ${MILLIS_PER_DAY}L))" + resultType.getTypeRoot match { + case DATE => + generateOperatorIfNotNull(ctx, new DateType(), left, right) { + (l, r) => s"$l $op ((int) ($r / ${MILLIS_PER_DAY}L))" + } + case TIMESTAMP_WITHOUT_TIME_ZONE => + generateOperatorIfNotNull(ctx, new TimestampType(), left, right) { + (l, r) => s"($l * ${MILLIS_PER_DAY}L) $op $r" + } } case (DATE, INTERVAL_YEAR_MONTH) => diff --git a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala index 93de62e..7c01910 100644 --- a/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala +++ b/flink-table/flink-table-planner-blink/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala @@ -24,9 +24,6 @@ import org.apache.flink.table.expressions.{Expression, ExpressionParser, TimeInt import org.apache.flink.table.planner.expressions.utils.ScalarTypesTestBase import org.junit.Test -import java.sql.Timestamp -import java.time.ZoneId - class ScalarFunctionsTest extends ScalarTypesTestBase { // ---------------------------------------------------------------------------------------------- @@ -3474,26 +3471,25 @@ class ScalarFunctionsTest extends ScalarTypesTestBase { "timestampadd(DAY, 1, date '2016-06-15')", "2016-06-16") - // TODO support '2016-06-15'.toTimestamp -// 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("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.000") + + 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.000") + + 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.000") + + 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.000") testAllApis(nullOf(Types.SQL_TIMESTAMP) + 1.second, "nullOf(SQL_TIMESTAMP) + 1.second",