A seguinte consulta com função não determinística produz duas mesmas linhas - o CTE é calculado e reutilizado.
WITH foo AS (SELECT uuid_generate_v4() AS id)
SELECT id FROM foo
UNION ALL
SELECT id FROM foo
| id
| 741f4f69-416b-4b4c-9226-559527f4a84e
| 741f4f69-416b-4b4c-9226-559527f4a84e
Essa execução é garantida? O postgres pode decidir inline-lo para
SELECT id FROM (SELECT uuid_generate_v4() AS id) t
UNION ALL
SELECT id FROM (SELECT uuid_generate_v4() AS id) t
| id
| 262f0006-b4d5-440a-a86a-d79cd2684458
| c24b5835-9c5c-4d6f-b649-8e510129015b
que produz dois ids diferentes (e, portanto, resultados diferentes)?
O que o padrão SQL especifica? O Postgres oferece alguma garantia adicional? Se não for garantido, qual é a maneira padrão de reutilizar a instrução que depende de procedimentos não determinísticos?