As funções Query Language (SQL) e PL/pgSQL tratam as tabelas temporárias de maneira diferente:
begin;
create table foo(id) as values (1);
select * from foo;
/*
id
----
1
*/
savepoint s;
create function f() returns setof integer language sql as $$
create temporary table foo(id) on commit drop as values (2);
select id from foo;
$$;
select * from f();
/*
f
---
1
*/
rollback to s;
create function f() returns setof integer language plpgsql as $$
begin
create temporary table foo(id) on commit drop as values (2);
return query select id from foo;
end;
$$;
select * from f();
/*
f
---
2
*/
rollback;
Os docs dizem :
...Tabelas permanentes existentes com o mesmo nome não são visíveis para a sessão atual enquanto a tabela temporária existir, a menos que sejam referenciadas com nomes qualificados pelo esquema...
Isso não menciona a exceção demonstrada acima. Isso está documentado em outro lugar?
Em outras palavras, isso se aplica a outros objetos, não apenas a tabelas temporárias. Isso também é facilmente demonstrado:
ou ainda:
A sugestão em pgsql-bugs é que a documentação seja corrigida para tornar esse comportamento explícito.
editar:
Uma alteração na documentação aparentemente foi confirmada , mas ainda não está aparecendo nos documentos 9.4
Fiz alguns testes e vi o mesmo. Uma tabela temporária criada dentro de uma função SQL parece ser ignorada. Concordo com o Craig, parece um bug...
No entanto , o truque que anunciei na pergunta relacionada no SO no ano passado ainda parece funcionar, mas não para tabelas temporárias criadas dentro de uma função SQL. Na demonstração a seguir
INSERT
, uma função SQL interna é replanejada...