[
https://issues.apache.org/jira/browse/CALCITE-6873?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
xiong duan updated CALCITE-6873:
--------------------------------
Description:
According to the documentation of FilterProjectTransposeRule, when Correlation
is included in the Filter, it is not allowed to push the Filter pass to the
Project. However, when the filter condition contains a subquery with
Correlation, it is pushed down. This would result in incorrect column
references in the SubqueryRemoveRule.
Now in Calcite:
{code:java}
LogicalFilter(condition=[EXISTS({
LogicalFilter(condition=[AND(=($0, $cor0.empid), =($1, $cor0.name))])
LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0], name=[$2])
LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
})])
LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0], name=[$2])
LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
{code}
after FilterProjectTransposeRule will become :
{code:java}
LogicalProject(empid=[$0], name=[$2])
LogicalFilter(condition=[EXISTS({
LogicalFilter(condition=[AND(=($0, $cor0.empid), =($1, $cor0.name))])
LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0], name=[$2])
LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
})])
LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
{code}
Then after SubqueryRemoveRule will become:
{code:java}
LogicalProject(empid=[$0], name=[$2])
LogicalCorrelate(subset=[rel#282:RelSubset#10.NONE.[]], correlation=[$cor0],
joinType=[inner], requiredColumns=[{0, 1}])
LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
LogicalAggregate(subset=[rel#266:RelSubset#8.NONE.[]], group=[{0}])
LogicalProject(subset=[rel#264:RelSubset#7.NONE.[]], i=[true])
LogicalFilter(subset=[rel#262:RelSubset#6.NONE.[]],
condition=[AND(=($0, $cor0.empid), =($1, $cor0.name))])
LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0],
name=[$2])
LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr,
emps]]) {code}
The Correlate `requiredColumns=[\{0, 1}]` should be `requiredColumns=[\{0,
2}]`.
was:
According to the documentation of FilterProjectTransposeRule, when Correlation
is included in the Filter, it is not allowed to push the Filter pass to the
Project. However, when the filter condition contains a subquery with
Correlation, it is pushed down. This would result in incorrect column
references in the SubqueryRemoveRule.
Now in Calcite:
{code:java}
LogicalFilter(condition=[EXISTS({
LogicalFilter(condition=[AND(=($0, $cor0.empid), =($1, $cor0.name))])
LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0], name=[$2])
LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
})])
LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0], name=[$2])
LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
{code}
after will become :
> FilterProjectTransposeRule should not push the Filter past the Project when
> the Filter contains a Subquery with correlation
> ---------------------------------------------------------------------------------------------------------------------------
>
> Key: CALCITE-6873
> URL: https://issues.apache.org/jira/browse/CALCITE-6873
> Project: Calcite
> Issue Type: Bug
> Reporter: xiong duan
> Assignee: xiong duan
> Priority: Major
>
> According to the documentation of FilterProjectTransposeRule, when
> Correlation is included in the Filter, it is not allowed to push the Filter
> pass to the Project. However, when the filter condition contains a subquery
> with Correlation, it is pushed down. This would result in incorrect column
> references in the SubqueryRemoveRule.
> Now in Calcite:
> {code:java}
> LogicalFilter(condition=[EXISTS({
> LogicalFilter(condition=[AND(=($0, $cor0.empid), =($1, $cor0.name))])
> LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0], name=[$2])
> LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
> })])
> LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0], name=[$2])
> LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr,
> emps]]) {code}
> after FilterProjectTransposeRule will become :
> {code:java}
> LogicalProject(empid=[$0], name=[$2])
> LogicalFilter(condition=[EXISTS({
> LogicalFilter(condition=[AND(=($0, $cor0.empid), =($1, $cor0.name))])
> LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0], name=[$2])
> LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
> })])
> LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr,
> emps]]) {code}
> Then after SubqueryRemoveRule will become:
> {code:java}
> LogicalProject(empid=[$0], name=[$2])
> LogicalCorrelate(subset=[rel#282:RelSubset#10.NONE.[]],
> correlation=[$cor0], joinType=[inner], requiredColumns=[{0, 1}])
> LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]], table=[[hr, emps]])
> LogicalAggregate(subset=[rel#266:RelSubset#8.NONE.[]], group=[{0}])
> LogicalProject(subset=[rel#264:RelSubset#7.NONE.[]], i=[true])
> LogicalFilter(subset=[rel#262:RelSubset#6.NONE.[]],
> condition=[AND(=($0, $cor0.empid), =($1, $cor0.name))])
> LogicalProject(subset=[rel#227:RelSubset#1.NONE.[]], empid=[$0],
> name=[$2])
> LogicalTableScan(subset=[rel#225:RelSubset#0.NONE.[]],
> table=[[hr, emps]]) {code}
> The Correlate `requiredColumns=[\{0, 1}]` should be `requiredColumns=[\{0,
> 2}]`.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)