aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2007-02-08 18:38:03 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2007-02-08 18:38:03 +0000
commit3e94cf51d7f930e3fec09836d2b488189889a441 (patch)
treea38fb5e16f2c67bdf1da5830beba8ff0e10cbe94 /src
parentdc80902bcc08e544afcf7514efcaf50b5bb49529 (diff)
downloadpostgresql-3e94cf51d7f930e3fec09836d2b488189889a441.tar.gz
postgresql-3e94cf51d7f930e3fec09836d2b488189889a441.zip
Rearrange use of plpgsql_add_initdatums() so that only the parsing of a
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.
Diffstat (limited to 'src')
-rw-r--r--src/pl/plpgsql/src/gram.y11
-rw-r--r--src/pl/plpgsql/src/pl_comp.c23
2 files changed, 17 insertions, 17 deletions
diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y
index 4e4ff9af70e..2ed2a19eb44 100644
--- a/src/pl/plpgsql/src/gram.y
+++ b/src/pl/plpgsql/src/gram.y
@@ -4,7 +4,7 @@
* procedural language
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.64.4.4 2006/05/21 19:57:39 momjian Exp $
+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.64.4.5 2007/02/08 18:38:03 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -276,7 +276,6 @@ decl_sect : opt_label
$$.label = $1;
$$.n_initvars = 0;
$$.initvarnos = NULL;
- plpgsql_add_initdatums(NULL);
}
| opt_label decl_start
{
@@ -284,7 +283,6 @@ decl_sect : opt_label
$$.label = $1;
$$.n_initvars = 0;
$$.initvarnos = NULL;
- plpgsql_add_initdatums(NULL);
}
| opt_label decl_start decl_stmts
{
@@ -293,12 +291,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);
}
;
@@ -986,9 +988,6 @@ for_control : lno for_variable K_IN
-1),
true);
- /* put the for-variable into the local block */
- plpgsql_add_initdatums(NULL);
-
new = malloc(sizeof(PLpgSQL_stmt_fori));
memset(new, 0, sizeof(PLpgSQL_stmt_fori));
diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
index ff8ec94c851..8c9f6483234 100644
--- a/src/pl/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -3,7 +3,7 @@
* procedural language
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.83 2004/11/30 03:50:29 neilc Exp $
+ * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.83.4.1 2007/02/08 18:38:03 tgl Exp $
*
* This software is copyrighted by Jan Wieck - Hamburg.
*
@@ -590,11 +590,6 @@ do_compile(FunctionCallInfo fcinfo,
function->found_varno = var->dno;
/*
- * Forget about the above created variables
- */
- plpgsql_add_initdatums(NULL);
-
- /*
* Now parse the function's text
*/
parse_rc = plpgsql_yyparse();
@@ -1806,11 +1801,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