aboutsummaryrefslogtreecommitdiff
path: root/src/backend/rewrite/rewriteHandler.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-03-12 18:57:05 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-03-12 18:57:05 +0000
commitef3386affebb641bf84a528fc2b62530577c10e8 (patch)
tree6eefeddcc3d618d131a6adbfa3d353310542b606 /src/backend/rewrite/rewriteHandler.c
parent117fa25ae1fccbb210cc92c86274307475798aea (diff)
downloadpostgresql-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.c18
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;
}