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