[
https://issues.apache.org/jira/browse/CALCITE-5388?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jess Balint closed CALCITE-5388.
--------------------------------
Resolved in release 1.33.0 (2023-02-06)
> tempList expression inside EnumerableWindow.getPartitionIterator should be
> unoptimized
> --------------------------------------------------------------------------------------
>
> Key: CALCITE-5388
> URL: https://issues.apache.org/jira/browse/CALCITE-5388
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.32.0
> Reporter: Magnus Mogren
> Assignee: Dmitry Sysolyatin
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.33.0
>
> Time Spent: 2h 40m
> Remaining Estimate: 0h
>
> EnumerableWindow.getPartitionIterator method creates expression for creating
> 'tempList' array [1] and EnumerableWindow.implement method creates expression
> for clearing this 'tempList'. Because state of created collection is mutable,
> the collection can not be reused in other instance of EnumerableWindow but it
> happens in the following use case:
> {code:java}
> with
> CTE1(rownr1, val1) as ( select ROW_NUMBER() OVER(ORDER BY id ASC), id
> from (values (1), (2)) as Vals1(id) ),
> CTE2(rownr2, val2) as ( select ROW_NUMBER() OVER(ORDER BY id ASC), id
> from (values (1), (2)) as Vals2(id) )
> select
> CTE1.rownr1,
> CTE1.val1,
> CTE2.rownr2,
> CTE2.val2
> from
> CTE1,
> CTE2
> where
> CTE1.val1 = CTE2.val2{code}
> Generated plan:
> {code}
> EnumerableHashJoin(condition=[=($1, $3)], joinType=[inner])
> EnumerableSort(sort0=[$1], dir0=[ASC])
> EnumerableCalc(expr#0..1=[{inputs}], EXPR$0=[$t1], ID=[$t0])
> EnumerableWindow(window#0=[window(order by [0] rows between UNBOUNDED
> PRECEDING and CURRENT ROW aggs [ROW_NUMBER()])])
> EnumerableValues(tuples=[[{ 1 }, { 2 }]])
> EnumerableSort(sort0=[$1], dir0=[ASC])
> EnumerableCalc(expr#0..1=[{inputs}], EXPR$0=[$t1], ID=[$t0])
> EnumerableWindow(window#0=[window(order by [0] rows between UNBOUNDED
> PRECEDING and CURRENT ROW aggs [ROW_NUMBER()])])
> EnumerableValues(tuples=[[{ 1 }, { 2 }]])
> {code}
> Calcite expression optimizer tries to remove duplicate expressions and as a
> result the same 'tempList' instance is used for both EnumerableWindow and the
> query returns empty result instead of:
> |ROWNR1|VAL1|VAL2|
> |1|1|1|
> |2|2|2|
> [1]
> https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableWindow.java#L677
> [2]
> https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableWindow.java#L696
> [3]
> https://github.com/apache/calcite/blob/main/core/src/main/java/org/apache/calcite/adapter/enumerable/EnumerableWindow.java#L518
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)