[
https://issues.apache.org/jira/browse/CALCITE-1338?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15404364#comment-15404364
]
Julian Hyde commented on CALCITE-1338:
--------------------------------------
Not just literals. Here are some cases:
* Can not pull up a literal
* Can pull up column {{x}}
* Can pull up {{x + 1}} (because if {{x}} is null due to an outer, then {{x +
1}} will be null also, because of the strictness of {{+}})
* Can not pull up {{x IS NOT NULL}} (because the {{IS NOT NULL}} function is
not strict: it produces a not-null value when given a null argument).
{{CASE}}, {{NULLIF}} and {{COALESCE}} are other non-strict operators.
I believe the rule is that you can pull up an expression iff it is strict in
all arguments that are columns. (Can someone check my logic?)
> JoinProjectTransposeRule makes wrong transformation when the right child of
> left outer join has a RexLiteral project expression.
> --------------------------------------------------------------------------------------------------------------------------------
>
> Key: CALCITE-1338
> URL: https://issues.apache.org/jira/browse/CALCITE-1338
> Project: Calcite
> Issue Type: Bug
> Components: core
> Reporter: YI XINGLU
> Assignee: Julian Hyde
>
> h3. SQL:
> {code:borderStyle=solid}
> SELECT *
> FROM dept a
> LEFT JOIN (
> SELECT b.name, 1 FROM dept b
> ) AS b
> ON a.name=b.name
> {code}
> h3. Selected rule set:
> {code:borderStyle=solid}
> SubQueryRemoveRule.JOIN
> JoinProjectTransposeRule.RIGHT_PROJECT_INCLUDE_OUTER
> {code}
> h3. Optimized logical plan:
> {code:borderStyle=solid}
> LogicalProject(DEPTNO=[$0], NAME=[$1], NAME0=[$2], EXPR$1=[$3])
> LogicalProject(DEPTNO=[$0], NAME=[$1], NAME0=[$2],
> EXPR$1=[CAST($3):INTEGER])
> LogicalProject(DEPTNO=[$0], NAME=[$1], NAME0=[$3], EXPR$1=[1])
> LogicalJoin(condition=[=($3, $1)], joinType=[left])
> LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
> LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
> {code}
> h3. The right logical plan should be
> {code:borderStyle=solid}
> LogicalProject(DEPTNO=[$0], NAME=[$1], NAME0=[$2], EXPR$1=[$3])
> LogicalJoin(condition=[=($2, $1)], joinType=[left])
> LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
> LogicalProject(NAME=[$1], EXPR$1=[1])
> LogicalTableScan(table=[[CATALOG, SALES, DEPT]])
> {code}
> h3. Summary
> The RexLiteral project expression will make logical plan get different
> results when it's right child or parent node of left outer join.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)