]> granicus.if.org Git - postgresql/commitdiff
Marginal performance hack: use a dedicated routine instead of copyObject
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 30 Apr 2007 00:16:43 +0000 (00:16 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 30 Apr 2007 00:16:43 +0000 (00:16 +0000)
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.

src/backend/optimizer/plan/setrefs.c

index 0739142403e021f7a6223e9b59c8f3c1162838a7..90a49983ac63798a334993a48031f71cf353eb8d 100644 (file)
@@ -9,7 +9,7 @@
  *
  *
  * 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)
        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
  *             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)
                return NULL;
        if (IsA(node, Var))
        {
-               Var                *var = (Var *) copyObject(node);
+               Var                *var = copyVar((Var *) node);
 
                Assert(var->varlevelsup == 0);
                /*
@@ -1091,7 +1107,7 @@ search_indexed_tlist_for_var(Var *var, indexed_tlist *itlist,
                if (vinfo->varno == varno && vinfo->varattno == varattno)
                {
                        /* Found a match */
-                       Var                *newvar = (Var *) copyObject(var);
+                       Var                *newvar = copyVar(var);
 
                        newvar->varno = newvarno;
                        newvar->varattno = vinfo->resno;
@@ -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 (var->varno == context->acceptable_rel)
                {
-                       var = (Var *) copyObject(var);
+                       var = copyVar(var);
                        var->varno += context->rtoffset;
                        var->varnoold += context->rtoffset;
                        return (Node *) var;