Repository: calcite Updated Branches: refs/heads/master e365eabc6 -> d881d4776
[CALCITE-2232] Assertion error on AggregatePullUpConstantsRule while adjusting Aggregate indices Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/d881d477 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/d881d477 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/d881d477 Branch: refs/heads/master Commit: d881d47766e8162dbdd4deb40a64b1138a4acec4 Parents: e365eab Author: Jesus Camacho Rodriguez <[email protected]> Authored: Thu Mar 29 18:12:57 2018 -0700 Committer: Jesus Camacho Rodriguez <[email protected]> Committed: Thu Mar 29 18:17:13 2018 -0700 ---------------------------------------------------------------------- .../AggregateProjectPullUpConstantsRule.java | 27 +++++++++++--------- .../apache/calcite/test/RelOptRulesTest.java | 13 ++++++++++ .../org/apache/calcite/test/RelOptRulesTest.xml | 22 ++++++++++++++++ 3 files changed, 50 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/d881d477/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java b/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java index 9074e81..eda2b20 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/AggregateProjectPullUpConstantsRule.java @@ -165,20 +165,23 @@ public class AggregateProjectPullUpConstantsRule extends RelOptRule { if (i >= groupCount) { // Aggregate expressions' names and positions are unchanged. expr = relBuilder.field(i - map.size()); - } else if (map.containsKey(i)) { - // Re-generate the constant expression in the project. - RelDataType originalType = - aggregate.getRowType().getFieldList().get(projects.size()).getType(); - if (!originalType.equals(map.get(i).getType())) { - expr = rexBuilder.makeCast(originalType, map.get(i), true); + } else { + int pos = aggregate.getGroupSet().nth(i); + if (map.containsKey(pos)) { + // Re-generate the constant expression in the project. + RelDataType originalType = + aggregate.getRowType().getFieldList().get(projects.size()).getType(); + if (!originalType.equals(map.get(pos).getType())) { + expr = rexBuilder.makeCast(originalType, map.get(pos), true); + } else { + expr = map.get(pos); + } } else { - expr = map.get(i); + // Project the aggregation expression, in its original + // position. + expr = relBuilder.field(source); + ++source; } - } else { - // Project the aggregation expression, in its original - // position. - expr = relBuilder.field(source); - ++source; } projects.add(Pair.of(expr, field.getName())); } http://git-wip-us.apache.org/repos/asf/calcite/blob/d881d477/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java index 24adbb6..682758e 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -2846,6 +2846,19 @@ public class RelOptRulesTest extends RelOptTestBase { checkPlanning(program, sql); } + @Test public void testAggregateProjectPullUpConstants2() { + final HepProgram preProgram = new HepProgramBuilder() + .addRuleInstance(AggregateProjectMergeRule.INSTANCE) + .build(); + HepProgram program = new HepProgramBuilder() + .addRuleInstance(AggregateProjectPullUpConstantsRule.INSTANCE2) + .build(); + final String sql = "select ename, sal\n" + + "from (select '1', ename, sal from emp where ename = 'John') subq\n" + + "group by ename, sal"; + checkPlanning(tester, preProgram, new HepPlanner(program), sql); + } + @Test public void testPushFilterWithRank() throws Exception { HepProgram program = new HepProgramBuilder() .addRuleInstance(FilterProjectTransposeRule.INSTANCE).build(); http://git-wip-us.apache.org/repos/asf/calcite/blob/d881d477/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml ---------------------------------------------------------------------- diff --git a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml index 290799d..6dd5f5c 100644 --- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml @@ -7987,6 +7987,28 @@ LogicalProject(JOB=[$0], EMPNO=[10], SAL=[$1], S=[$2]) ]]> </Resource> </TestCase> + <TestCase name="testAggregateProjectPullUpConstants2"> + <Resource name="sql"> + <![CDATA[select ename, sal +from (select '1', ename, sal from emp where ename = 'John') subq +group by ename, sal]]> + </Resource> + <Resource name="planBefore"> + <![CDATA[ +LogicalAggregate(group=[{1, 5}]) + LogicalFilter(condition=[=($1, 'John')]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + <Resource name="planAfter"> + <![CDATA[ +LogicalProject(ENAME=['John'], SAL=[$0]) + LogicalAggregate(group=[{5}]) + LogicalFilter(condition=[=($1, 'John')]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + </TestCase> <TestCase name="testWhereExpressionInCorrelated"> <Resource name="sql"> <