Perché esiste una differenza nel comportamento tra l'utilizzo di una funzione di ritorno (SRF) nell'elenco SELECT e l'utilizzo di SRF nella clausola FROM?
Ad esempio, per un semplice SRF che restituisce 2 righe:
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();
restituisce due righe a colonna singola contenenti ciascuna un record:
=> gen_series
------------
(1,1)
(2,2)
(2 rows)
Considerando che SELECT * FROM gen_series();
restituisce due righe con il record espanso:
=> column1 | column2
---------+---------
1 | 1
2 | 2
(2 rows)
In confronto, se l'SRF restituisce una singola colonna, la chiamata all'SRF nella clausola SELECT o FROM non fa alcuna differenza. per esempio:
=> SELECT generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
=> SELECT * FROM generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
Le mie domande sono:
Non capisco bene perché nel secondo caso, il comportamento SRF sia diverso dal primo caso solo perché la tabella restituita ha una singola colonna. Questo comportamento è davvero coerente in termini di tipi, tuple e set?
Qual è la differenza tra i due casi che porta al diverso comportamento?
L'SRF può essere utilizzato come tabelle come mostrato sopra, ma le tabelle possono essere utilizzate anche per sostituire gli SRF? per esempio
SELECT my_table;
Apparentemente, questo non può essere fatto, ma perché è SELECT my_SRF();
possibile, mentre
SELECT my_table;
non è permesso (in termini di relazioni e matematica)?
SELECT my_table;
non è una sintassi valida