You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by da...@apache.org on 2020/04/25 02:23:29 UTC
[calcite] branch master updated: [CALCITE-3955] Remove the first
operand of RexCall from SqlWindowTableFunction
This is an automated email from the ASF dual-hosted git repository.
danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/master by this push:
new f62d6b9 [CALCITE-3955] Remove the first operand of RexCall from SqlWindowTableFunction
f62d6b9 is described below
commit f62d6b9a2f3dd877d4e2e5cbd2ff5d0d5f0efff1
Author: yuzhao.cyz <yu...@gmail.com>
AuthorDate: Fri Apr 24 17:42:42 2020 +0800
[CALCITE-3955] Remove the first operand of RexCall from SqlWindowTableFunction
In CALCITE-3382, we introduced TUMBLE window function to replace the
deprecated group tumble window.
But for query
```sql
select *
from table(tumble(table Shipments, descriptor(rowtime),
INTERVAL '1' MINUTE))
```
the output plan is
```xml
LogicalProject
LogicalTableFunctionScan(invocation=[TUMBLE($1, ...)], rowType=...)
LogicalProject
LogicalTableScan
```
The first operand of TUMBLE rex call is always the last
input field, but actually it represents the source table
which is the input rel node.
Removes the first operand from the RexCall because
it is useless and confusing.
---
.../apache/calcite/adapter/enumerable/RexImpTable.java | 6 ++++--
.../apache/calcite/sql2rel/StandardConvertletTable.java | 17 +++++++++++++++++
.../org/apache/calcite/test/SqlToRelConverterTest.java | 4 ----
.../org/apache/calcite/test/SqlToRelConverterTest.xml | 4 ++--
4 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
index d095c79..669c316 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
@@ -3129,8 +3129,10 @@ public class RexImpTable {
@Override public Expression implement(RexToLixTranslator translator,
Expression inputEnumerable,
RexCall call, PhysType inputPhysType, PhysType outputPhysType) {
- Expression intervalExpression = translator.translate(call.getOperands().get(2));
- RexCall descriptor = (RexCall) call.getOperands().get(1);
+ // The table operand is removed from the RexCall because it
+ // represents the input, see StandardConvertletTable#convertWindowFunction.
+ Expression intervalExpression = translator.translate(call.getOperands().get(1));
+ RexCall descriptor = (RexCall) call.getOperands().get(0);
List<Expression> translatedOperands = new ArrayList<>();
final ParameterExpression parameter =
Expressions.parameter(Primitive.box(inputPhysType.getJavaRowType()), "_input");
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java b/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
index 245320b..747ac8e 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
@@ -46,6 +46,7 @@ import org.apache.calcite.sql.SqlNodeList;
import org.apache.calcite.sql.SqlNumericLiteral;
import org.apache.calcite.sql.SqlOperator;
import org.apache.calcite.sql.SqlUtil;
+import org.apache.calcite.sql.SqlWindowTableFunction;
import org.apache.calcite.sql.fun.SqlArrayValueConstructor;
import org.apache.calcite.sql.fun.SqlBetweenOperator;
import org.apache.calcite.sql.fun.SqlCase;
@@ -663,6 +664,22 @@ public class StandardConvertletTable extends ReflectiveConvertletTable {
return cx.getRexBuilder().makeCall(returnType, fun, exprs);
}
+ public RexNode convertWindowFunction(
+ SqlRexContext cx,
+ SqlWindowTableFunction fun,
+ SqlCall call) {
+ // The first operand of window function is actually a query, skip that.
+ final List<SqlNode> operands = Util.skip(call.getOperandList(), 1);
+ final List<RexNode> exprs = convertExpressionList(cx, operands,
+ SqlOperandTypeChecker.Consistency.NONE);
+ RelDataType returnType =
+ cx.getValidator().getValidatedNodeTypeIfKnown(call);
+ if (returnType == null) {
+ returnType = cx.getRexBuilder().deriveReturnType(fun, exprs);
+ }
+ return cx.getRexBuilder().makeCall(returnType, fun, exprs);
+ }
+
public RexNode convertSequenceValue(
SqlRexContext cx,
SqlSequenceValueOperator fun,
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 36c2914..338b99e 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -1776,16 +1776,12 @@ class SqlToRelConverterTest extends SqlToRelTestBase {
sql(sql).ok();
}
- // In generated plan, the first parameter of TUMBLE function will always be the last field
- // of it's input. There isn't a way to give the first operand a proper type.
@Test void testTableValuedFunctionTumble() {
final String sql = "select *\n"
+ "from table(tumble(table Shipments, descriptor(rowtime), INTERVAL '1' MINUTE))";
sql(sql).ok();
}
- // In generated plan, the first parameter of TUMBLE function will always be the last field
- // of it's input. There isn't a way to give the first operand a proper type.
@Test void testTableValuedFunctionTumbleWithSubQueryParam() {
final String sql = "select *\n"
+ "from table(tumble((select * from Shipments), descriptor(rowtime), INTERVAL '1' MINUTE))";
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 9c17fb3..20da426 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -4925,7 +4925,7 @@ 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($1, DESCRIPTOR($1), 60000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) 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]])
]]>
@@ -4939,7 +4939,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($1, DESCRIPTOR($1), 60000:INTERVAL MINUTE)], rowType=[RecordType(INTEGER ORDERID, TIMESTAMP(0) ROWTIME, TIMESTAMP(0) window_start, TIMESTAMP(0) 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]])
]]>