diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2000-03-12 18:57:05 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2000-03-12 18:57:05 +0000 |
commit | ef3386affebb641bf84a528fc2b62530577c10e8 (patch) | |
tree | 6eefeddcc3d618d131a6adbfa3d353310542b606 /src/backend/rewrite/rewriteHandler.c | |
parent | 117fa25ae1fccbb210cc92c86274307475798aea (diff) | |
download | postgresql-ef3386affebb641bf84a528fc2b62530577c10e8.tar.gz postgresql-ef3386affebb641bf84a528fc2b62530577c10e8.zip |
Fix performance problem in fireRIRonSubselect: with nested subqueries,
fireRIRonSubselect was invoked twice at each subselect, leading to an
exponential amount of wasted effort.
Diffstat (limited to 'src/backend/rewrite/rewriteHandler.c')
-rw-r--r-- | src/backend/rewrite/rewriteHandler.c | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 57169d9336e..0ba42f05942 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.67 2000/01/27 18:11:37 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.68 2000/03/12 18:57:05 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -958,10 +958,6 @@ fireRIRonSubselect(Node *node, void *context) return false; if (IsA(node, SubLink)) { - /* - * Standard expression_tree_walker will not recurse into subselect, - * but here we must do so. - */ SubLink *sub = (SubLink *) node; Query *qry; @@ -971,14 +967,12 @@ fireRIRonSubselect(Node *node, void *context) /* Do what we came for */ qry = fireRIRrules((Query *) (sub->subselect)); sub->subselect = (Node *) qry; - /* Must recurse to handle any sub-subselects! */ - if (fireRIRonSubselect((Node *) qry, context)) - return true; + /* Need not recurse into subselect, because fireRIRrules did it */ return false; } if (IsA(node, Query)) { - /* Reach here after recursing down into subselect above... */ + /* Reach here when called from fireRIRrules */ Query *qry = (Query *) node; if (fireRIRonSubselect((Node *) (qry->targetList), context)) @@ -1107,12 +1101,12 @@ fireRIRrules(Query *parsetree) heap_close(rel, AccessShareLock); } - if (parsetree->hasSubLinks) - fireRIRonSubselect((Node *) parsetree, NULL); - if (parsetree->hasAggs) parsetree->qual = modifyAggrefQual(parsetree->qual, parsetree); + if (parsetree->hasSubLinks) + fireRIRonSubselect((Node *) parsetree, NULL); + return parsetree; } |