Fix performance problem in fireRIRonSubselect: with nested subqueries,
authorTom Lane
Sun, 12 Mar 2000 18:57:05 +0000 (18:57 +0000)
committerTom Lane
Sun, 12 Mar 2000 18:57:05 +0000 (18:57 +0000)
fireRIRonSubselect was invoked twice at each subselect, leading to an
exponential amount of wasted effort.

src/backend/rewrite/rewriteHandler.c

index 57169d9336eb07f3b9df05f09fbed5f0bc815e46..0ba42f05942d65973a5d58b250bef09878cbc200 100644 (file)
@@ -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;
 }