From 57b82bf324285464783796e5614d5f9aadd0817f Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Mon, 30 Apr 2007 00:16:43 +0000
Subject: [PATCH] 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.

---
 src/backend/optimizer/plan/setrefs.c | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index 0739142403e..90a49983ac6 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -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;
-- 
GitLab