[ 
https://issues.apache.org/jira/browse/CALCITE-6655?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mihai Budiu resolved CALCITE-6655.
----------------------------------
    Fix Version/s: 1.39.0
       Resolution: Fixed

Fixed in 
[https://github.com/apache/calcite/commit/2e99d5118efbba21c87e7da08b8359ce296e138d]

Thank you for your contribution [~linorosa] 

> Aggregation of deeply nested window not detected when unparsing
> ---------------------------------------------------------------
>
>                 Key: CALCITE-6655
>                 URL: https://issues.apache.org/jira/browse/CALCITE-6655
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.39.0
>            Reporter: Lino Rosa
>            Assignee: Lino Rosa
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 1.39.0
>
>
> Given a query such as the below:
> {code:java}
> WITH
>   window_cte AS (
>     SELECT
>       foo,
>       SUM(baz) OVER (PARTITION BY foo) AS window_agg
>     FROM
>       sample_data
>   )
> SELECT
>   SUM(window_agg) AS bazzy
> FROM
>   window_cte {code}
> When `baz` is {_}*optional*{_}, Calcite will wrap the inner function within a 
> `CASE` statement. Something like:
> {code:java}
> CASE
>   WHEN (
>     COUNT(baz) OVER (
>       PARTITION BY
>         foo RANGE BETWEEN UNBOUNDED PRECEDING
>         AND UNBOUNDED FOLLOWING
>     )
>   ) > 0 THEN COALESCE(
>     SUM(baz) OVER (
>       PARTITION BY
>         foo
>       ORDER BY
>         RAND () NULLS LAST RANGE BETWEEN UNBOUNDED PRECEDING
>         AND UNBOUNDED FOLLOWING
>     ),
>     0
>   )
>   ELSE NULL
> END{code}
> Nothing intrinsically wrong with that substitution. However because of it the 
> inner aggregation function `SUM(baz) OVER...` has become +deeply nested+ 
> under the `CASE` statement.
> Where that becomes an issue is inside `SqlImplemtor#Result#hasNested`. That 
> function is supposed to look for nested aggregates, but it only looks at the 
> top level. In this case it'll stop at the `CASE` statement, erroneously 
> concluding there's no nested aggregate. In the end it'll collapse the cte 
> from the original query into a `SUM(CASE(... SUM(...)))` which will fail 
> running in dialects such as Spark.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to