]> granicus.if.org Git - postgresql/commitdiff
Rearrange use of plpgsql_add_initdatums() so that only the parsing of a
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 8 Feb 2007 18:38:16 +0000 (18:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 8 Feb 2007 18:38:16 +0000 (18:38 +0000)
DECLARE section needs to know about it.  Formerly, everyplace besides DECLARE
that created variables needed to do "plpgsql_add_initdatums(NULL)" to prevent
those variables from being sucked up as part of a subsequent DECLARE block.
This is obviously error-prone, and in fact the SQLSTATE/SQLERRM patch had
failed to do it for those two variables, leading to the bug recently exhibited
by Asif Ali Rehman: a DECLARE within an exception handler tried to reinitialize
SQLERRM.

Although the SQLSTATE/SQLERRM patch isn't in any pre-8.1 branches, and so
I can't point to a demonstrable failure there, it seems wise to back-patch
this into the older branches anyway, just to keep the logic similar to HEAD.

src/pl/plpgsql/src/gram.y
src/pl/plpgsql/src/pl_comp.c

index 8c3f688cef0d4610888e14e5dfce8e39fc554abd..4876a51332afd92e55582c5c4be7b3cb461aa920 100644 (file)
@@ -4,7 +4,7 @@
  *                                               procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.48.2.4 2006/05/21 19:57:07 momjian Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.48.2.5 2007/02/08 18:38:15 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -263,7 +263,6 @@ decl_sect           : opt_label
                                                $$.label          = $1;
                                                $$.n_initvars = 0;
                                                $$.initvarnos = NULL;
-                                               plpgsql_add_initdatums(NULL);
                                        }
                                | opt_label decl_start
                                        {
@@ -271,7 +270,6 @@ decl_sect           : opt_label
                                                $$.label          = $1;
                                                $$.n_initvars = 0;
                                                $$.initvarnos = NULL;
-                                               plpgsql_add_initdatums(NULL);
                                        }
                                | opt_label decl_start decl_stmts
                                        {
@@ -280,12 +278,16 @@ decl_sect         : opt_label
                                                        $$.label = $3;
                                                else
                                                        $$.label = $1;
+                                               /* Remember variables declared in decl_stmts */
                                                $$.n_initvars = plpgsql_add_initdatums(&($$.initvarnos));
                                        }
                                ;
 
 decl_start             : K_DECLARE
                                        {
+                                               /* Forget any variables created before block */
+                                               plpgsql_add_initdatums(NULL);
+                                               /* Make variable names be local to block */
                                                plpgsql_ns_setlocal(true);
                                        }
                                ;
@@ -1033,8 +1035,6 @@ fori_var          : fori_varname
                                                plpgsql_ns_additem(PLPGSQL_NSTYPE_VAR, new->varno,
                                                                                                $1.name);
 
-                                               plpgsql_add_initdatums(NULL);
-
                                                $$ = new;
                                        }
                                ;
index 8db48e6f846e1584a4e4fc67f74e0c787b2d6627..ce1f292052d6076d0d42cda6cd71f67cfd82cebc 100644 (file)
@@ -3,7 +3,7 @@
  *                       procedural language
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.69 2003/09/30 00:59:51 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.69.2.1 2007/02/08 18:38:16 tgl Exp $
  *
  *       This software is copyrighted by Jan Wieck - Hamburg.
  *
@@ -668,12 +668,7 @@ do_compile(FunctionCallInfo fcinfo,
        function->found_varno = var->varno;
 
        /*
-        * Forget about the above created variables
-        */
-       plpgsql_add_initdatums(NULL);
-
-       /*
-        * Now parse the functions text
+        * Now parse the function's text
         */
        parse_rc = plpgsql_yyparse();
        if (parse_rc != 0)
@@ -1648,11 +1643,17 @@ plpgsql_adddatum(PLpgSQL_datum * new)
 
 
 /* ----------
- * plpgsql_add_initdatums              Put all datum entries created
- *                                     since the last call into the
- *                                     finishing code block so the
- *                                     block knows which variables to
- *                                     reinitialize when entered.
+ * plpgsql_add_initdatums              Make an array of the datum numbers of
+ *                                     all the simple VAR datums created since the last call
+ *                                     to this function.
+ *
+ * If varnos is NULL, we just forget any datum entries created since the
+ * last call.
+ *
+ * This is used around a DECLARE section to create a list of the VARs
+ * that have to be initialized at block entry.  Note that VARs can also
+ * be created elsewhere than DECLARE, eg by a FOR-loop, but it is then
+ * the responsibility of special-purpose code to initialize them.
  * ----------
  */
 int