Rafay A created CALCITE-6750:
--------------------------------
Summary: 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
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)