You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Haisheng Yuan (JIRA)" <ji...@apache.org> on 2019/06/03 17:17:00 UTC

[jira] [Commented] (CALCITE-3087) AggregateOnProjectToAggregateUnifyRule cannot ignore Project when its Mapping breaks ordering

    [ 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)