A manipulação de
anyelement
como um tipo de retorno é descrito em Tipos polimórficos
:Este argumento no seu caso é
relation_name
digitado como anyelement
, e passando NULL::table1
, isso realmente informa ao planejador que essa chamada específica de function1
deve retornar SETOF table1
. Até agora tudo bem. Agora o problema é que uma vez executada, a função não retorna
SETOF table1
mas outra coisa. Isso não é o que o executor estava esperando, daí o erro. Apesar do título da pergunta ser Como retornar linhas dinâmicas... , o que você parece querer são colunas dinâmicas ou conjuntos de resultados polimórficos.
E esta é uma batalha árdua com o SQL, pois para construir o plano de execução de uma consulta, o planejador precisa conhecer cada coluna com seu tipo para cada resultado intermediário. Se você projetar sua consulta com uma função que deve ser executada para encontrar a estrutura de sua saída, isso cria um problema da galinha e do ovo:o planejamento deve preceder a execução, não pode depender disso.
Com sua técnica de inferência de tipo dinâmica aplicada a
anyelement
, o PostgreSQL já está empurrando o envelope para implementar o máximo de polimorfismo possível devido a essa restrição.