You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by hy...@apache.org on 2019/10/11 20:43:09 UTC

[calcite] branch master updated: [CALCITE-3396] Materialized view matches unexpectedly for UNION with different 'all' property (Jin Xing)

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

hyuan 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 c7ab646  [CALCITE-3396] Materialized view matches unexpectedly for UNION with different 'all' property (Jin Xing)
c7ab646 is described below

commit c7ab64688f611f599d3b0d07340680e968c7ccf8
Author: jinxing <ji...@gmail.com>
AuthorDate: Thu Oct 10 17:14:31 2019 +0800

    [CALCITE-3396] Materialized view matches unexpectedly for UNION with different 'all' property (Jin Xing)
    
    Materialized-View:
    select * from emps where empid < 300
    union
    select * from emps where empid > 200
    
    Query:
    select * from emps where empid < 300
    union all
    select * from emps where empid > 200
    
    Above MV and Query have different 'all' property in UNION but they succeed
    matching now.  This patch added a check in UnionToUnionUnifyRule.
    
    Close #1493
---
 .../calcite/plan/MaterializedViewSubstitutionVisitor.java |  3 ++-
 .../java/org/apache/calcite/test/MaterializationTest.java | 15 ++++++++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/plan/MaterializedViewSubstitutionVisitor.java b/core/src/main/java/org/apache/calcite/plan/MaterializedViewSubstitutionVisitor.java
index c24da6f..3b29726 100644
--- a/core/src/main/java/org/apache/calcite/plan/MaterializedViewSubstitutionVisitor.java
+++ b/core/src/main/java/org/apache/calcite/plan/MaterializedViewSubstitutionVisitor.java
@@ -199,7 +199,8 @@ public class MaterializedViewSubstitutionVisitor extends SubstitutionVisitor {
       final MutableUnion target = (MutableUnion) call.target;
       List<MutableRel> queryInputs = query.getInputs();
       List<MutableRel> targetInputs = target.getInputs();
-      if (queryInputs.size() == targetInputs.size()) {
+      if (query.isAll() == target.isAll()
+          && queryInputs.size() == targetInputs.size()) {
         for (MutableRel rel: queryInputs) {
           int index = targetInputs.indexOf(rel);
           if (index == -1) {
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 0175f74..a46fabe 100644
--- a/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
+++ b/core/src/test/java/org/apache/calcite/test/MaterializationTest.java
@@ -2468,12 +2468,25 @@ public class MaterializationTest {
     checkMaterialize(sql, sql);
   }
 
-  @Test public void testUnionToUnion() {
+  @Test public void testUnionAllToUnionAll() {
     String sql0 = "select * from \"emps\" where \"empid\" < 300";
     String sql1 = "select * from \"emps\" where \"empid\" > 200";
     checkMaterialize(sql0 + " union all " + sql1, sql1 + " union all " + sql0);
   }
 
+  @Test public void testUnionDistinctToUnionDistinct() {
+    String sql0 = "select * from \"emps\" where \"empid\" < 300";
+    String sql1 = "select * from \"emps\" where \"empid\" > 200";
+    checkMaterialize(sql0 + " union " + sql1, sql1 + " union " + sql0);
+  }
+
+  @Test public void testUnionDistinctToUnionAll() {
+    String sql0 = "select * from \"emps\" where \"empid\" < 300";
+    String sql1 = "select * from \"emps\" where \"empid\" > 200";
+    checkNoMaterialize(sql0 + " union " + sql1, sql0 + " union all " + sql1,
+        HR_FKUK_MODEL);
+  }
+
   private static <E> List<List<List<E>>> list3(E[][][] as) {
     final ImmutableList.Builder<List<List<E>>> builder =
         ImmutableList.builder();