Skip to content

Commit ef3386a

Browse files
committed
Fix performance problem in fireRIRonSubselect: with nested subqueries,
fireRIRonSubselect was invoked twice at each subselect, leading to an exponential amount of wasted effort.
1 parent 117fa25 commit ef3386a

File tree

1 file changed

+6
-12
lines changed

1 file changed

+6
-12
lines changed

src/backend/rewrite/rewriteHandler.c

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.67 2000/01/27 18:11:37 tgl Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.68 2000/03/12 18:57:05 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -958,10 +958,6 @@ fireRIRonSubselect(Node *node, void *context)
958958
return false;
959959
if (IsA(node, SubLink))
960960
{
961-
/*
962-
* Standard expression_tree_walker will not recurse into subselect,
963-
* but here we must do so.
964-
*/
965961
SubLink *sub = (SubLink *) node;
966962
Query *qry;
967963

@@ -971,14 +967,12 @@ fireRIRonSubselect(Node *node, void *context)
971967
/* Do what we came for */
972968
qry = fireRIRrules((Query *) (sub->subselect));
973969
sub->subselect = (Node *) qry;
974-
/* Must recurse to handle any sub-subselects! */
975-
if (fireRIRonSubselect((Node *) qry, context))
976-
return true;
970+
/* Need not recurse into subselect, because fireRIRrules did it */
977971
return false;
978972
}
979973
if (IsA(node, Query))
980974
{
981-
/* Reach here after recursing down into subselect above... */
975+
/* Reach here when called from fireRIRrules */
982976
Query *qry = (Query *) node;
983977

984978
if (fireRIRonSubselect((Node *) (qry->targetList), context))
@@ -1107,12 +1101,12 @@ fireRIRrules(Query *parsetree)
11071101
heap_close(rel, AccessShareLock);
11081102
}
11091103

1110-
if (parsetree->hasSubLinks)
1111-
fireRIRonSubselect((Node *) parsetree, NULL);
1112-
11131104
if (parsetree->hasAggs)
11141105
parsetree->qual = modifyAggrefQual(parsetree->qual, parsetree);
11151106

1107+
if (parsetree->hasSubLinks)
1108+
fireRIRonSubselect((Node *) parsetree, NULL);
1109+
11161110
return parsetree;
11171111
}
11181112

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy