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 <[email protected]>
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>