This is an automated email from the ASF dual-hosted git repository.

mbudiu 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 e7e3925cf1 [CALCITE-7410] TIMESTAMP type for TUMBLE and HOP is 
hardwired to TIMESTAMP(3)
e7e3925cf1 is described below

commit e7e3925cf1bcd8d71b664fe295705c1180f89c3a
Author: Mihai Budiu <[email protected]>
AuthorDate: Mon Feb 16 11:07:45 2026 -0800

    [CALCITE-7410] TIMESTAMP type for TUMBLE and HOP is hardwired to 
TIMESTAMP(3)
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../apache/calcite/sql/SqlWindowTableFunction.java |  29 ++-
 .../apache/calcite/test/SqlToRelConverterTest.java |   7 +
 .../apache/calcite/test/SqlToRelConverterTest.xml  |  48 ++--
 core/src/test/resources/sql/stream.iq              | 256 +++++++++++----------
 site/_docs/history.md                              |   6 +
 5 files changed, 208 insertions(+), 138 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql/SqlWindowTableFunction.java 
b/core/src/main/java/org/apache/calcite/sql/SqlWindowTableFunction.java
index ca2fdd19a8..601b382994 100644
--- a/core/src/main/java/org/apache/calcite/sql/SqlWindowTableFunction.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlWindowTableFunction.java
@@ -40,6 +40,8 @@
 
 import static org.apache.calcite.util.Static.RESOURCE;
 
