[ 
https://issues.apache.org/jira/browse/CALCITE-3977?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17104543#comment-17104543
 ] 

Ruben Q L commented on CALCITE-3977:
------------------------------------

There is clearly something wrong with the Decorrelator and the field accesses. 
If I try a simple correlate on author birthplace, everything goes fine:
{code}
    b.scan("bookstore", "authors");
    b.variable(cor0);
    b.scan("bookstore", "authors");
    b.filter(b.equals(
            b.field("birthPlace"),
            b.field(cor0.get(), "birthPlace")));
    b.correlate(
        JoinRelType.INNER,
        cor0.get().id,
        b.field(2, 0, "birthPlace"));

// ------------------------
before decorrelate
LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{2}])
  LogicalTableScan(table=[[bookstore, authors]])
  LogicalFilter(condition=[=($2, $cor0.birthPlace)])
    LogicalTableScan(table=[[bookstore, authors]])

after decorrelate
LogicalJoin(condition=[=($2, $6)], joinType=[inner])
  LogicalTableScan(table=[[bookstore, authors]])
  LogicalTableScan(table=[[bookstore, authors]])
{code}

However, the same plan, but correlating on author birthplace.city, looks 
completely wrong (too many joins, correlated variable still in the plan):
{code}
    b.scan("bookstore", "authors");
    b.variable(cor0);
    b.scan("bookstore", "authors");
    b.filter(b.equals(
            b.field(b.field("birthPlace"), "city"),
            b.field(b.field(cor0.get(), "birthPlace"), "city")));
    b.correlate(
        JoinRelType.INNER,
        cor0.get().id,
        b.field(b.field(2, 0, "birthPlace"), "city"));

// ------------------------
before decorrelate
LogicalCorrelate(correlation=[$cor0], joinType=[inner], requiredColumns=[{4}])
  LogicalProject(aid=[$0], name=[$1], birthPlace=[$2], books=[$3], 
$f4=[$2.city])
    LogicalTableScan(table=[[bookstore, authors]])
  LogicalFilter(condition=[=($2.city, $cor0.birthPlace.city)])
    LogicalTableScan(table=[[bookstore, authors]])

after decorrelate
LogicalJoin(condition=[=($2, $9)], joinType=[inner])
  LogicalProject(aid=[$0], name=[$1], birthPlace=[$2], books=[$3], 
$f4=[$2.city])
    LogicalTableScan(table=[[bookstore, authors]])
  LogicalJoin(condition=[true], joinType=[inner])
    LogicalFilter(condition=[=($2.city, $cor0.birthPlace.city)])
      LogicalTableScan(table=[[bookstore, authors]])
    LogicalAggregate(group=[{0}])
      LogicalProject(birthPlace=[$2])
        LogicalTableScan(table=[[bookstore, authors]])
{code}

> RelDecorrelator does not resolve correlation variable with field accesses
> -------------------------------------------------------------------------
>
>                 Key: CALCITE-3977
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3977
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.22.0
>            Reporter: Thomas Rebele
>            Priority: Major
>         Attachments: Calcite3977.java
>
>
> The RelCorrelator seems to have problems with some plans that contain a field 
> access (probably a RexFieldAccess, but I haven't looked further into it). In 
> this ticket there's a filter on *$cor0.birthPlace.city*.
> Here the complete plan:
> {code:java}
> before decorrelate
> LogicalCorrelate(correlation=[$cor0], joinType=[left], requiredColumns=[{}])
>   LogicalTableScan(table=[[bookstore, authors]])
>   LogicalFilter(condition=[=('Munich', $cor0.birthPlace.city)])
>     LogicalTableScan(table=[[bookstore, authors]])
> after decorrelate
> LogicalJoin(condition=[=($2, $8)], joinType=[left])
>   LogicalTableScan(table=[[bookstore, authors]])
>   LogicalJoin(condition=[true], joinType=[inner])
>     LogicalFilter(condition=[=('Munich', $cor0.birthPlace.city)])
>       LogicalTableScan(table=[[bookstore, authors]])
>     LogicalAggregate(group=[{0}])
>       LogicalProject(birthPlace=[$2])
>         LogicalTableScan(table=[[bookstore, authors]])
> {code}
> There seem to be two problems:
>  * The LogicalCorrelate has been removed, but the $cor0.birthPlace.city is 
> still in the filter condition.
>  * The inner join does not seem to be necessary. If it is, could somebody 
> explain, why?



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to