[CALCITE-4774] Materialized view recognition fails for equivalent predicates (dz)
Close #2514
diff --git a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
index 1ad33f2..e0f78b0 100644
--- a/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/SubstitutionVisitor.java
@@ -285,6 +285,8 @@
public static @Nullable RexNode splitFilter(final RexSimplify simplify,
RexNode condition, RexNode target) {
final RexBuilder rexBuilder = simplify.rexBuilder;
+ condition = simplify.simplify(condition);
+ target = simplify.simplify(target);
RexNode condition2 = canonizeNode(rexBuilder, condition);
RexNode target2 = canonizeNode(rexBuilder, target);
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 f5f71f5..bed699f 100644
--- a/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java
+++ b/core/src/test/java/org/apache/calcite/test/MaterializedViewSubstitutionVisitorTest.java
@@ -1575,6 +1575,38 @@
sql(mv, query).ok();
}
+ @Test void testRexPredicate() {
+ final String mv = ""
+ + "select \"name\"\n"
+ + "from \"emps\"\n"
+ + "where \"deptno\" > 100 and \"deptno\" > 50\n"
+ + "group by \"name\"";
+ final String query = ""
+ + "select \"name\"\n"
+ + "from \"emps\"\n"
+ + "where \"deptno\" > 100"
+ + "group by \"name\"";
+ sql(mv, query).withChecker(
+ resultContains(""
+ + "EnumerableTableScan(table=[[hr, MV0]])")).ok();
+ }
+
+ @Test void testRexPredicate1() {
+ final String query = ""
+ + "select \"name\"\n"
+ + "from \"emps\"\n"
+ + "where \"deptno\" > 100 and \"deptno\" > 50\n"
+ + "group by \"name\"";
+ final String mv = ""
+ + "select \"name\"\n"
+ + "from \"emps\"\n"
+ + "where \"deptno\" > 100"
+ + "group by \"name\"";
+ sql(mv, query).withChecker(
+ resultContains(""
+ + "EnumerableTableScan(table=[[hr, MV0]])")).ok();
+ }
+
final JavaTypeFactoryImpl typeFactory =
new JavaTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
private final RexBuilder rexBuilder = new RexBuilder(typeFactory);