Steven Talbot created CALCITE-3975:
--------------------------------------
Summary: ProjectFilterTransposeRule should fire for project that
happens to reference all input columns
Key: CALCITE-3975
URL: https://issues.apache.org/jira/browse/CALCITE-3975
Project: Calcite
Issue Type: Bug
Reporter: Steven Talbot
... that is, I think
If I make the trivial fix of just "only skip trivial projects", something like
{noformat}
&& origProj.getProjects().stream().allMatch((proj) -> proj instanceof
RexInputRef) {noformat}
at
[https://github.com/apache/calcite/blob/571731b80a58eb095ebac7123285c375e7afff90/core/src/main/java/org/apache/calcite/rel/rules/PushProjector.java#L354
|https://github.com/apache/calcite/blob/571731b80a58eb095ebac7123285c375e7afff90/core/src/main/java/org/apache/calcite/rel/rules/PushProjector.java#L354]HepPlanner
goes into infinite recursion with the rule.
But here's the test case:
{code:java}
@Test public void testPushProjectPastFilter3() {
final String sql = "select empno + deptno, ename, job, mgr, hiredate, sal,
comm, slacker from emp where sal = 10 * comm\n"
+ "and upper(ename) = 'FOO'";
sql(sql).withRule(ProjectFilterTransposeRule.INSTANCE).check();
}
{code}
{noformat}
<TestCase name="testPushProjectPastFilter3">
<Resource name="sql">
<![CDATA[select empno + deptno, emp* from emp where sal = 10 * comm
and upper(ename) = 'FOO']]>
</Resource>
<Resource name="planBefore">
<![CDATA[
LogicalProject(EXPR$0=[+($0, $7)], EMPNO=[$0], ENAME=[$1], JOB=[$2], MGR=[$3],
HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
LogicalFilter(condition=[AND(=($5, *(10, $6)), =(UPPER($1), 'FOO'))])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
</Resource>
<Resource name="planAfter">
<![CDATA[
-- note: probably a LogicalProject here, although see below comment
LogicalFilter(condition=[AND(=($5, *(10, $6)), =(UPPER($1), 'FOO'))])
LogicalProject(EXPR$0=[+($0, $7)], EMPNO=[$0], ENAME=[$1], JOB=[$2],
MGR=[$3], HIREDATE=[$4], SAL=[$5], COMM=[$6], DEPTNO=[$7], SLACKER=[$8])
LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
</Resource>
</TestCase>{noformat}
There's no reason the rule shouldn't fire here, right? Or am I missing
something?
The reason this rule goes into an infinite recursion with hepplanner is because
it sticks a project on top after transpose to handle common expressions
extracted from the filter and the project. Ideally, it could have a mode where
it could avoid doing that and do a true "transpose" if there was no need for
it. For example, I don't think there is a a need for a reproject on top in this
test case: you can just transpose and everything works as it should. This would
be another way to avoid infinite recursion.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)