From 7931bfa764d114ed64cc24bbeb3876206f2e2ec4 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 14 Mar 2003 00:55:17 +0000
Subject: [PATCH] Make eval_const_expressions simplify FieldSelect from a
 whole-row Var into an ordinary one-field Var.  Per example from Chris
 Mungall.

---
 src/backend/optimizer/util/clauses.c | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c
index fcd58374189..bdad4d9b811 100644
--- a/src/backend/optimizer/util/clauses.c
+++ b/src/backend/optimizer/util/clauses.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.131 2003/03/10 03:53:50 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/optimizer/util/clauses.c,v 1.132 2003/03/14 00:55:17 tgl Exp $
  *
  * HISTORY
  *	  AUTHOR			DATE			MAJOR EVENT
@@ -1497,6 +1497,28 @@ eval_const_expressions_mutator(Node *node, List *active_fns)
 		newcoalesce->args = newargs;
 		return (Node *) newcoalesce;
 	}
+	if (IsA(node, FieldSelect))
+	{
+		/*
+		 * We can optimize field selection from a whole-row Var into a
+		 * simple Var.  (This case won't be generated directly by the
+		 * parser, because ParseComplexProjection short-circuits it.
+		 * But it can arise while simplifying functions.)  If the argument
+		 * isn't a whole-row Var, just fall through to do generic processing.
+		 */
+		FieldSelect *fselect = (FieldSelect *) node;
+		Var		   *argvar = (Var *) fselect->arg;
+
+		if (argvar && IsA(argvar, Var) &&
+			argvar->varattno == InvalidAttrNumber)
+		{
+			return (Node *) makeVar(argvar->varno,
+									fselect->fieldnum,
+									fselect->resulttype,
+									fselect->resulttypmod,
+									argvar->varlevelsup);
+		}
+	}
 
 	/*
 	 * For any node type not handled above, we recurse using
-- 
GitLab