Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
Description
RelBuilder.aggregate should prune unused fields from the input, if the input is a Project.
Pruning fields during the planning process is desirable, but often cannot do it - we are applying a RelOptRule that has to return the same fields, or we don't want to add an extra Project do so the pruning. But when we are in RelBuilder.aggregate and the input is a Project, neither of those limitations apply. We already have a Project, we are just making it narrower; and we know what fields the Aggregate will produce.
For example,
SELECT deptno, SUM(sal) FILTER (WHERE b) FROM ( SELECT deptno, empno + 10, sal, job = 'CLERK' AS b FROM emp) GROUP BY deptno
becomes
SELECT deptno, SUM(sal) FILTER (WHERE b) FROM ( SELECT deptno, sal, job = 'CLERK' AS b FROM emp) GROUP BY deptno
If there are no fields used, remove the Project. (A RelNode with no fields is not allowed.)
SELECT COUNT(*) AS C FROM ( SELECT deptno, empno + 10, sal, job = 'CLERK' AS b FROM emp)
becomes
SELECT COUNT(*) AS c FROM emp
Add an option RelBuilder.Config.pruneInputOfAggregate, default true, so that people can disable this rewrite if it causes problems.
Attachments
Issue Links
- links to