+import static java.util.Objects.requireNonNull;
+
 /**
  * Base class for a table-valued function that computes windows. Examples
  * include {@code TUMBLE}, {@code HOP} and {@code SESSION}.
@@ -107,14 +109,37 @@ public SqlWindowTableFunction(String name, 
SqlOperandMetadata operandMetadata) {
   private static RelDataType inferRowType(SqlOperatorBinding opBinding) {
     final RelDataType inputRowType = opBinding.getOperandType(0);
     final RelDataTypeFactory typeFactory = opBinding.getTypeFactory();
+    int precision = getTimestampPrecision(opBinding);
     return typeFactory.builder()
         .kind(inputRowType.getStructKind())
         .addAll(inputRowType.getFieldList())
-        .add("window_start", SqlTypeName.TIMESTAMP, 3)
-        .add("window_end", SqlTypeName.TIMESTAMP, 3)
+        .add("window_start", SqlTypeName.TIMESTAMP, precision)
+        .add("window_end", SqlTypeName.TIMESTAMP, precision)
         .build();
   }
 
+  /** Extract the precision for the start_window, end_window columns from the 
column supplied as
+   * DESCRIPTOR for the window function. */
+  private static int getTimestampPrecision(SqlOperatorBinding opBinding) {
+    RelDataType inputRowType = opBinding.getOperandType(0);
+    SqlCallBinding callBinding = (SqlCallBinding) opBinding;
+    // Locate the "descriptor" argument
+    for (SqlNode operand : callBinding.operands()) {
+      if (operand instanceof SqlCall) {
+        SqlCall opCall = (SqlCall) operand;
+        if (opCall.getOperator().getKind() == SqlKind.DESCRIPTOR) {
+          SqlNode descriptor = opCall.operand(0);
+          SqlIdentifier id = (SqlIdentifier) descriptor;
+          RelDataTypeField field =
+              inputRowType.getField(id.getSimple(), false, false);
+          return requireNonNull(field, "field").getType().getPrecision();
+        }
+      }
+    }
+    // Should be unreachable, since validation succeeded
+    throw new RuntimeException("Could not locate DESCRIPTOR column");
+  }
+
   /** Partial implementation of operand type checker. */
   protected abstract static class AbstractOperandMetadata
       implements SqlOperandMetadata {
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 f0d068d5bb..dc18d05520 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -2502,6 +2502,13 @@ void checkCorrelatedMapSubQuery(boolean expand) {
     sql(sql).ok();
   }
 
+  @Test void testTableFunctionTumbleConvert() {
+    final String sql = "with t as (select CAST(rowtime AS TIMESTAMP(2)) as 
rowtime FROM Shipments) "
+        + "select *\n"
+        + "from table(tumble(table t, descriptor(rowtime), INTERVAL '1.5' 
SECOND))";
+    sql(sql).ok();
+  }
+
   @Test void testTableFunctionTumbleWithParamNames() {
     final String sql = "select *\n"
         + "from table(\n"
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 c8c136c97f..a4dc246f8e 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -8404,7 +8404,7 @@ from table(hop(table Shipments, descriptor(rowtime), 
INTERVAL '1' MINUTE, INTERV
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 120000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 120000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8418,7 +8418,7 @@ from table(hop(table Shipments, descriptor(rowtime), 
INTERVAL '1' MINUTE, INTERV
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 300000:INTERVAL MINUTE, 180000:INTERVAL MINUTE)], 
rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, TIMESTAMP(3) 
window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 300000:INTERVAL MINUTE, 180000:INTERVAL MINUTE)], 
rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, TIMESTAMP(0) 
window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8437,7 +8437,7 @@ hop(
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 120000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 120000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8456,7 +8456,7 @@ hop(
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 120000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 120000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8470,7 +8470,7 @@ from table(hop((select * from Shipments), 
descriptor(rowtime), INTERVAL '1' MINU
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 120000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[HOP(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE, 120000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8484,7 +8484,7 @@ from table(session(table Shipments, descriptor(rowtime), 
descriptor(orderId), IN
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($1), DESCRIPTOR($0), 
600000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) 
ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($1), DESCRIPTOR($0), 
600000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) 
ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8498,7 +8498,7 @@ from table(session(table Orders, descriptor(rowtime), 
descriptor(orderId, produc
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ROWTIME=[$0], PRODUCTID=[$1], ORDERID=[$2], window_start=[$3], 
window_end=[$4])
-  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($0), DESCRIPTOR($2, 
$1), 600000:INTERVAL MINUTE)], rowType=[RecordType(TIMESTAMP(0) ROWTIME, 
INTEGER PRODUCTID, INTEGER ORDERID, TIMESTAMP(3) window_start, TIMESTAMP(3) 
window_end)])
+  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($0), DESCRIPTOR($2, 
$1), 600000:INTERVAL MINUTE)], rowType=[RecordType(TIMESTAMP(0) ROWTIME, 
INTEGER PRODUCTID, INTEGER ORDERID, TIMESTAMP(0) window_start, TIMESTAMP(0) 
window_end)])
     LogicalProject(ROWTIME=[$0], PRODUCTID=[$1], ORDERID=[$2])
       LogicalTableScan(table=[[CATALOG, SALES, ORDERS]])
 ]]>
@@ -8517,7 +8517,7 @@ session(
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($1), DESCRIPTOR($0), 
600000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) 
ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($1), DESCRIPTOR($0), 
600000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) 
ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8536,7 +8536,7 @@ session(
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($1), DESCRIPTOR($0), 
600000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) 
ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($1), DESCRIPTOR($0), 
600000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) 
ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8550,7 +8550,7 @@ from table(session((select * from Shipments), 
descriptor(rowtime), descriptor(or
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($1), DESCRIPTOR($0), 
600000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) 
ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[SESSION(DESCRIPTOR($1), DESCRIPTOR($0), 
600000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) 
ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8585,9 +8585,23 @@ from table(tumble(table Shipments, descriptor(rowtime), 
INTERVAL '1' MINUTE))]]>
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testTableFunctionTumbleConvert">
+    <Resource name="sql">
+      <![CDATA[with t as (select CAST(rowtime AS TIMESTAMP(2)) as rowtime FROM 
Shipments) select *
+from table(tumble(table t, descriptor(rowtime), INTERVAL '1.5' SECOND))]]>
+    </Resource>
+    <Resource name="plan">
+      <![CDATA[
+LogicalProject(ROWTIME=[$0], window_start=[$1], window_end=[$2])
+  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($0), 1500:INTERVAL 
SECOND)], rowType=[RecordType(TIMESTAMP(2) ROWTIME, TIMESTAMP(2) window_start, 
TIMESTAMP(2) window_end)])
+    LogicalProject(ROWTIME=[CAST($1):TIMESTAMP(2) NOT NULL])
+      LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
     </Resource>
   </TestCase>
@@ -8602,10 +8616,10 @@ on a.orderid = b.orderid]]>
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3], 
ORDERID0=[$4], ROWTIME0=[$5], window_start0=[$6], window_end0=[$7])
   LogicalJoin(condition=[=($0, $4)], joinType=[inner])
-    LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+    LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
       LogicalProject(ORDERID=[$0], ROWTIME=[$1])
         LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
