This is an automated email from the ASF dual-hosted git repository.
asolimando pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new e4bd21ec3b [CALCITE-6115] Interval type specifier with zero fractional
second precision does not pass validation
e4bd21ec3b is described below
commit e4bd21ec3bd04f9afeacc155ad50c843ba67f343
Author: Leonid Chistov <[email protected]>
AuthorDate: Mon Dec 4 12:13:21 2023 +0300
[CALCITE-6115] Interval type specifier with zero fractional second
precision does not pass validation
---
.../java/org/apache/calcite/sql/SqlIntervalQualifier.java | 8 ++++----
.../main/java/org/apache/calcite/sql/type/SqlTypeName.java | 2 +-
.../java/org/apache/calcite/test/SqlToRelConverterTest.java | 8 ++++++++
.../test/java/org/apache/calcite/test/SqlValidatorTest.java | 4 +++-
.../org/apache/calcite/test/SqlToRelConverterTest.xml | 11 +++++++++++
.../src/main/java/org/apache/calcite/test/IntervalTest.java | 12 ------------
6 files changed, 27 insertions(+), 18 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 508aaaf307..91e70e09bc 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlIntervalQualifier.java
@@ -882,7 +882,7 @@ public class SqlIntervalQualifier extends SqlNode {
final int fractionalSecondPrecision =
getFractionalSecondPrecision(typeSystem);
String intervalPatternWithFracSec =
- "(\\d+) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})\\.(\\d{1,"
+ "(\\d+) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})\\.(\\d{0,"
+ fractionalSecondPrecision + "})";
String intervalPatternWithoutFracSec =
"(\\d+) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})";
@@ -1034,7 +1034,7 @@ public class SqlIntervalQualifier extends SqlNode {
final int fractionalSecondPrecision =
getFractionalSecondPrecision(typeSystem);
String intervalPatternWithFracSec =
- "(\\d+):(\\d{1,2}):(\\d{1,2})\\.(\\d{1,"
+ "(\\d+):(\\d{1,2}):(\\d{1,2})\\.(\\d{0,"
+ fractionalSecondPrecision + "})";
String intervalPatternWithoutFracSec =
"(\\d+):(\\d{1,2}):(\\d{1,2})";
@@ -1142,7 +1142,7 @@ public class SqlIntervalQualifier extends SqlNode {
final int fractionalSecondPrecision =
getFractionalSecondPrecision(typeSystem);
String intervalPatternWithFracSec =
- "(\\d+):(\\d{1,2})\\.(\\d{1," + fractionalSecondPrecision + "})";
+ "(\\d+):(\\d{1,2})\\.(\\d{0," + fractionalSecondPrecision + "})";
String intervalPatternWithoutFracSec =
"(\\d+):(\\d{1,2})";
@@ -1211,7 +1211,7 @@ public class SqlIntervalQualifier extends SqlNode {
final int fractionalSecondPrecision =
getFractionalSecondPrecision(typeSystem);
String intervalPatternWithFracSec =
- "(\\d+)\\.(\\d{1," + fractionalSecondPrecision + "})";
+ "(\\d+)\\.(\\d{0," + fractionalSecondPrecision + "})";
String intervalPatternWithoutFracSec =
"(\\d+)";
diff --git a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java
b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java
index fe43d189da..1b1110a24e 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/SqlTypeName.java
@@ -137,7 +137,7 @@ public enum SqlTypeName {
public static final int DEFAULT_INTERVAL_START_PRECISION = 2;
public static final int DEFAULT_INTERVAL_FRACTIONAL_SECOND_PRECISION = 6;
public static final int MIN_INTERVAL_START_PRECISION = 1;
- public static final int MIN_INTERVAL_FRACTIONAL_SECOND_PRECISION = 1;
+ public static final int MIN_INTERVAL_FRACTIONAL_SECOND_PRECISION = 0;
public static final int MAX_INTERVAL_START_PRECISION = 10;
public static final int MAX_INTERVAL_FRACTIONAL_SECOND_PRECISION = 9;
diff --git
a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index f56f87d4c3..e828a9ddf3 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -143,6 +143,14 @@ class SqlToRelConverterTest extends SqlToRelTestBase {
sql("select interval mgr hour as h from emp").ok();
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6115">[CALCITE-6115]
+ * Interval type specifier with zero fractional second precision does not
pass validation</a>.
+ */
+ @Test void testIntervalSecondNoFractionalPart() {
+ sql("select interval '1' second(1,0) as h from emp").ok();
+ }
+
@Test void testAliasList() {
final String sql = "select a + b from (\n"
+ " select deptno, 1 as uno, name from dept\n"
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 c5947df813..0e3d14607d 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlValidatorTest.java
@@ -2277,7 +2277,7 @@ public class SqlValidatorTest extends
SqlValidatorTestCase {
assertThat(typeName.getMinPrecision(), is(1));
assertThat(typeSystem.getMaxPrecision(typeName), is(10));
assertThat(typeSystem.getDefaultPrecision(typeName), is(2));
- assertThat(typeName.getMinScale(), is(1));
+ assertThat(typeName.getMinScale(), is(0));
assertThat(typeSystem.getMaxScale(typeName), is(9));
assertThat(typeName.getDefaultScale(), is(6));
}
@@ -2335,6 +2335,8 @@ public class SqlValidatorTest extends
SqlValidatorTestCase {
.columnType("INTERVAL HOUR NOT NULL");
sql("select interval emp.mgr hour as h from emp")
.columnType("INTERVAL HOUR");
+ expr("interval '1' second(1, 0)")
+ .columnType("INTERVAL SECOND(1, 0) NOT NULL");
}
@Test void testIntervalOperators() {
diff --git
a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index c1c489a590..524f8c8f4f 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -3312,6 +3312,17 @@ from emp]]>
<![CDATA[
LogicalProject(EXPR$0=[*($0, 13:INTERVAL YEAR TO MONTH)])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testIntervalSecondNoFractionalPart">
+ <Resource name="sql">
+ <![CDATA[select interval '1' second(1,0) as h from emp]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalProject(H=[1000:INTERVAL SECOND(1, 0)])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
</Resource>
</TestCase>
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 1c808db319..7b45a9f50f 100644
--- a/testkit/src/main/java/org/apache/calcite/test/IntervalTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/IntervalTest.java
@@ -1477,9 +1477,6 @@ public class IntervalTest {
f.expr("INTERVAL '0 0:0:0' ^DAY(0) TO SECOND^")
.fails("Interval leading field precision '0' out of range for "
+ "INTERVAL DAY\\(0\\) TO SECOND");
- f.expr("INTERVAL '0 0:0:0' ^DAY TO SECOND(0)^")
- .fails("Interval fractional second precision '0' out of range for "
- + "INTERVAL DAY TO SECOND\\(0\\)");
}
/**
@@ -1706,9 +1703,6 @@ public class IntervalTest {
f.expr("INTERVAL '0:0:0' ^HOUR(0) TO SECOND^")
.fails("Interval leading field precision '0' out of range for "
+ "INTERVAL HOUR\\(0\\) TO SECOND");
- f.expr("INTERVAL '0:0:0' ^HOUR TO SECOND(0)^")
- .fails("Interval fractional second precision '0' out of range for "
- + "INTERVAL HOUR TO SECOND\\(0\\)");
}
/**
@@ -1850,9 +1844,6 @@ public class IntervalTest {
f.expr("INTERVAL '0:0' ^MINUTE(0) TO SECOND^")
.fails("Interval leading field precision '0' out of range for"
+ " INTERVAL MINUTE\\(0\\) TO SECOND");
- f.expr("INTERVAL '0:0' ^MINUTE TO SECOND(0)^")
- .fails("Interval fractional second precision '0' out of range for"
- + " INTERVAL MINUTE TO SECOND\\(0\\)");
}
/**
@@ -1927,9 +1918,6 @@ public class IntervalTest {
f.expr("INTERVAL '0' ^SECOND(0)^")
.fails("Interval leading field precision '0' out of range for"
+ " INTERVAL SECOND\\(0\\)");
- f.expr("INTERVAL '0' ^SECOND(1, 0)^")
- .fails("Interval fractional second precision '0' out of range for"
- + " INTERVAL SECOND\\(1, 0\\)");
}
public void subTestMisc() {