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() {

Reply via email to