From d65b83329f69c43db1c9b605c6e3832bbc2f3ed9 Mon Sep 17 00:00:00 2001 From: Mihai Budiu Date: Fri, 29 Mar 2024 19:10:02 -0700 Subject: [PATCH] [CALCITE-6345] Intervals with more than 100 years are not supported Signed-off-by: Mihai Budiu --- .../calcite/sql/SqlIntervalQualifier.java | 2 +- .../apache/calcite/test/SqlValidatorTest.java | 6 +++-- .../org/apache/calcite/test/IntervalTest.java | 26 ------------------- 3 files changed, 5 insertions(+), 29 deletions(-) diff --git a/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java b/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java index 91e70e09bc12..b3a29c715db5 100644 --- a/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java +++ b/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java @@ -297,7 +297,7 @@ public boolean isWeek() { public int getStartPrecision(RelDataTypeSystem typeSystem) { if (startPrecision == RelDataType.PRECISION_NOT_SPECIFIED) { - return typeSystem.getDefaultPrecision(typeName()); + return typeSystem.getMaxPrecision(typeName()); } else { return startPrecision; } diff --git a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java index 192b65fef50d..538441bdfec7 100644 --- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java +++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java @@ -2262,6 +2262,8 @@ void testLikeAndSimilarFails() { expr("INTERVAL '5' MONTH").assertInterval(is(5L)); expr("INTERVAL '3-2' YEAR TO MONTH").assertInterval(is(38L)); expr("INTERVAL '-5-4' YEAR TO MONTH").assertInterval(is(-64L)); + expr("INTERVAL '100-2' YEAR TO MONTH").assertInterval(is(1202L)); + expr("INTERVAL '1000-2' YEAR TO MONTH").assertInterval(is(12002L)); } @Test void testIntervalMillisConversion() { @@ -2381,9 +2383,9 @@ private IntervalTest.Fixture2 getFixture2(SqlValidatorFixture f2) { .columnType("TIME(0) NOT NULL"); expr("interval '1' day + interval '1' DAY(4)") - .columnType("INTERVAL DAY(4) NOT NULL"); + .columnType("INTERVAL DAY NOT NULL"); expr("interval '1' day(5) + interval '1' DAY") - .columnType("INTERVAL DAY(5) NOT NULL"); + .columnType("INTERVAL DAY NOT NULL"); expr("interval '1' day + interval '1' HOUR(10)") .columnType("INTERVAL DAY TO HOUR NOT NULL"); expr("interval '1' day + interval '1' MINUTE") diff --git a/testkit/src/main/java/org/apache/calcite/test/IntervalTest.java b/testkit/src/main/java/org/apache/calcite/test/IntervalTest.java index 7b45a9f50fae..2ddd96352d91 100644 --- a/testkit/src/main/java/org/apache/calcite/test/IntervalTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/IntervalTest.java @@ -870,8 +870,6 @@ public void subTestIntervalYearNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) - f.wholeExpr("INTERVAL '100' YEAR") - .fails("Interval field value 100 exceeds precision of YEAR\\(2\\) field.*"); f.wholeExpr("INTERVAL '100' YEAR(2)") .fails("Interval field value 100 exceeds precision of YEAR\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' YEAR(3)") @@ -935,8 +933,6 @@ public void subTestIntervalYearToMonthNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) // plus >max value for mid/end fields - f.wholeExpr("INTERVAL '100-0' YEAR TO MONTH") - .fails("Interval field value 100 exceeds precision of YEAR\\(2\\) field.*"); f.wholeExpr("INTERVAL '100-0' YEAR(2) TO MONTH") .fails("Interval field value 100 exceeds precision of YEAR\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000-0' YEAR(3) TO MONTH") @@ -1123,8 +1119,6 @@ public void subTestIntervalMonthNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) - f.wholeExpr("INTERVAL '100' MONTH") - .fails("Interval field value 100 exceeds precision of MONTH\\(2\\) field.*"); f.wholeExpr("INTERVAL '100' MONTH(2)") .fails("Interval field value 100 exceeds precision of MONTH\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' MONTH(3)") @@ -1179,8 +1173,6 @@ public void subTestIntervalDayNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) - f.wholeExpr("INTERVAL '100' DAY") - .fails("Interval field value 100 exceeds precision of DAY\\(2\\) field.*"); f.wholeExpr("INTERVAL '100' DAY(2)") .fails("Interval field value 100 exceeds precision of DAY\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' DAY(3)") @@ -1244,8 +1236,6 @@ public void subTestIntervalDayToHourNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) // plus >max value for mid/end fields - f.wholeExpr("INTERVAL '100 0' DAY TO HOUR") - .fails("Interval field value 100 exceeds precision of DAY\\(2\\) field.*"); f.wholeExpr("INTERVAL '100 0' DAY(2) TO HOUR") .fails("Interval field value 100 exceeds precision of DAY\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000 0' DAY(3) TO HOUR") @@ -1322,8 +1312,6 @@ public void subTestIntervalDayToMinuteNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) // plus >max value for mid/end fields - f.wholeExpr("INTERVAL '100 0:0' DAY TO MINUTE") - .fails("Interval field value 100 exceeds precision of DAY\\(2\\) field.*"); f.wholeExpr("INTERVAL '100 0:0' DAY(2) TO MINUTE") .fails("Interval field value 100 exceeds precision of DAY\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000 0:0' DAY(3) TO MINUTE") @@ -1510,9 +1498,6 @@ public void subTestIntervalHourNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) - f.wholeExpr("INTERVAL '100' HOUR") - .fails("Interval field value 100 exceeds precision of " - + "HOUR\\(2\\) field.*"); f.wholeExpr("INTERVAL '100' HOUR(2)") .fails("Interval field value 100 exceeds precision of " + "HOUR\\(2\\) field.*"); @@ -1579,8 +1564,6 @@ public void subTestIntervalHourToMinuteNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) // plus >max value for mid/end fields - f.wholeExpr("INTERVAL '100:0' HOUR TO MINUTE") - .fails("Interval field value 100 exceeds precision of HOUR\\(2\\) field.*"); f.wholeExpr("INTERVAL '100:0' HOUR(2) TO MINUTE") .fails("Interval field value 100 exceeds precision of HOUR\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000:0' HOUR(3) TO MINUTE") @@ -1658,9 +1641,6 @@ public void subTestIntervalHourToSecondNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) // plus >max value for mid/end fields - f.wholeExpr("INTERVAL '100:0:0' HOUR TO SECOND") - .fails("Interval field value 100 exceeds precision of " - + "HOUR\\(2\\) field.*"); f.wholeExpr("INTERVAL '100:0:0' HOUR(2) TO SECOND") .fails("Interval field value 100 exceeds precision of " + "HOUR\\(2\\) field.*"); @@ -1735,8 +1715,6 @@ public void subTestIntervalMinuteNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) - f.wholeExpr("INTERVAL '100' MINUTE") - .fails("Interval field value 100 exceeds precision of MINUTE\\(2\\) field.*"); f.wholeExpr("INTERVAL '100' MINUTE(2)") .fails("Interval field value 100 exceeds precision of MINUTE\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' MINUTE(3)") @@ -1808,8 +1786,6 @@ public void subTestIntervalMinuteToSecondNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) // plus >max value for mid/end fields - f.wholeExpr("INTERVAL '100:0' MINUTE TO SECOND") - .fails("Interval field value 100 exceeds precision of MINUTE\\(2\\) field.*"); f.wholeExpr("INTERVAL '100:0' MINUTE(2) TO SECOND") .fails("Interval field value 100 exceeds precision of MINUTE\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000:0' MINUTE(3) TO SECOND") @@ -1882,8 +1858,6 @@ public void subTestIntervalSecondNegative() { // Field value out of range // (default, explicit default, alt, neg alt, max, neg max) - f.wholeExpr("INTERVAL '100' SECOND") - .fails("Interval field value 100 exceeds precision of SECOND\\(2\\) field.*"); f.wholeExpr("INTERVAL '100' SECOND(2)") .fails("Interval field value 100 exceeds precision of SECOND\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' SECOND(3)")