Fix thinko in tok_is_keyword(): it was looking at the wrong union variant
of YYSTYPE, and hence returning the wrong answer for cases where a plpgsql "unreserved keyword" really does conflict with a variable name. Obviously I didn't test this enough :-(. Per bug #5524 from Peter Gagarinov.
This commit is contained in:
parent
3bdd23932b
commit
399da7d882
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.142 2010/03/03 01:53:17 tgl Exp $
|
* $PostgreSQL: pgsql/src/pl/plpgsql/src/gram.y,v 1.143 2010/06/25 16:40:13 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -2080,8 +2080,8 @@ tok_is_keyword(int token, union YYSTYPE *lval,
|
|||||||
* match composite names (hence an unreserved word followed by "."
|
* match composite names (hence an unreserved word followed by "."
|
||||||
* will not be recognized).
|
* will not be recognized).
|
||||||
*/
|
*/
|
||||||
if (!lval->word.quoted && lval->word.ident != NULL &&
|
if (!lval->wdatum.quoted && lval->wdatum.ident != NULL &&
|
||||||
strcmp(lval->word.ident, kw_str) == 0)
|
strcmp(lval->wdatum.ident, kw_str) == 0)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false; /* not the keyword */
|
return false; /* not the keyword */
|
||||||
|
@ -3578,6 +3578,20 @@ $$ language plpgsql;
|
|||||||
select raise_test();
|
select raise_test();
|
||||||
ERROR: RAISE without parameters cannot be used outside an exception handler
|
ERROR: RAISE without parameters cannot be used outside an exception handler
|
||||||
CONTEXT: PL/pgSQL function "raise_test"
|
CONTEXT: PL/pgSQL function "raise_test"
|
||||||
|
-- check cases where implicit SQLSTATE variable could be confused with
|
||||||
|
-- SQLSTATE as a keyword, cf bug #5524
|
||||||
|
create or replace function raise_test() returns void as $$
|
||||||
|
begin
|
||||||
|
perform 1/0;
|
||||||
|
exception
|
||||||
|
when sqlstate '22012' then
|
||||||
|
raise notice using message = sqlstate;
|
||||||
|
raise sqlstate '22012' using message = 'substitute message';
|
||||||
|
end;
|
||||||
|
$$ language plpgsql;
|
||||||
|
select raise_test();
|
||||||
|
NOTICE: 22012
|
||||||
|
ERROR: substitute message
|
||||||
drop function raise_test();
|
drop function raise_test();
|
||||||
-- test CASE statement
|
-- test CASE statement
|
||||||
create or replace function case_test(bigint) returns text as $$
|
create or replace function case_test(bigint) returns text as $$
|
||||||
|
@ -2916,6 +2916,20 @@ $$ language plpgsql;
|
|||||||
|
|
||||||
select raise_test();
|
select raise_test();
|
||||||
|
|
||||||
|
-- check cases where implicit SQLSTATE variable could be confused with
|
||||||
|
-- SQLSTATE as a keyword, cf bug #5524
|
||||||
|
create or replace function raise_test() returns void as $$
|
||||||
|
begin
|
||||||
|
perform 1/0;
|
||||||
|
exception
|
||||||
|
when sqlstate '22012' then
|
||||||
|
raise notice using message = sqlstate;
|
||||||
|
raise sqlstate '22012' using message = 'substitute message';
|
||||||
|
end;
|
||||||
|
$$ language plpgsql;
|
||||||
|
|
||||||
|
select raise_test();
|
||||||
|
|
||||||
drop function raise_test();
|
drop function raise_test();
|
||||||
|
|
||||||
-- test CASE statement
|
-- test CASE statement
|
||||||
|
Loading…
x
Reference in New Issue
Block a user