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"