You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by tw...@apache.org on 2018/11/27 08:54:48 UTC
[flink] branch release-1.7 updated: [FLINK-10009][table] Fix the
casting problem for built-in TIMESTAMPADD.
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 <x1...@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")
}
// ----------------------------------------------------------------------------------------------