diff --git a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/calcite/FlinkTypeFactory.scala b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/calcite/FlinkTypeFactory.scala index e8e8883329459..f8fe96a68afb2 100644 --- a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/calcite/FlinkTypeFactory.scala +++ b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/calcite/FlinkTypeFactory.scala @@ -648,9 +648,11 @@ object FlinkTypeFactory { case typeName if YEAR_INTERVAL_TYPES.contains(typeName) => DataTypes.INTERVAL(DataTypes.MONTH).getLogicalType case typeName if DAY_INTERVAL_TYPES.contains(typeName) => - if (relDataType.getPrecision > 3) { + // In INTERVAL getScale tells about fractional second precision + // See org.apache.calcite.sql.SqlIntervalQualifier + if (relDataType.getScale > 3) { throw new TableException( - s"DAY_INTERVAL_TYPES precision is not supported: ${relDataType.getPrecision}") + s"DAY_INTERVAL_TYPES precision is not supported: ${relDataType.getScale}") } DataTypes.INTERVAL(DataTypes.SECOND(3)).getLogicalType diff --git a/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/validation/ScalarFunctionsValidationTest.scala b/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/validation/ScalarFunctionsValidationTest.scala index 4a604ae733c41..ea45ed31cd4e2 100644 --- a/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/validation/ScalarFunctionsValidationTest.scala +++ b/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/validation/ScalarFunctionsValidationTest.scala @@ -119,6 +119,19 @@ class ScalarFunctionsValidationTest extends ScalarTypesTestBase { () => testSqlApi("TIMESTAMPADD(YEAR, 1.0, timestamp '2016-02-24 12:42:25')", "2016-06-16")) } + @Test + def testTimestampAddWithUnsupportedPrecision(): Unit = { + assertThatExceptionOfType(classOf[TableException]) + .isThrownBy( + () => + testSqlApi("TIMESTAMPADD(MICROSECOND, 1, timestamp '2016-02-24 12:42:25')", "2016-06-16")) + + assertThatExceptionOfType(classOf[TableException]) + .isThrownBy( + () => + testSqlApi("TIMESTAMPADD(NANOSECOND, 1, timestamp '2016-02-24 12:42:25')", "2016-06-16")) + } + // ---------------------------------------------------------------------------------------------- // Sub-query functions // ----------------------------------------------------------------------------------------------