SSCCE: O seguinte script:
$ cat test.sql
CREATE TABLE public.foo (
loop INTEGER
);
CREATE OR REPLACE FUNCTION public.foo_fun(loop INTEGER) RETURNS BOOLEAN AS $$
SELECT TRUE;
$$ LANGUAGE SQL;
CREATE OR REPLACE FUNCTION public.foo_tr_fun() RETURNS TRIGGER AS $$
DECLARE
fRV BOOLEAN;
BEGIN
SELECT public.foo_fun(NEW.loop) INTO fRV;
IF fRV THEN
RETURN NEW;
ELSE
RAISE EXCEPTION 'bar';
END IF;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER foo_tr AFTER INSERT OR UPDATE ON public.foo
FOR EACH ROW
EXECUTE PROCEDURE public.foo_tr_fun();
... com o qual corro:
psql -v ON_ERROR_STOP=1 --quiet -X -U some-user -d some-db -f test.sql
... quando tento inserir uma linha em foo
(de psql
):
$ psql -U some-user some-db
psql (9.1.14)
Type "help" for help.
RegTAP=> SELECT * FROM public.foo;
loop
------
(0 rows)
RegTAP=> INSERT INTO public.foo(loop) VALUES(0);
ERROR: record "new" has no field "loop"
LINE 1: SELECT public.foo_fun(NEW.loop)
^
QUERY: SELECT public.foo_fun(NEW.loop)
CONTEXT: PL/pgSQL function "foo_tr_fun" line 5 at SQL statement
RegTAP=>
Acontece que a palavra-chave
loop
precisa estar entre aspas duplas dentro do PL/pgSQL ou o analisador fica confuso:A situação no Postgres 9.3 permanece inalterada:
SQL mexe com aspas (funciona).
SQL fiddle sem aspas (não funciona).
Geralmente, é uma boa ideia evitar palavras-chave típicas
loop
como identificadores. Existem algumas palavras-chave plpgsql além das palavras-chave SQL (como para elementos processuais ou tratamento de exceções), mas não conheço uma lista abrangente de palavras-chave plpgsql adicionais. O código-fonte seria minha melhor ideia.Encontrei uma discussão relacionada sobre pgsql-hackers de 2007. Parece que o assunto ainda não está totalmente resolvido.
Também não vi nenhuma alteração aqui para o Postgres 9.4 ...