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

Haisheng Yuan commented on CALCITE-3087:
----------------------------------------

I saw you opened a PR, but I think adding a project after UnifyAggregate is too 
late, because it can still cause wrong result, think about ROLLUP. In the case 
of CUBE, it is OK, because we are going to generate all the combinations, but 
for ROLLUP, or GROUPING SETS, it might be wrong. We need to keep the Project 
immediately on top of target Aggregate in order to utilize the materialization 
and ensure the correctness at the same time. What do you think?

> AggregateOnProjectToAggregateUnifyRule cannot ignore Project 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: 10m
>  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