From b4bcd3b69a39ac40974690d1bd4ea08f364638ce Mon Sep 17 00:00:00 2001 From: Mihai Budiu Date: Tue, 16 Apr 2024 20:29:05 -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, 17 insertions(+), 17 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 91e70e09bc1..b3a29c715db 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 e68d94c869d..4b5ffd63d13 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 7b45a9f50fa..d771f42118e 100644 --- a/testkit/src/main/java/org/apache/calcite/test/IntervalTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/IntervalTest.java @@ -871,7 +871,7 @@ 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.*"); + .columnType("INTERVAL YEAR NOT NULL"); f.wholeExpr("INTERVAL '100' YEAR(2)") .fails("Interval field value 100 exceeds precision of YEAR\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' YEAR(3)") @@ -936,7 +936,7 @@ public void subTestIntervalYearToMonthNegative() { // (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.*"); + .columnType("INTERVAL YEAR TO MONTH NOT NULL"); 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") @@ -1124,7 +1124,7 @@ 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.*"); + .columnType("INTERVAL MONTH NOT NULL"); f.wholeExpr("INTERVAL '100' MONTH(2)") .fails("Interval field value 100 exceeds precision of MONTH\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' MONTH(3)") @@ -1180,7 +1180,7 @@ 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.*"); + .columnType("INTERVAL DAY NOT NULL"); f.wholeExpr("INTERVAL '100' DAY(2)") .fails("Interval field value 100 exceeds precision of DAY\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' DAY(3)") @@ -1245,7 +1245,7 @@ public void subTestIntervalDayToHourNegative() { // (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.*"); + .columnType("INTERVAL DAY TO HOUR NOT NULL"); 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") @@ -1323,7 +1323,7 @@ public void subTestIntervalDayToMinuteNegative() { // (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.*"); + .columnType("INTERVAL DAY TO MINUTE NOT NULL"); 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") @@ -1511,8 +1511,7 @@ 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.*"); + .columnType("INTERVAL HOUR NOT NULL"); f.wholeExpr("INTERVAL '100' HOUR(2)") .fails("Interval field value 100 exceeds precision of " + "HOUR\\(2\\) field.*"); @@ -1580,7 +1579,7 @@ public void subTestIntervalHourToMinuteNegative() { // (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.*"); + .columnType("INTERVAL HOUR TO MINUTE NOT NULL"); 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") @@ -1659,8 +1658,7 @@ public void subTestIntervalHourToSecondNegative() { // (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.*"); + .columnType("INTERVAL HOUR TO SECOND NOT NULL"); f.wholeExpr("INTERVAL '100:0:0' HOUR(2) TO SECOND") .fails("Interval field value 100 exceeds precision of " + "HOUR\\(2\\) field.*"); @@ -1736,7 +1734,7 @@ 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.*"); + .columnType("INTERVAL MINUTE NOT NULL"); f.wholeExpr("INTERVAL '100' MINUTE(2)") .fails("Interval field value 100 exceeds precision of MINUTE\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' MINUTE(3)") @@ -1809,7 +1807,7 @@ public void subTestIntervalMinuteToSecondNegative() { // (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.*"); + .columnType("INTERVAL MINUTE TO SECOND NOT NULL"); 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") @@ -1883,7 +1881,7 @@ 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.*"); + .columnType("INTERVAL SECOND NOT NULL"); f.wholeExpr("INTERVAL '100' SECOND(2)") .fails("Interval field value 100 exceeds precision of SECOND\\(2\\) field.*"); f.wholeExpr("INTERVAL '1000' SECOND(3)")