calcite-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Feng Zhu (JIRA)" <j...@apache.org>
Subject [jira] [Created] (CALCITE-3079) Successive dependent windows cannot be implemented in same expression level
Date Mon, 20 May 2019 06:24:00 GMT
Feng Zhu created CALCITE-3079:
---------------------------------

             Summary: Successive dependent windows cannot be implemented in same expression
level
                 Key: CALCITE-3079
                 URL: https://issues.apache.org/jira/browse/CALCITE-3079
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.20.0
            Reporter: Feng Zhu


    Recently, we encountered an IndexOutOfBoundsException when running a complicated query
containing successive dependent windows.The issue can be reproduced by the following simple
query on table *t1(a, b, c)*.
{code:java}
Q1:
select sum(s) over (partition by aa) as ss " +
from (
    select a as aa, sum(b) over (partition by a, c) as s
    from t1
    ) t2";{code}
However, the modified query below can be executed in a right way.
{code:java}
Q2:
select sum(s) over (partition by aa) as ss " +
from (
    select a as aa, sum(b) over (partition by a, c) + 0 as s
    from t1
    ) t2{code}
    This issue is caused by *_ProjectToWindowRule_*({color:#FF0000}CalcRelSplitter{color}).
When splitting window expressions in Project node, the rule ignores to check whether a window
and its input window are in the same level.Due to such beheavior, two successive window expressions
are implemented in same level and the RelNode after transformation is:
{code:java}
LogicalProject($0=[$4])
  LogicalWindow(window#0=[window(partition {0, 2} order by [] range between UNBOUNDED PRECEDING
and UNBOUNDED FOLLOWING aggs [SUM($1)])], window#1=[window(partition {0} order by [] range
between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING aggs [SUM($3)])])
    EnumerableTableScan(subset=[rel#7:Subset#0.ENUMERABLE.[]], table=[[ttt, test]]){code}
    As for *Q2*, two window expressions are not "successive", an _*Add(+)*_ operation results
to implementing them in different levels. The RelNode after transformation is:
{code:java}
LogicalProject($0=[$2])
  LogicalWindow(window#0=[window(partition {0} order by [] range between UNBOUNDED PRECEDING
and UNBOUNDED FOLLOWING aggs [SUM($1)])])
    LogicalProject(a=[$0], $1=[+($3, 0)])
      LogicalWindow(window#0=[window(partition {0, 2} order by [] range between UNBOUNDED
PRECEDING and UNBOUNDED FOLLOWING aggs [SUM($1)])])
        EnumerableTableScan(subset=[rel#7:Subset#0.ENUMERABLE.[]], table=[[ttt, test]]){code}
 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message