Clean up rewriter routines to use expression_tree_walker and
Tom Lane <tgl@sss.pgh.pa.us>
Clean up rewriter routines to use expression_tree_walker and expression_tree_mutator rather than ad-hoc tree walking code. This shortens the code materially and fixes a fair number of sins of omission. Also, change modifyAggrefQual to *not* recurse into subselects, since its mission is satisfied if it removes aggregate functions from the top level of a WHERE clause. This cures problems with queries of the form SELECT ... WHERE x IN (SELECT ... HAVING something-using-an-aggregate), which would formerly get mucked up by modifyAggrefQual. The routine is still fundamentally broken, of course, but I don't think there's any way to get rid of it before we implement subselects in FROM ...
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/rewrite/locks.c | modified | +61 −76 |
| src/backend/rewrite/rewriteHandler.c | modified | +511 −1551 |
| src/backend/rewrite/rewriteManip.c | modified | +395 −817 |
| src/include/rewrite/rewriteManip.h | modified | +12 −13 |