]> granicus.if.org Git - postgresql/commitdiff
Back-patch fix to check vartypmod when matching PlannerParamVar entries.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 30 Nov 2003 22:24:16 +0000 (22:24 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 30 Nov 2003 22:24:16 +0000 (22:24 +0000)
This should prevent some obscure cases of 'variable not in subplan target
lists', although actual failures have only been reported against 7.4 in
which the bug is much easier to trigger.

src/backend/optimizer/plan/subselect.c

index 1dcebba2e773282b9de52722f6ec63b8e9c28f57..91f0056b6acc30e699e4fd62fd4fad2d45d3b887 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/subselect.c,v 1.55 2002/09/04 20:31:21 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/optimizer/plan/subselect.c,v 1.55.2.1 2003/11/30 22:24:16 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -90,6 +90,11 @@ replace_var(Var *var)
         * well, I believe that this sort of aliasing will cause no trouble.
         * The correct field should get stored into the Param slot at
         * execution in each part of the tree.
+        *
+        * We also need to demand a match on vartypmod.  This does not matter
+        * for the Param itself, since those are not typmod-dependent, but it
+        * does matter when make_subplan() instantiates a modified copy of the
+        * Var for a subplan's args list.
         */
        i = 0;
        foreach(ppv, PlannerParamVar)
@@ -99,7 +104,8 @@ replace_var(Var *var)
                if (pvar->varno == var->varno &&
                        pvar->varattno == var->varattno &&
                        pvar->varlevelsup == varlevel &&
-                       pvar->vartype == var->vartype)
+                       pvar->vartype == var->vartype &&
+                       pvar->vartypmod == var->vartypmod)
                        break;
                i++;
        }