-    LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+    LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
       LogicalProject(ORDERID=[$0], ROWTIME=[$1])
         LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8620,7 +8634,7 @@ from table(tumble(table Shipments, descriptor(rowtime),
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 600000:INTERVAL 
MINUTE, 60000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 600000:INTERVAL 
MINUTE, 60000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, 
TIMESTAMP(0) ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8638,7 +8652,7 @@ tumble(
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8656,7 +8670,7 @@ tumble(
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
@@ -8670,7 +8684,7 @@ from table(tumble((select * from Shipments), 
descriptor(rowtime), INTERVAL '1' M
     <Resource name="plan">
       <![CDATA[
 LogicalProject(ORDERID=[$0], ROWTIME=[$1], window_start=[$2], window_end=[$3])
-  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(3) window_start, TIMESTAMP(3) window_end)])
+  LogicalTableFunctionScan(invocation=[TUMBLE(DESCRIPTOR($1), 60000:INTERVAL 
MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, 
TIMESTAMP(0) window_start, TIMESTAMP(0) window_end)])
     LogicalProject(ORDERID=[$0], ROWTIME=[$1])
       LogicalTableScan(table=[[CATALOG, SALES, SHIPMENTS]])
 ]]>
diff --git a/core/src/test/resources/sql/stream.iq 
b/core/src/test/resources/sql/stream.iq
index 653632955d..f20a7fe640 100644
--- a/core/src/test/resources/sql/stream.iq
+++ b/core/src/test/resources/sql/stream.iq
@@ -17,81 +17,99 @@
 #
 !use orinoco
 !set outputformat mysql
+
+# Test case for [CALCITE-7410] TIMESTAMP type for TUMBLE and HOP is hardwired 
to TIMESTAMP(3)
+# Since we cast the input column to TIMESTAMP(3), we expect window_start to 
have the same type.
+WITH S AS (SELECT *, CAST(ROWTIME AS TIMESTAMP(3)) + INTERVAL '0.5' SECONDS AS 
TS FROM ORDERS)
+SELECT * FROM TABLE(TUMBLE((SELECT * FROM S), DESCRIPTOR(TS), INTERVAL 
'20:10.525' MINUTE TO SECOND));
++---------------------+----+---------+-------+-------------------------+-------------------------+-------------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | TS                      | 
window_start            | window_end              |
++---------------------+----+---------+-------+-------------------------+-------------------------+-------------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.500 | 
2015-02-15 10:10:31.125 | 2015-02-15 10:30:41.650 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:15.500 | 
2015-02-15 10:10:31.125 | 2015-02-15 10:30:41.650 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:45.500 | 
2015-02-15 10:10:31.125 | 2015-02-15 10:30:41.650 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00.500 | 
2015-02-15 10:50:52.175 | 2015-02-15 11:11:02.700 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00.500 | 
2015-02-15 10:50:52.175 | 2015-02-15 11:11:02.700 |
++---------------------+----+---------+-------+-------------------------+-------------------------+-------------------------+
+(5 rows)
+
+!ok
+
 SELECT * FROM TABLE(
   TUMBLE(
     DATA => TABLE ORDERS,
     TIMECOL => DESCRIPTOR(ROWTIME),
     SIZE => INTERVAL '1' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:16:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 10:59:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00.000 | 
2015-02-15 11:11:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:16:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 10:59:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00 | 
2015-02-15 11:11:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (5 rows)
 
 !ok
 
 SELECT * FROM TABLE(TUMBLE(TABLE ORDERS, DESCRIPTOR(ROWTIME), INTERVAL '1' 
MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:16:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 10:59:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00.000 | 
2015-02-15 11:11:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:16:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 10:59:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00 | 
2015-02-15 11:11:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (5 rows)
 
 !ok
 
 SELECT * FROM TABLE(TUMBLE((SELECT * FROM ORDERS), DESCRIPTOR(ROWTIME), 
INTERVAL '1' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:16:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 10:59:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00.000 | 
2015-02-15 11:11:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:16:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 10:59:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00 | 
2015-02-15 11:11:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (5 rows)
 
 !ok
 
 SELECT * FROM TABLE(TUMBLE((SELECT * FROM ORDERS), DESCRIPTOR(ROWTIME), 
INTERVAL '10' MINUTE, INTERVAL '3' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:13:00.000 | 
2015-02-15 10:23:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:23:00.000 | 
2015-02-15 10:33:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:23:00.000 | 
2015-02-15 10:33:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:53:00.000 | 
2015-02-15 11:03:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:03:00.000 | 
2015-02-15 11:13:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:13:00 | 
2015-02-15 10:23:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:23:00 | 
2015-02-15 10:33:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:23:00 | 
2015-02-15 10:33:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:53:00 | 
2015-02-15 11:03:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:03:00 | 
2015-02-15 11:13:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (5 rows)
 
 !ok
 
 SELECT * FROM TABLE(HOP(TABLE ORDERS, DESCRIPTOR(ROWTIME), INTERVAL '5' 
MINUTE, INTERVAL '10' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:10:00.000 | 
2015-02-15 10:20:00.000 |
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:20:00.000 | 
2015-02-15 10:30:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:20:00.000 | 
2015-02-15 10:30:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:50:00.000 | 
2015-02-15 11:00:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:55:00.000 | 
2015-02-15 11:05:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:05:00.000 | 
2015-02-15 11:15:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00.000 | 
2015-02-15 11:20:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:10:00 | 
2015-02-15 10:20:00 |
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:20:00 | 
2015-02-15 10:30:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:20:00 | 
2015-02-15 10:30:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:50:00 | 
2015-02-15 11:00:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:55:00 | 
2015-02-15 11:05:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:05:00 | 
2015-02-15 11:15:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00 | 
2015-02-15 11:20:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (10 rows)
 
 !ok
@@ -102,72 +120,72 @@ SELECT * FROM TABLE(
     TIMECOL => DESCRIPTOR(ROWTIME),
     SLIDE => INTERVAL '5' MINUTE,
     SIZE => INTERVAL '10' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:10:00.000 | 
2015-02-15 10:20:00.000 |
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:20:00.000 | 
2015-02-15 10:30:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:20:00.000 | 
2015-02-15 10:30:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:50:00.000 | 
2015-02-15 11:00:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:55:00.000 | 
2015-02-15 11:05:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:05:00.000 | 
2015-02-15 11:15:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00.000 | 
2015-02-15 11:20:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:10:00 | 
2015-02-15 10:20:00 |
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:20:00 | 
2015-02-15 10:30:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:20:00 | 
2015-02-15 10:30:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:50:00 | 
2015-02-15 11:00:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:55:00 | 
2015-02-15 11:05:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:05:00 | 
2015-02-15 11:15:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00 | 
2015-02-15 11:20:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (10 rows)
 
 !ok
 
 SELECT * FROM TABLE(HOP(TABLE ORDERS, DESCRIPTOR(ROWTIME), INTERVAL '5' 
MINUTE, INTERVAL '10' MINUTE, INTERVAL '2' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:07:00.000 | 
2015-02-15 10:17:00.000 |
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:12:00.000 | 
2015-02-15 10:22:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:17:00.000 | 
2015-02-15 10:27:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:22:00.000 | 
2015-02-15 10:32:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:17:00.000 | 
2015-02-15 10:27:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:22:00.000 | 
2015-02-15 10:32:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:52:00.000 | 
2015-02-15 11:02:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:57:00.000 | 
2015-02-15 11:07:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:02:00.000 | 
2015-02-15 11:12:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:07:00.000 | 
2015-02-15 11:17:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:07:00 | 
2015-02-15 10:17:00 |
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:12:00 | 
2015-02-15 10:22:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:17:00 | 
2015-02-15 10:27:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:22:00 | 
2015-02-15 10:32:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:17:00 | 
2015-02-15 10:27:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:22:00 | 
2015-02-15 10:32:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:52:00 | 
2015-02-15 11:02:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:57:00 | 
2015-02-15 11:07:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:02:00 | 
2015-02-15 11:12:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:07:00 | 
2015-02-15 11:17:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (10 rows)
 
 !ok
 
 SELECT * FROM TABLE(HOP((SELECT * FROM ORDERS), DESCRIPTOR(ROWTIME), INTERVAL 
'5' MINUTE, INTERVAL '10' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:10:00.000 | 
2015-02-15 10:20:00.000 |
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:20:00.000 | 
2015-02-15 10:30:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:25:00.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:20:00.000 | 
2015-02-15 10:30:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:50:00.000 | 
2015-02-15 11:00:00.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:55:00.000 | 
2015-02-15 11:05:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:05:00.000 | 
2015-02-15 11:15:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00.000 | 
2015-02-15 11:20:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:10:00 | 
2015-02-15 10:20:00 |
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:20:00 | 
2015-02-15 10:30:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:15:00 | 
2015-02-15 10:25:00 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:20:00 | 
2015-02-15 10:30:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:50:00 | 
2015-02-15 11:00:00 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:55:00 | 
2015-02-15 11:05:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:05:00 | 
2015-02-15 11:15:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 11:10:00 | 
2015-02-15 11:20:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (10 rows)
 
 !ok
 
 SELECT * FROM TABLE(SESSION(TABLE ORDERS, DESCRIPTOR(ROWTIME), 
DESCRIPTOR(PRODUCT), INTERVAL '20' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:35:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:15.000 | 
2015-02-15 10:44:15.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:45.000 | 
2015-02-15 10:44:45.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 11:30:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 11:30:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:35:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:15 | 
2015-02-15 10:44:15 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:45 | 
2015-02-15 10:44:45 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 11:30:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 11:30:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (5 rows)
 
 !ok
@@ -178,29 +196,29 @@ SELECT * FROM TABLE(
     TIMECOL => DESCRIPTOR(ROWTIME),
     KEY => DESCRIPTOR(PRODUCT),
     SIZE => INTERVAL '20' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:35:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:15.000 | 
2015-02-15 10:44:15.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:45.000 | 
2015-02-15 10:44:45.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 11:30:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 11:30:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:35:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:15 | 
2015-02-15 10:44:15 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:45 | 
2015-02-15 10:44:45 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 11:30:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 11:30:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (5 rows)
 
 !ok
 
 SELECT * FROM TABLE(SESSION((SELECT * FROM ORDERS), DESCRIPTOR(ROWTIME), 
DESCRIPTOR(PRODUCT), INTERVAL '20' MINUTE));
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| ROWTIME             | ID | PRODUCT | UNITS | window_start            | 
window_end              |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
-| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00.000 | 
2015-02-15 10:35:00.000 |
-| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:15.000 | 
2015-02-15 10:44:15.000 |
-| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:45.000 | 
2015-02-15 10:44:45.000 |
-| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 11:30:00.000 |
-| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 10:58:00.000 | 
2015-02-15 11:30:00.000 |
-+---------------------+----+---------+-------+-------------------------+-------------------------+
++---------------------+----+---------+-------+---------------------+---------------------+
+| ROWTIME             | ID | PRODUCT | UNITS | window_start        | 
window_end          |
++---------------------+----+---------+-------+---------------------+---------------------+
+| 2015-02-15 10:15:00 |  1 | paint   |    10 | 2015-02-15 10:15:00 | 
2015-02-15 10:35:00 |
+| 2015-02-15 10:24:15 |  2 | paper   |     5 | 2015-02-15 10:24:15 | 
2015-02-15 10:44:15 |
+| 2015-02-15 10:24:45 |  3 | brush   |    12 | 2015-02-15 10:24:45 | 
2015-02-15 10:44:45 |
+| 2015-02-15 10:58:00 |  4 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 11:30:00 |
+| 2015-02-15 11:10:00 |  5 | paint   |     3 | 2015-02-15 10:58:00 | 
2015-02-15 11:30:00 |
++---------------------+----+---------+-------+---------------------+---------------------+
 (5 rows)
 
 !ok
diff --git a/site/_docs/history.md b/site/_docs/history.md
index dba2c98c34..8a7da2a4f3 100644
--- a/site/_docs/history.md
+++ b/site/_docs/history.md
@@ -49,6 +49,12 @@ ## <a 
href="https://github.com/apache/calcite/releases/tag/calcite-1.42.0";>1.42.
 #### Breaking Changes
 {: #breaking-1-42-0}
 
+* [<a 
href="https://issues.apache.org/jira/browse/CALCITE-7410";>CALCITE-7410</a>]
+  Changes the type of the `WINDOW_START` and `WINDOW_END` columns for
+  the table functions `HOP`, `TUMBLE`, `SESSION` to match the original
+  type of the timestamp column.  These types used to be hardwired to
+  `TIMESTAMP(3)`.
+
 * [<a 
href="https://issues.apache.org/jira/browse/CALCITE-7393";>CALCITE-7393</a>]
 `RelDataTypeImpl.digest` is deprecated. We recommend using 
`RelDataTypeImpl.innerDigest` instead.
 See system property 
`CalciteSystemProperty.DISABLE_GENERATE_REL_DATA_TYPE_DIGEST_STRING`.


Reply via email to