You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Julian Hyde (Jira)" <ji...@apache.org> on 2019/11/16 01:54:00 UTC
[jira] [Comment Edited] (CALCITE-3508) Strengthen outer Join to
inner if it is under a Filter that discards null values
[ https://issues.apache.org/jira/browse/CALCITE-3508?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16975520#comment-16975520 ]
Julian Hyde edited comment on CALCITE-3508 at 11/16/19 1:53 AM:
----------------------------------------------------------------
I changed the subject, because "FILTER clause" is an ambiguous - some people might think it referred to, say, "SUM\(x) FILTER (WHERE y > 0)".
was (Author: julianhyde):
I changed the subject, because "FILTER clause" is an ambiguous - some people might think it referred to, say, "SUM(x) FILTER (WHERE y > 0)".
> Strengthen outer Join to inner if it is under a Filter that discards null values
> --------------------------------------------------------------------------------
>
> Key: CALCITE-3508
> URL: https://issues.apache.org/jira/browse/CALCITE-3508
> Project: Calcite
> Issue Type: Improvement
> Reporter: Scott Reynolds
> Priority: Major
> Labels: pull-request-available
> Time Spent: 10m
> Remaining Estimate: 0h
>
> Today, FilterJoinRule given an Outer Join the rule strengthens it to Inner Join when the nullable side contains a filter IS_NOT_NULL. Below is the code.
> {code:java}
> for (RexNode filter : aboveFilters) {
> if (joinType.generatesNullsOnLeft()
> && Strong.isNotTrue(filter, leftBitmap)) {
> joinType = joinType.cancelNullsOnLeft();
> }
> if (joinType.generatesNullsOnRight()
> && Strong.isNotTrue(filter, rightBitmap)) {
> joinType = joinType.cancelNullsOnRight();
> }
> if (!joinType.isOuterJoin()) {
> break;
> }
> }
> {code}
> This code looks at the filter to determine if it is always true, then it can alter the join type by removing the null on that side.
> We can see this in the following test RelOptRules#testStrengthenJoinType, which executes the following SQL that transforms from a LEFT OUTER JOIN to an INNER JOIN
> {code:sql}
> select *
> from dept left join emp on dept.deptno = emp.deptno
> where emp.deptno is not null and emp.sal > 100
> {code}
> This ticket is about broadening the application of this rule to a sql like the following:
> {code:sql}
> select *
> from dept left join emp on dept.deptno = emp.deptno
> where emp.sal > 100
> {code}
> This originally came up on the mailing list: [https://mail-archives.apache.org/mod_mbox/calcite-dev/201909.mbox/browser]
> and in that thread it was pointed out that there are filters that prevent this from being applied:
> {code:sql}
> SELECT b.title
> FROM Book b
> LEFT JOIN Author a ON b.author = a.id
> WHERE a.name <> 'Victor'
> {code}
> This means we need to ensure we that the OUTER JOIN doesn't contain – for lack of a different term – negation filters. If there is a negation – like NOT_EQUAL – the JOIN cannot be strengthened.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)