Lino Rosa created CALCITE-6655:
----------------------------------

             Summary: 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


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