Por que existe uma diferença de comportamento entre o uso de uma SRF (Set Returning Function) na lista SELECT e o uso de SRF na cláusula FROM?
Por exemplo, para um SRF simples retornando 2 linhas:
CREATE OR REPLACE FUNCTION gen_series(out integer, out int)
RETURNS SETOF record AS $$
SELECT 1,1
UNION
SELECT 2,2;
$$ LANGUAGE SQL;
SELECT gen_series();
retorna duas linhas de coluna única, cada uma contendo um registro:
=> gen_series
------------
(1,1)
(2,2)
(2 rows)
Considerando que SELECT * FROM gen_series();
retorna duas linhas com o registro expandido:
=> column1 | column2
---------+---------
1 | 1
2 | 2
(2 rows)
Por comparação, se o SRF estiver retornando uma única coluna, chamar o SRF na cláusula SELECT ou FROM não fará diferença. por exemplo:
=> SELECT generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
=> SELECT * FROM generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
Minhas perguntas são:
Não vejo bem por que, no segundo caso, o comportamento do SRF é diferente do primeiro caso apenas porque a tabela retornada possui uma única coluna. Esse comportamento é realmente consistente em termos de tipos, tuplas e conjuntos?
Qual é a diferença entre os dois casos que leva ao comportamento diferente?
O SRF pode ser usado como tabelas, como mostrado acima, mas as tabelas também podem ser usadas para substituir os SRFs? por exemplo
SELECT my_table;
Aparentemente, isso não pode ser feito, mas por que é SELECT my_SRF();
possível, enquanto
SELECT my_table;
não é permitido (em termos de relações e matemática)?
SELECT my_table;
não é uma sintaxe válida