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">
             <![CDATA[select ename from (

Reply via email to