From 8613d3acdffef82092b5ca47218eef4b4f27a190 Mon Sep 17 00:00:00 2001 From: Sergey Nuyanzin Date: Mon, 20 Apr 2026 14:43:31 +0200 Subject: [PATCH 1/2] [FLINK-39498][table] Day time interval with unsupported precision should fail in planning time rather than code gen --- .../table/planner/calcite/FlinkTypeFactory.scala | 6 ++++-- .../validation/ScalarFunctionsValidationTest.scala | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) 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..630500284a74c 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,17 @@ 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 // ---------------------------------------------------------------------------------------------- From 7bfb46568ac686045a3a93b6446ca3395fca8ad3 Mon Sep 17 00:00:00 2001 From: Sergey Nuyanzin Date: Mon, 20 Apr 2026 16:43:01 +0200 Subject: [PATCH 2/2] Apply spotless --- .../validation/ScalarFunctionsValidationTest.scala | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 630500284a74c..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 @@ -123,11 +123,13 @@ class ScalarFunctionsValidationTest extends ScalarTypesTestBase { def testTimestampAddWithUnsupportedPrecision(): Unit = { assertThatExceptionOfType(classOf[TableException]) .isThrownBy( - () => testSqlApi("TIMESTAMPADD(MICROSECOND, 1, timestamp '2016-02-24 12:42:25')", "2016-06-16")) + () => + 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")) + () => + testSqlApi("TIMESTAMPADD(NANOSECOND, 1, timestamp '2016-02-24 12:42:25')", "2016-06-16")) } // ----------------------------------------------------------------------------------------------