O PostgreSQL suporta a chamada de funções de retorno de conjunto no
SELECT
cláusula. Isso está um pouco obsoleto agora que temos LATERAL
e é certamente desencorajado porque tem um comportamento bastante errático, mas continua útil. No seu caso, você poderia escrever:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
No entanto, isso pode resultar em uma chamada para
partition_into_months
por coluna retornada porque (fn).*
é basicamente macro-expandido em (fn).col1, (fn).col2, ...
. Para evitar isso, você pode envolvê-lo em uma subconsulta, por exemplo 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);
Observe que resultados estranhos serão encontrados na presença de várias funções de retorno definidas no
SELECT
Lista. Não é uma junção cruzada como você esperaria. Por exemplo, compare:SELECT generate_series(1,4), generate_series(1,4)
para
SELECT generate_series(1,4), generate_series(1,3);