PostgreSQL prend en charge l'appel des fonctions de retour d'ensemble dans le SELECT
clause. Ceci est quelque peu obsolète maintenant que nous avons LATERAL
et est certes déconseillé car il a un comportement plutôt erratique, mais il reste utile.
Dans votre cas, vous pourriez écrire :
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
Cependant, cela peut entraîner un appel à partition_into_months
par colonne renvoyée car (fn).*
est essentiellement macro-développé en (fn).col1, (fn).col2, ...
. Pour éviter cela, vous pouvez l'envelopper dans une sous-requête, par exemple
SELECT (x.i).*, (x.p).*
FROM
(
SELECT
i,
partition_into_months(i.start_date, i.stop_or_current_date) p
FROM invoicable_interval i
) x(i,p);
Notez que des résultats étranges seront rencontrés en présence de plusieurs fonctions de retour d'ensemble dans le SELECT
liste. Ce n'est pas une jointure croisée comme on pourrait s'y attendre. Par exemple, comparez :
SELECT generate_series(1,4), generate_series(1,4)
à
SELECT generate_series(1,4), generate_series(1,3);