Volodymyr Vysotskyi created CALCITE-1944:
--------------------------------------------

             Summary: Wrong plan for query with window functions and subquery 
with star
                 Key: CALCITE-1944
                 URL: https://issues.apache.org/jira/browse/CALCITE-1944
             Project: Calcite
          Issue Type: Bug
          Components: core
    Affects Versions: 1.13.0
            Reporter: Volodymyr Vysotskyi
            Assignee: Julian Hyde


*Problem description*
Calcite builds the wrong plan for the query with a window function and subquery 
with a star:
{code:sql}
SELECT SUM(n_nationkey) OVER w
FROM
  (SELECT *
   FROM SALES.NATION) subQry WINDOW w AS (PARTITION BY REGION
                                          ORDER BY n_nationkey)
{code}  
Plan:
{noformat}
LogicalProject(EXPR$0=[CASE(>(COUNT(ITEM($0, 'N_NATIONKEY')) OVER (PARTITION BY 
$0 ORDER BY $0 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 0), 
$SUM0(ITEM($0, 'N_NATIONKEY')) OVER (PARTITION BY $0 ORDER BY $0 RANGE BETWEEN 
UNBOUNDED PRECEDING AND CURRENT ROW), null)])
  LogicalProject(**=[$0])
    LogicalTableScan(table=[[CATALOG, SALES, NATION]])
{noformat}
Columns in PARTITION BY and ORDER BY clauses are {{$0}} but they should be 
{{ITEM($0, 'REGION')}} and {{ITEM($0, 'N_NATIONKEY')}} respectively.
So correct plan should be
{noformat}
LogicalProject(EXPR$0=[CASE(>(COUNT(ITEM($0, 'N_NATIONKEY')) OVER (PARTITION BY 
ITEM($0, 'REGION') ORDER BY ITEM($0, 'N_NATIONKEY') RANGE BETWEEN UNBOUNDED 
PRECEDING AND CURRENT ROW), 0), $SUM0(ITEM($0, 'N_NATIONKEY')) OVER (PARTITION 
BY ITEM($0, 'REGION') ORDER BY ITEM($0, 'N_NATIONKEY') RANGE BETWEEN UNBOUNDED 
PRECEDING AND CURRENT ROW), null)])
  LogicalProject(**=[$0])
    LogicalTableScan(table=[[CATALOG, SALES, NATION]])
{noformat}

*Root cause*
In CALCITE-1150 added dynamic star column and dynamic record type support but 
[SqlValidatorImpl.validateWindowClause()|https://github.com/apache/calcite/blob/01c5446138d419a85678bff7db06eabb4cd39846/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java#L3354]
 method does not call [expand(SqlNode expr, SqlValidatorScope 
scope)|https://github.com/apache/calcite/blob/01c5446138d419a85678bff7db06eabb4cd39846/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java#L4795]
 for columns in partition and order lists. 

Therefore when executes this line 
[windowList.validate(this, 
windowScope);|https://github.com/apache/calcite/blob/01c5446138d419a85678bff7db06eabb4cd39846/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java#L3392]
 
in the [validateIdentifier(SqlIdentifier id, SqlValidatorScope 
scope)|https://github.com/apache/calcite/blob/01c5446138d419a85678bff7db06eabb4cd39846/core/src/main/java/org/apache/calcite/sql/validate/SqlValidatorImpl.java#L2778]
 method simple field name is replaced by the star field. 



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to