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>