diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-05-28 22:32:50 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-05-28 22:32:50 +0000 |
commit | 8a6ac83dab3b3a5701a0508daa1d9356e2d59cdb (patch) | |
tree | 0f96d0304864f7439c90dc6ae6a1e30945051d1a /src/backend/optimizer/util/var.c | |
parent | 0f3c68aa436dca175d29a43e104146259b4b0a00 (diff) | |
download | postgresql-8a6ac83dab3b3a5701a0508daa1d9356e2d59cdb.tar.gz postgresql-8a6ac83dab3b3a5701a0508daa1d9356e2d59cdb.zip |
Fix some planner performance problems with large WHERE clauses, by
introducing new 'FastList' list-construction subroutines to use in
hot spots. This avoids the O(N^2) behavior of repeated lappend's
by keeping a tail pointer, while not changing behavior by reversing
list order as the lcons() method would do.
Diffstat (limited to 'src/backend/optimizer/util/var.c')
-rw-r--r-- | src/backend/optimizer/util/var.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c index 929f5561dbc..a365b7b159e 100644 --- a/src/backend/optimizer/util/var.c +++ b/src/backend/optimizer/util/var.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.49 2003/02/08 20:20:55 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/optimizer/util/var.c,v 1.50 2003/05/28 22:32:50 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -37,7 +37,7 @@ typedef struct typedef struct { - List *varlist; + FastList varlist; bool includeUpperVars; } pull_var_clause_context; @@ -344,11 +344,11 @@ pull_var_clause(Node *node, bool includeUpperVars) { pull_var_clause_context context; - context.varlist = NIL; + FastListInit(&context.varlist); context.includeUpperVars = includeUpperVars; pull_var_clause_walker(node, &context); - return context.varlist; + return FastListValue(&context.varlist); } static bool @@ -359,7 +359,7 @@ pull_var_clause_walker(Node *node, pull_var_clause_context *context) if (IsA(node, Var)) { if (((Var *) node)->varlevelsup == 0 || context->includeUpperVars) - context->varlist = lappend(context->varlist, node); + FastAppend(&context->varlist, node); return false; } return expression_tree_walker(node, pull_var_clause_walker, |