Commit 57b82bf3 authored by Tom Lane's avatar Tom Lane

Marginal performance hack: use a dedicated routine instead of copyObject

to copy nodes that are known to be Vars during plan reference adjustment.
Saves useless memzero operation as well as the big switch in copyObject.
parent afaa6b98
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.134 2007/04/06 22:57:20 tgl Exp $ * $PostgreSQL: pgsql/src/backend/optimizer/plan/setrefs.c,v 1.135 2007/04/30 00:16:43 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -565,6 +565,22 @@ trivial_subqueryscan(SubqueryScan *plan) ...@@ -565,6 +565,22 @@ trivial_subqueryscan(SubqueryScan *plan)
return true; return true;
} }
/*
* copyVar
* Copy a Var node.
*
* fix_scan_expr and friends do this enough times that it's worth having
* a bespoke routine instead of using the generic copyObject() function.
*/
static inline Var *
copyVar(Var *var)
{
Var *newvar = (Var *) palloc(sizeof(Var));
*newvar = *var;
return newvar;
}
/* /*
* fix_scan_expr * fix_scan_expr
* Do set_plan_references processing on a scan-level expression * Do set_plan_references processing on a scan-level expression
...@@ -588,7 +604,7 @@ fix_scan_expr_mutator(Node *node, fix_scan_expr_context *context) ...@@ -588,7 +604,7 @@ fix_scan_expr_mutator(Node *node, fix_scan_expr_context *context)
return NULL; return NULL;
if (IsA(node, Var)) if (IsA(node, Var))
{ {
Var *var = (Var *) copyObject(node); Var *var = copyVar((Var *) node);
Assert(var->varlevelsup == 0); Assert(var->varlevelsup == 0);
/* /*
...@@ -1091,7 +1107,7 @@ search_indexed_tlist_for_var(Var *var, indexed_tlist *itlist, ...@@ -1091,7 +1107,7 @@ search_indexed_tlist_for_var(Var *var, indexed_tlist *itlist,
if (vinfo->varno == varno && vinfo->varattno == varattno) if (vinfo->varno == varno && vinfo->varattno == varattno)
{ {
/* Found a match */ /* Found a match */
Var *newvar = (Var *) copyObject(var); Var *newvar = copyVar(var);
newvar->varno = newvarno; newvar->varno = newvarno;
newvar->varattno = vinfo->resno; newvar->varattno = vinfo->resno;
...@@ -1213,7 +1229,7 @@ fix_join_expr_mutator(Node *node, fix_join_expr_context *context) ...@@ -1213,7 +1229,7 @@ fix_join_expr_mutator(Node *node, fix_join_expr_context *context)
/* If it's for acceptable_rel, adjust and return it */ /* If it's for acceptable_rel, adjust and return it */
if (var->varno == context->acceptable_rel) if (var->varno == context->acceptable_rel)
{ {
var = (Var *) copyObject(var); var = copyVar(var);
var->varno += context->rtoffset; var->varno += context->rtoffset;
var->varnoold += context->rtoffset; var->varnoold += context->rtoffset;
return (Node *) var; return (Node *) var;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment