[
https://issues.apache.org/jira/browse/CALCITE-6750?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stamatis Zampetakis updated CALCITE-6750:
-----------------------------------------
Fix Version/s: 1.39.0
> ProjectWindowTransposeRule does not consider references in bounds
> -----------------------------------------------------------------
>
> Key: CALCITE-6750
> URL: https://issues.apache.org/jira/browse/CALCITE-6750
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.38.0
> Reporter: Rafay A
> Priority: Minor
> Fix For: 1.39.0
>
>
> ProjectWindowTransposeRule does not find reference in lower/upper bounds and
> pushes an incorrect project past Window causing IOOBE when combined with
> other rules later in the planning.
> We ran into this use case by a different combinations of rules, and i cannot
> recreate the same scenario, but i am constructing a rel plan here. Consider
> this test:
> {code:java}
> @Test void testProjectWindowTransposeRuleWithReferenceInBounds() {
> fixture()
> .withVolcanoPlanner(false, p -> {
> p.addRelTraitDef(RelDistributionTraitDef.INSTANCE);
> RelOptUtil.registerDefaultRules(p, false, false);
> })
> .withDynamicTable()
> .relFn(b -> {
> final RelDataTypeFactory typeFactory = b.getTypeFactory();
> final RelDataType bigIntType =
> typeFactory.createTypeWithNullability(
> typeFactory.createSqlType(SqlTypeName.BIGINT), true);
> final RelDataType intType =
> typeFactory.createTypeWithNullability(
> typeFactory.createSqlType(SqlTypeName.INTEGER), true);
> final RexBuilder rb = b.getRexBuilder();
> return b.scan("EMP")
> .project(b.field("DEPTNO"),
> b.alias(
> rb.makeOver(bigIntType,
> SqlStdOperatorTable.COUNT,
> ImmutableList.of(b.field(1)),
> ImmutableList.of(b.field(2)),
> ImmutableList.of(
> new RexFieldCollation(b.field(0),
> ImmutableSet.of())),
> RexWindowBounds.preceding(rb
> .makeAbstractCast(intType, b.literal(10), false)),
> RexWindowBounds.CURRENT_ROW,
> true, true, false, false, false),
> "x"))
> .filter(b.call(SqlStdOperatorTable.EQUALS, b.field(0),
> b.literal(10)))
> .project(b.field(0), b.field(1), b.literal(100))
> .build();
> })
> .withRule(CoreRules.PROJECT_TO_LOGICAL_PROJECT_AND_WINDOW,
> CoreRules.PROJECT_WINDOW_TRANSPOSE)
> .checkUnchanged();
> } {code}
> This output after ProjectToWindowRule is:
> {code:java}
> LogicalProject(DEPTNO=[$3], $1=[$5])
> LogicalWindow(window#0=[window(partition {2} order by [0] rows between $4
> PRECEDING and CURRENT ROW aggs [COUNT($1)])])
> LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], DEPTNO=[$7],
> $4=[CAST(10):INTEGER])
> LogicalTableScan(table=[[scott, EMP]]) {code}
> You can see that the window is referencing a constant from the project below
> (its a cast, so is not in the constants list in the LogicalWindow). But after
> ProjectWindowTransposeRule, the output becomes:
> {code:java}
> LogicalProject(DEPTNO=[$3], $1=[$4])
> LogicalWindow(window#0=[window(partition {2} order by [0] rows between $4
> PRECEDING and CURRENT ROW aggs [COUNT($1)])])
> LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], DEPTNO=[$3])
> LogicalProject(EMPNO=[$0], ENAME=[$1], JOB=[$2], DEPTNO=[$7],
> $4=[CAST(10):INTEGER])
> LogicalTableScan(table=[[scott, EMP]]) {code}
> Which is incorrect. $4 in the LogicalWindow will run into IOOBE because the
> project below only has 3 fields.
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)