Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7ad33ce

Browse files
committed
Rearrange use of plpgsql_add_initdatums() so that only the parsing of a
DECLARE section needs to know about it. Formerly, everyplace besides DECLAREthat created variables needed to do "plpgsql_add_initdatums(NULL)" to preventthose variables from being sucked up as part of a subsequent DECLARE block.This is obviously error-prone, and in fact the SQLSTATE/SQLERRM patch hadfailed to do it for those two variables, leading to the bug recently exhibitedby Asif Ali Rehman: a DECLARE within an exception handler tried to reinitializeSQLERRM.Although the SQLSTATE/SQLERRM patch isn't in any pre-8.1 branches, and soI can't point to a demonstrable failure there, it seems wise to back-patchthis into the older branches anyway, just to keep the logic similar to HEAD.
1 parentb577aa9 commit7ad33ce

File tree

2 files changed

+17
-17
lines changed

2 files changed

+17
-17
lines changed

‎src/pl/plpgsql/src/gram.y

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*
1010
*
1111
* IDENTIFICATION
12-
* $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.97 2007/02/01 19:10:29 momjian Exp $
12+
* $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.98 2007/02/08 18:37:14 tgl Exp $
1313
*
1414
*-------------------------------------------------------------------------
1515
*/
@@ -272,15 +272,13 @@ decl_sect: opt_block_label
272272
$$.label =$1;
273273
$$.n_initvars =0;
274274
$$.initvarnos =NULL;
275-
plpgsql_add_initdatums(NULL);
276275
}
277276
|opt_block_labeldecl_start
278277
{
279278
plpgsql_ns_setlocal(false);
280279
$$.label =$1;
281280
$$.n_initvars =0;
282281
$$.initvarnos =NULL;
283-
plpgsql_add_initdatums(NULL);
284282
}
285283
|opt_block_labeldecl_startdecl_stmts
286284
{
@@ -289,12 +287,16 @@ decl_sect: opt_block_label
289287
$$.label =$3;
290288
else
291289
$$.label =$1;
290+
/* Remember variables declared in decl_stmts*/
292291
$$.n_initvars = plpgsql_add_initdatums(&($$.initvarnos));
293292
}
294293
;
295294

296295
decl_start:K_DECLARE
297296
{
297+
/* Forget any variables created before block*/
298+
plpgsql_add_initdatums(NULL);
299+
/* Make variable names be local to block*/
298300
plpgsql_ns_setlocal(true);
299301
}
300302
;
@@ -990,9 +992,6 @@ for_control:
990992
-1),
991993
true);
992994

993-
/* put the for-variable into the local block*/
994-
plpgsql_add_initdatums(NULL);
995-
996995
new = palloc0(sizeof(PLpgSQL_stmt_fori));
997996
new->cmd_type = PLPGSQL_STMT_FORI;
998997
new->lineno =$1;

‎src/pl/plpgsql/src/pl_comp.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.111 2007/02/01 19:10:29 momjian Exp $
11+
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.112 2007/02/08 18:37:14 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -666,11 +666,6 @@ do_compile(FunctionCallInfo fcinfo,
666666
true);
667667
function->found_varno=var->dno;
668668

669-
/*
670-
* Forget about the above created variables
671-
*/
672-
plpgsql_add_initdatums(NULL);
673-
674669
/*
675670
* Now parse the function's text
676671
*/
@@ -1893,11 +1888,17 @@ plpgsql_adddatum(PLpgSQL_datum *new)
18931888

18941889

18951890
/* ----------
1896-
* plpgsql_add_initdatumsPut all datum entries created
1897-
*since the last call into the
1898-
*finishing code block so the
1899-
*block knows which variables to
1900-
*reinitialize when entered.
1891+
* plpgsql_add_initdatumsMake an array of the datum numbers of
1892+
*all the simple VAR datums created since the last call
1893+
*to this function.
1894+
*
1895+
* If varnos is NULL, we just forget any datum entries created since the
1896+
* last call.
1897+
*
1898+
* This is used around a DECLARE section to create a list of the VARs
1899+
* that have to be initialized at block entry. Note that VARs can also
1900+
* be created elsewhere than DECLARE, eg by a FOR-loop, but it is then
1901+
* the responsibility of special-purpose code to initialize them.
19011902
* ----------
19021903
*/
19031904
int

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp