Repository: calcite Updated Branches: refs/heads/master 25d1e42a7 -> 8c90d8621
[CALCITE-1109] Fix up condition when pushing Filter through Aggregate (Amogh Margoor) Close apache/calcite#201 Project: http://git-wip-us.apache.org/repos/asf/calcite/repo Commit: http://git-wip-us.apache.org/repos/asf/calcite/commit/8c90d862 Tree: http://git-wip-us.apache.org/repos/asf/calcite/tree/8c90d862 Diff: http://git-wip-us.apache.org/repos/asf/calcite/diff/8c90d862 Branch: refs/heads/master Commit: 8c90d862179f43ab8855f4ff50cbc1d5968b21a2 Parents: 25d1e42 Author: Amogh Margoor <[email protected]> Authored: Sun Feb 28 06:01:45 2016 -0500 Committer: Julian Hyde <[email protected]> Committed: Mon Feb 29 15:52:19 2016 -0800 ---------------------------------------------------------------------- .../rel/rules/FilterAggregateTransposeRule.java | 5 +++++ .../apache/calcite/test/RelOptRulesTest.java | 18 ++++++++++++++++ .../org/apache/calcite/test/RelOptRulesTest.xml | 22 ++++++++++++++++++++ 3 files changed, 45 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/calcite/blob/8c90d862/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java b/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java index efdb06e..6347cbf 100644 --- a/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java +++ b/core/src/main/java/org/apache/calcite/rel/rules/FilterAggregateTransposeRule.java @@ -91,6 +91,11 @@ public class FilterAggregateTransposeRule extends RelOptRule { final List<RelDataTypeField> origFields = aggRel.getRowType().getFieldList(); final int[] adjustments = new int[origFields.size()]; + int j = 0; + for (int i : aggRel.getGroupSet()) { + adjustments[j] = i - j; + j++; + } final List<RexNode> pushedConditions = Lists.newArrayList(); final List<RexNode> remainingConditions = Lists.newArrayList(); http://git-wip-us.apache.org/repos/asf/calcite/blob/8c90d862/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 0e0e5a0..7bd85cb 100644 --- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java +++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java @@ -328,6 +328,24 @@ public class RelOptRulesTest extends RelOptTestBase { } /** Test case for + * <a href="https://issues.apache.org/jira/browse/CALCITE-1109">[CALCITE-1109] + * FilterAggregateTransposeRule pushes down incorrect condition</a>. */ + @Test public void testPushFilterPastAggFour() { + final HepProgram preProgram = + HepProgram.builder() + .addRuleInstance(AggregateProjectMergeRule.INSTANCE) + .addRuleInstance(AggregateFilterTransposeRule.INSTANCE) + .build(); + final HepProgram program = + HepProgram.builder() + .addRuleInstance(FilterAggregateTransposeRule.INSTANCE) + .build(); + checkPlanning(tester, preProgram, new HepPlanner(program), + "select emp.deptno, count(*) from emp where emp.sal > '12' " + + "group by emp.deptno\n", false); + } + + /** Test case for * <a href="https://issues.apache.org/jira/browse/CALCITE-448">[CALCITE-448] * FilterIntoJoinRule creates filters containing invalid RexInputRef</a>. */ @Test public void testPushFilterPastProject() { http://git-wip-us.apache.org/repos/asf/calcite/blob/8c90d862/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 49ef891..c138c3f 100644 --- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml +++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml @@ -2333,6 +2333,28 @@ UnionRel(all=[true]) ]]> </Resource> </TestCase> + <TestCase name="testPushFilterPastAggFour"> + <Resource name="sql"> + <![CDATA[select emp.deptno, count(*) from emp where emp.sal > '12' group by emp.deptno +]]> + </Resource> + <Resource name="planBefore"> + <![CDATA[ +LogicalAggregate(group=[{1}], EXPR$1=[$SUM0($2)]) + LogicalFilter(condition=[>(CAST($0):BIGINT NOT NULL, CAST('12'):BIGINT NOT NULL)]) + LogicalAggregate(group=[{5, 7}], EXPR$1=[COUNT()]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + <Resource name="planAfter"> + <![CDATA[ +LogicalAggregate(group=[{1}], EXPR$1=[$SUM0($2)]) + LogicalAggregate(group=[{5, 7}], EXPR$1=[COUNT()]) + LogicalFilter(condition=[>(CAST($5):BIGINT NOT NULL, CAST('12'):BIGINT NOT NULL)]) + LogicalTableScan(table=[[CATALOG, SALES, EMP]]) +]]> + </Resource> + </TestCase> <TestCase name="testTransitiveInferenceJoin"> <Resource name="sql"> <![CDATA[select 1 from sales.emp d inner join sales.emp e on d.deptno = e.deptno where e.deptno > 7]]>
