[
https://issues.apache.org/jira/browse/CALCITE-7375?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mihai Budiu resolved CALCITE-7375.
----------------------------------
Resolution: Fixed
Fixed in
[https://github.com/apache/calcite/commit/6548b0e6f7f4a622b37d2b34c964d5f90635a046]
Thank you for the bug report and fix [~lincoln.86xy]
Thank you for the review [~jensen]
> ProjectWindowTransposeRule does not correctly adjust column indices in window
> bounds
> ------------------------------------------------------------------------------------
>
> Key: CALCITE-7375
> URL: https://issues.apache.org/jira/browse/CALCITE-7375
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.41.0
> Reporter: lincoln lee
> Assignee: lincoln lee
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.42.0
>
>
> In CALCITE-6746, the fix for updating column indices during
> ProjectWindowTransposeRule project pushdown only synchronized the input field
> requirements, but did not update the column indices referenced by the window
> bounds. The issue was masked in the added test case because the indexed
> column was not affected by the pushdown.
> We can construct a nested constant window case to product the error:
> {code}
> @Test void testNestedConstantWindow() {
> final String sql =
> "select deptno, f1, f2 from (\n"
> + "select *, last_value(deptno) over"
> + " (order by empno ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING)
> f2\n"
> + "from (\n"
> + " select *, first_value(deptno) over "
> + " (order by empno ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING)
> f1 from emp))\n";;
> sql(sql)
> .withPreRule(CoreRules.PROJECT_TO_LOGICAL_PROJECT_AND_WINDOW)
> .withRule(CoreRules.PROJECT_WINDOW_TRANSPOSE)
> .check();
> }
> {code}
> the incorrect plan:
> {code}
> LogicalProject(DEPTNO=[$1], F1=[$2], F2=[$3])
> LogicalWindow(window#0=[window(order by [0] rows between $3 PRECEDING and
> $4 FOLLOWING aggs [LAST_VALUE($1)])], constants=[[2, 1]])
> LogicalWindow(window#0=[window(order by [0] rows between $9 PRECEDING and
> $10 FOLLOWING aggs [FIRST_VALUE($1)])], constants=[[2, 1]])
> LogicalProject(EMPNO=[$0], DEPTNO=[$7])
> LogicalTableScan(table=[[CATALOG, SALES, EMP]])
> {code}
> correct plan should be:
> {code}
> LogicalProject(DEPTNO=[$1], F1=[$2], F2=[$3])
> LogicalWindow(window#0=[window(order by [0] rows between $3 PRECEDING and
> $4 FOLLOWING aggs [LAST_VALUE($1)])], constants=[[2, 1]])
> LogicalWindow(window#0=[window(order by [0] rows between $2 PRECEDING and
> $3 FOLLOWING aggs [FIRST_VALUE($1)])], constants=[[2, 1]])
> LogicalProject(EMPNO=[$0], DEPTNO=[$7])
> LogicalTableScan(table=[[CATALOG, SALES, EMP]])
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)