A mensagem de erro é bastante óbvia, você não pode descartar uma tabela temporária enquanto ela está sendo usada.
Você pode evitar o problema adicionando
ON COMMIT DROP
:No entanto, isso provavelmente pode ser mais simples. Se você não precisar todas essas tabelas temporárias para começar (o que eu suspeito), você pode substituí-las todas por CTEs (ou a maioria delas provavelmente até com subconsultas mais baratas) e simplificar para uma grande consulta. Pode ser plpgsql ou apenas SQL:
CREATE FUNCTION everything(waypoints)
RETURNS TABLE(node int, xy text[]) AS
$func$
WITH bbox AS (SELECT ... FROM waypoints) -- not the fct. parameter!
, b_spaces AS (SELECT ... )
, b_graph AS (SELECT ... )
, local_green AS (SELECT ... )
, aug_temp AS (SELECT ... )
, b_graph2(source, target, cost) AS (
SELECT ... FROM b_graph
UNION ALL -- guessing you really want UNION ALL
SELECT ... FROM aug_temp
UNION ALL
SELECT ... FROM aug_temp
)
, results AS (SELECT id1, ... FROM b_graph2)
, pkg AS (SELECT loc, ... )
SELECT id1, array_agg(loc)
FROM pkg
GROUP BY id1
$func$ LANGUAGE sql;
As visualizações estão apenas armazenando uma consulta ("a receita"), não os valores reais resultantes ("a sopa").
Normalmente, é mais barato usar CTEs em vez de criar tabelas temporárias.
Tabelas derivadas em consultas , classificados por seu desempenho geral típico (exceções para casos especiais envolvendo índices). De lento a rápido:
CREATE TABLE
CREATE UNLOGGED TABLE
CREATE TEMP TABLE
CTE
subquery
UNION
tentaria dobrar linhas duplicadas. Normalmente, as pessoas realmente querem UNION ALL
, que apenas acrescenta linhas. Mais rápido e não tenta remover dupes.