This is an automated email from the ASF dual-hosted git repository.

jcamacho pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new 0e345fd  [CALCITE-3862] Materialized view rewriting algorithm throws 
IndexOutOfBoundsException (Vineet Garg)
0e345fd is described below

commit 0e345fd8d9eaa4223ada8ecc2987a7c82cb0d2b8
Author: Vineet Garg <[email protected]>
AuthorDate: Sun Mar 15 15:51:39 2020 -0700

    [CALCITE-3862] Materialized view rewriting algorithm throws 
IndexOutOfBoundsException (Vineet Garg)
    
    Query consists of group by on join keys and aggregate function.
    
    Close apache/calcite#1858
---
 .../rules/materialize/MaterializedViewAggregateRule.java | 16 +++++++++++-----
 .../org/apache/calcite/test/MaterializationTest.java     | 15 +++++++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewAggregateRule.java
 
b/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewAggregateRule.java
index d835934..f13e75d 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewAggregateRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/materialize/MaterializedViewAggregateRule.java
@@ -673,15 +673,21 @@ public abstract class MaterializedViewAggregateRule 
extends MaterializedViewRule
       rewritingMapping = rewritingMappingB.build();
       final ImmutableMultimap<Integer, Integer> inverseMapping = 
rewritingMapping.inverse();
       final List<RexNode> projects = new ArrayList<>();
+
+      final ImmutableBitSet.Builder addedProjects = ImmutableBitSet.builder();
       for (int i = 0; i < queryAggregate.getGroupCount(); i++) {
+        int pos = groupSet.indexOf(inverseMapping.get(i).iterator().next());
+        addedProjects.set(pos);
         projects.add(
-            rexBuilder.makeInputRef(result,
-                groupSet.indexOf(inverseMapping.get(i).iterator().next())));
+            rexBuilder.makeInputRef(result, pos));
       }
+
+      ImmutableBitSet projectedCols = addedProjects.build();
       // We add aggregate functions that are present in result to projection 
list
-      for (int i = queryAggregate.getGroupCount(); i < 
result.getRowType().getFieldCount(); i++) {
-        projects.add(
-            rexBuilder.makeInputRef(result, i));
+      for (int i = 0; i < result.getRowType().getFieldCount(); i++) {
+        if (!projectedCols.get(i)) {
+          projects.add(rexBuilder.makeInputRef(result, i));
+        }
       }
       result = relBuilder
           .push(result)
diff --git 
a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java 
b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
index 4270115..09b1a2e 100644
--- a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
+++ b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
@@ -2526,6 +2526,21 @@ public class MaterializationTest {
         .ok();
   }
 
+  @Test public void testAggregateOnJoinKeys2() {
+    sql("select \"deptno\", \"empid\", \"salary\", sum(1) "
+            + "from \"emps\"\n"
+            + "group by \"deptno\", \"empid\", \"salary\"",
+        "select sum(1) "
+            + "from \"emps\"\n"
+            + "join \"depts\" on \"depts\".\"deptno\" = \"empid\" group by 
\"empid\", \"depts\".\"deptno\"")
+        .withResultContains(
+            "EnumerableCalc(expr#0..1=[{inputs}], EXPR$0=[$t1])\n"
+                + "  EnumerableAggregate(group=[{1}], EXPR$0=[$SUM0($3)])\n"
+                + "    EnumerableHashJoin(condition=[=($1, $4)], 
joinType=[inner])\n"
+                + "      EnumerableTableScan(table=[[hr, m0]])")
+        .ok();
+  }
+
   @Test public void testViewMaterialization() {
     sql("select \"depts\".\"name\"\n"
             + "from \"emps\"\n"

Reply via email to