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

rubenql 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 e9d302f  [CALCITE-3837] AntiJoin with empty right input can always be 
transformed as its left input
e9d302f is described below

commit e9d302ffe37531c3e8eb5f657f236fe14d79992e
Author: rubenada <rube...@gmail.com>
AuthorDate: Mon Mar 2 14:17:05 2020 +0100

    [CALCITE-3837] AntiJoin with empty right input can always be transformed as 
its left input
---
 .../main/java/org/apache/calcite/rel/rules/PruneEmptyRules.java    | 7 ++-----
 core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java    | 2 +-
 .../src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml | 4 +---
 3 files changed, 4 insertions(+), 9 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/PruneEmptyRules.java 
b/core/src/main/java/org/apache/calcite/rel/rules/PruneEmptyRules.java
index a8838d8..62e872e 100644
--- a/core/src/main/java/org/apache/calcite/rel/rules/PruneEmptyRules.java
+++ b/core/src/main/java/org/apache/calcite/rel/rules/PruneEmptyRules.java
@@ -338,11 +338,8 @@ public abstract class PruneEmptyRules {
             return;
           }
           if (join.getJoinType() == JoinRelType.ANTI) {
-            // "select * from emp anti join dept" is not necessarily empty if 
dept is empty
-            if (join.analyzeCondition().isEqui()) {
-              // In case of anti (equi) join: Join(X, Empty, ANTI) becomes X
-              call.transformTo(join.getLeft());
-            }
+            // In case of anti join: Join(X, Empty, ANTI) becomes X
+            call.transformTo(join.getLeft());
             return;
           }
           call.transformTo(call.builder().push(join).empty().build());
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java 
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index 829a580..728e1fc 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -3344,7 +3344,7 @@ public class RelOptRulesTest extends RelOptTestBase {
     final String planAfter = NL + RelOptUtil.toString(output);
     final DiffRepository diffRepos = getDiffRepos();
     diffRepos.assertEquals("planBefore", "${planBefore}", planBefore);
-    // Cannot optimize away the join because it is not equi join.
+    // Plan should be scan("EMP") (i.e. join's left child)
     diffRepos.assertEquals("planAfter", "${planAfter}", planAfter);
   }
 
diff --git 
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml 
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index e18ce5a..bd22930 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -3133,9 +3133,7 @@ LogicalProject(EMPNO=[$0])
         <Resource name="planAfter">
             <![CDATA[
 LogicalProject(EMPNO=[$0])
-  LogicalJoin(condition=[AND(=($7, $8), =($5, 2000))], joinType=[anti])
-    LogicalTableScan(table=[[scott, EMP]])
-    LogicalValues(tuples=[[]])
+  LogicalTableScan(table=[[scott, EMP]])
 ]]>
         </Resource>
     </TestCase>

Reply via email to