[ 
https://issues.apache.org/jira/browse/CALCITE-3087?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16856357#comment-16856357
 ] 

Feng Zhu commented on CALCITE-3087:
-----------------------------------

Thanks for insightful comments and test case. I made a mistake. The posList for 
creating Project should be generated by mapping.inverse.
When tracking this issue, I also found an issue in _MutableRels.createProject_. 
RowType and RexNode list are inconsistent.
{code:java}
Query
===========================================================================================
Aggregate(groupSet: {0, 1, 2}, groupSets: [{0, 1, 2}, {0, 1}, {0}, {}], calls: 
[COUNT()])
  Project(projects: [$1, $2, $0])
    Project(projects: [$3, $0, $1, $4])
      Scan(table: [hr, emps])

target
===========================================================================================
Aggregate(groupSet: {0, 1, 2}, groupSets: [{0, 1, 2}], calls: [COUNT(), 
SUM($3)])
  Project(projects: [$3, $0, $1, $4])
    Scan(table: [hr, emps])

mapping: [0->2, 1->0, 2->1]
mapping reverse: [2->0, 0->1, 1->2]
posList: [1, 2, 0]{code}

> AggregateOnProjectToAggregateUnifyRule ignores Project incorrectly when its 
> Mapping breaks ordering
> ---------------------------------------------------------------------------------------------------
>
>                 Key: CALCITE-3087
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3087
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>            Reporter: Haisheng Yuan
>            Assignee: Feng Zhu
>            Priority: Major
>              Labels: pull-request-available
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> Add the following test to MaterializationTest:
> {code:java}
> @Test public void testAggregateGroupSetsRollUp0() {
>     checkMaterialize(
>         "select \"empid\", \"deptno\", count(*) as c, sum(\"salary\") as s 
> from \"emps\" "
>             + "group by \"empid\", \"deptno\"",
>         "select count(*) + 1 as c,  \"deptno\" from \"emps\" group by 
> cube(\"deptno\", \"empid\")",
>         HR_FKUK_MODEL,
>         CalciteAssert.checkResultContains(
>             "EnumerableCalc(expr#0..2=[{inputs}], expr#3=[1], "
>                 + "expr#4=[+($t2, $t3)], C=[$t4], deptno=[$t1])\n"
>                 + "  EnumerableAggregate(group=[{0, 1}], groups=[[{0, 1}, 
> {0}, {1}, {}]], agg#0=[$SUM0($2)])\n"
>                 + "    EnumerableTableScan(table=[[hr, m0]])"));
>   }
> {code}
> We got error:
> {code:java}
> Caused by: java.lang.IllegalArgumentException: must be sorted: [{0, 1}, {1}, 
> {0}, {}]
>       at 
> org.apache.calcite.rel.core.Aggregate$Group.induce(Aggregate.java:472)
>       at 
> org.apache.calcite.rel.mutable.MutableAggregate.getGroupType(MutableAggregate.java:83)
>       at 
> org.apache.calcite.plan.SubstitutionVisitor.unifyAggregates(SubstitutionVisitor.java:1281)
>       at 
> org.apache.calcite.plan.SubstitutionVisitor$AggregateOnProjectToAggregateUnifyRule.apply(SubstitutionVisitor.java:1345)
>       at 
> org.apache.calcite.plan.SubstitutionVisitor.go(SubstitutionVisitor.java:531)
>       at 
> org.apache.calcite.plan.SubstitutionVisitor.go(SubstitutionVisitor.java:466)
>       at 
> org.apache.calcite.plan.MaterializedViewSubstitutionVisitor.go(MaterializedViewSubstitutionVisitor.java:56)
>       at 
> org.apache.calcite.plan.RelOptMaterializations.substitute(RelOptMaterializations.java:200)
>       at 
> org.apache.calcite.plan.RelOptMaterializations.useMaterializedViews(RelOptMaterializations.java:72)
>       at 
> org.apache.calcite.plan.volcano.VolcanoPlanner.registerMaterializations(VolcanoPlanner.java:348)
>       at 
> org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:584)
> {code}
> The reason is that Mappings.apply2 doesn't sort.



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

Reply via email to