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)