diff --git a/docs/content/docs/dev/table/functions/systemFunctions.md b/docs/content/docs/dev/table/functions/systemFunctions.md index 02ef08391f3c6..a07cfa208e06d 100644 --- a/docs/content/docs/dev/table/functions/systemFunctions.md +++ b/docs/content/docs/dev/table/functions/systemFunctions.md @@ -126,6 +126,7 @@ For Table API, please use `_` for spaces (e.g., `DAY_TO_HOUR`). | :----------------------- | :----------------------------- | | `MILLENIUM` _(SQL-only)_ | | | `CENTURY` _(SQL-only)_ | | +| `DECADE` _(SQL-only)_ | | | `YEAR` | `YEAR` | | `YEAR TO MONTH` | | | `QUARTER` | `QUARTER` | @@ -145,6 +146,8 @@ For Table API, please use `_` for spaces (e.g., `DAY_TO_HOUR`). | | `MICROSECOND` | | `DOY` _(SQL-only)_ | | | `DOW` _(SQL-only)_ | | +| `ISODOW` _(SQL-only)_ | | +| `ISOYEAR` _(SQL-only)_ | | | | `SQL_TSI_YEAR` _(SQL-only)_ | | | `SQL_TSI_QUARTER` _(SQL-only)_ | | | `SQL_TSI_MONTH` _(SQL-only)_ | diff --git a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ExtractCallGen.scala b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ExtractCallGen.scala index 8365dc9d4c420..8be3c3f984f57 100644 --- a/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ExtractCallGen.scala +++ b/flink-table/flink-table-planner/src/main/scala/org/apache/flink/table/planner/codegen/calls/ExtractCallGen.scala @@ -43,8 +43,11 @@ class ExtractCallGen(method: Method) TimeUnit.DAY | TimeUnit.QUARTER | TimeUnit.DOY | + TimeUnit.ISOYEAR | TimeUnit.DOW | + TimeUnit.ISODOW | TimeUnit.WEEK | + TimeUnit.DECADE | TimeUnit.CENTURY | TimeUnit.MILLENNIUM => tpe.getTypeRoot match { diff --git a/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala b/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala index b316fed681583..575c38b2d3b3b 100644 --- a/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala +++ b/flink-table/flink-table-planner/src/test/scala/org/apache/flink/table/planner/expressions/ScalarFunctionsTest.scala @@ -2935,6 +2935,14 @@ class ScalarFunctionsTest extends ScalarTypesTestBase { "EXTRACT(CENTURY FROM f16)", "20") + testSqlApi( + "EXTRACT(DECADE FROM f18)", + "199") + + testSqlApi( + "EXTRACT(DECADE FROM f16)", + "199") + testSqlApi( "EXTRACT(DOY FROM f18)", "315") @@ -2943,6 +2951,14 @@ class ScalarFunctionsTest extends ScalarTypesTestBase { "EXTRACT(DOY FROM f16)", "315") + testSqlApi( + "EXTRACT(ISOYEAR FROM f18)", + "1996") + + testSqlApi( + "EXTRACT(ISOYEAR FROM f16)", + "1996") + testSqlApi( "EXTRACT(DOW FROM f18)", "1") @@ -2951,6 +2967,14 @@ class ScalarFunctionsTest extends ScalarTypesTestBase { "EXTRACT(DOW FROM f16)", "1") + testSqlApi( + "EXTRACT(ISODOW FROM f18)", + "7") + + testSqlApi( + "EXTRACT(ISODOW FROM f16)", + "7") + testSqlApi( "EXTRACT(QUARTER FROM f18)", "4") 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 d1760dcb40273..6d6ffd256ef6b 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 @@ -196,6 +196,18 @@ class ScalarFunctionsValidationTest extends ScalarTypesTestBase { testSqlApi("EXTRACT(DOY FROM TIME '12:42:25')", "0") } + @Test + def testISODOWWithTimeWhichIsUnsupported(): Unit = { + thrown.expect(classOf[ValidationException]) + testSqlApi("EXTRACT(ISODOW FROM TIME '12:42:25')", "0") + } + + @Test + def testISOYEARWithTimeWhichIsUnsupported(): Unit = { + thrown.expect(classOf[ValidationException]) + testSqlApi("EXTRACT(ISOYEAR FROM TIME '12:42:25')", "0") + } + private def testExtractFromTimeZeroResult(unit: TimeUnit): Unit = { thrown.expect(classOf[ValidationException]) testSqlApi("EXTRACT(" + unit + " FROM TIME '00:00:00')", "0") @@ -213,6 +225,12 @@ class ScalarFunctionsValidationTest extends ScalarTypesTestBase { testExtractFromTimeZeroResult(TimeUnit.CENTURY) } + @Test + def testDecadeWithTime(): Unit = { + thrown.expect(classOf[ValidationException]) + testExtractFromTimeZeroResult(TimeUnit.DECADE) + } + @Test def testYearWithTime(): Unit = { thrown.expect(classOf[ValidationException])