From 184ba4d5ede1cef4eec2ec1c17e363fc3c1d84d0 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 15 Jul 2005 18:39:59 +0000
Subject: [PATCH] Check for out-of-range varoattno in
 deparse_context_for_subplan. I have seen this case in CVS tip due to new
 "physical tlist" optimization for subqueries.  I believe it probably can't
 happen in existing releases, but the check is not going to hurt anything, so
 backpatch to 8.0 just in case.

---
 src/backend/utils/adt/ruleutils.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c
index 0943c71f42..e2e133b3cb 100644
--- a/src/backend/utils/adt/ruleutils.c
+++ b/src/backend/utils/adt/ruleutils.c
@@ -3,7 +3,7 @@
  *				back to source text
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.203 2005/07/02 17:01:50 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/ruleutils.c,v 1.204 2005/07/15 18:39:59 tgl Exp $
  *
  *	  This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -1510,11 +1510,17 @@ deparse_context_for_subplan(const char *name, List *tlist,
 			if (var->varnoold > 0 && var->varnoold <= rtablelength)
 			{
 				RangeTblEntry *varrte = rt_fetch(var->varnoold, rtable);
-				char	   *varname;
+				AttrNumber varattnum = var->varoattno;
 
-				varname = get_rte_attribute_name(varrte, var->varoattno);
-				attrs = lappend(attrs, makeString(varname));
-				continue;
+				/* need this test in case it's referencing a resjunk col */
+				if (varattnum <= list_length(varrte->eref->colnames))
+				{
+					char	   *varname;
+
+					varname = get_rte_attribute_name(varrte, varattnum);
+					attrs = lappend(attrs, makeString(varname));
+					continue;
+				}
 			}
 		}
 		/* Fallback if can't get name */