[CALCITE-4779] GroupByList contains constant literal, materialized view recognition failed (xzh)
diff --git a/core/src/main/java/org/apache/calcite/plan/RelOptMaterializations.java b/core/src/main/java/org/apache/calcite/plan/RelOptMaterializations.java
index f91f560..a75909c 100644
--- a/core/src/main/java/org/apache/calcite/plan/RelOptMaterializations.java
+++ b/core/src/main/java/org/apache/calcite/plan/RelOptMaterializations.java
@@ -215,6 +215,7 @@
.addRuleInstance(CoreRules.PROJECT_REMOVE)
.addRuleInstance(CoreRules.PROJECT_JOIN_TRANSPOSE)
.addRuleInstance(CoreRules.PROJECT_SET_OP_TRANSPOSE)
+ .addRuleInstance(CoreRules.AGGREGATE_PROJECT_PULL_UP_CONSTANTS)
.addRuleInstance(CoreRules.FILTER_TO_CALC)
.addRuleInstance(CoreRules.PROJECT_TO_CALC)
.addRuleInstance(CoreRules.FILTER_CALC_MERGE)
diff --git a/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java b/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java
index e284755..dede0a7 100644
--- a/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java
@@ -1691,6 +1691,33 @@
+ "EnumerableTableScan(table=[[hr, MV0]])")).ok();
}
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-4779">[CALCITE-4779]
+ * GroupByList contains constant literal, materialized view recognition failed</a>. */
+ @Test void testGroupByListContainsConstantLiteral() {
+ // Aggregate operator grouping set contains a literal and count(distinct col) function.
+ final String mv1 = ""
+ + "select \"deptno\", \"empid\"\n"
+ + "from \"emps\"\n"
+ + "group by \"deptno\", \"empid\"";
+ final String query1 = ""
+ + "select 'a', \"deptno\", count(distinct \"empid\")\n"
+ + "from \"emps\"\n"
+ + "group by 'a', \"deptno\"";
+ sql(mv1, query1).ok();
+
+ // Aggregate operator grouping set contains a literal and sum(col) function.
+ final String mv2 = ""
+ + "select \"deptno\", \"empid\", sum(\"empid\")\n"
+ + "from \"emps\"\n"
+ + "group by \"deptno\", \"empid\"";
+ final String query2 = ""
+ + "select 'a', \"deptno\", sum(\"empid\")\n"
+ + "from \"emps\"\n"
+ + "group by 'a', \"deptno\"";
+ sql(mv2, query2).ok();
+ }
+
final JavaTypeFactoryImpl typeFactory =
new JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
private final RexBuilder rexBuilder = new RexBuilder(typeFactory);
@@ -1719,6 +1746,7 @@
.addRuleInstance(CoreRules.PROJECT_REMOVE)
.addRuleInstance(CoreRules.PROJECT_JOIN_TRANSPOSE)
.addRuleInstance(CoreRules.PROJECT_SET_OP_TRANSPOSE)
+ .addRuleInstance(CoreRules.AGGREGATE_PROJECT_PULL_UP_CONSTANTS)
.addRuleInstance(CoreRules.FILTER_TO_CALC)
.addRuleInstance(CoreRules.PROJECT_TO_CALC)
.addRuleInstance(CoreRules.FILTER_CALC_MERGE)