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:
Tom Lane 2010-06-25 16:40:13 +00:00
parent 3bdd23932b
commit 399da7d882
3 changed files with 31 additions and 3 deletions

View File

@ -8,7 +8,7 @@
*
*
* 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 "."
* will not be recognized).
*/
if (!lval->word.quoted && lval->word.ident != NULL &&
strcmp(lval->word.ident, kw_str) == 0)
if (!lval->wdatum.quoted && lval->wdatum.ident != NULL &&
strcmp(lval->wdatum.ident, kw_str) == 0)
return true;
}
return false; /* not the keyword */

View File

@ -3578,6 +3578,20 @@ $$ language plpgsql;
select raise_test();
ERROR: RAISE without parameters cannot be used outside an exception handler
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();
-- test CASE statement
create or replace function case_test(bigint) returns text as $$

View File

@ -2916,6 +2916,20 @@ $$ language plpgsql;
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();
-- test CASE statement