mirror of
https://github.com/postgres/postgres.git
synced 2025-05-18 17:41:14 +03:00
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.
This commit is contained in:
parent
dec65c9421
commit
ad7ee8883b
@ -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;
|
||||
}
|
||||
;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user