Check for out-of-range varoattno in deparse_context_for_subplan.
authorTom Lane
Fri, 15 Jul 2005 18:39:59 +0000 (18:39 +0000)
committerTom Lane
Fri, 15 Jul 2005 18:39:59 +0000 (18:39 +0000)
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

index 0943c71f42ae70e8134e073e7cab2f9181754306..e2e133b3cb2c5e79ac141983250f25ea536b0f4d 100644 (file)
@@ -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 */