| From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
|---|---|
| To: | Kirill Reshke <reshkekirill(at)gmail(dot)com> |
| Cc: | PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
| Subject: | Re: PostgreSQL select-only CTE removal is too aggressive? |
| Date: | 2026-06-29 15:17:08 |
| Message-ID: | 1704236.1782746228@sss.pgh.pa.us |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Kirill Reshke <reshkekirill(at)gmail(dot)com> writes:
> I don't find where this behaviour is actually explicitly documented.
> For data-modifying CTEs we have this[1]:
> Data-modifying statements in WITH are executed exactly once, and
> always to completion, independently of whether the primary query reads
> all (or indeed any) of their output. Notice that this is different
> from the rule for SELECT in WITH: as stated in the previous section,
> execution of a SELECT is carried only as far as the primary query
> demands its output.
I don't see how this is not a direct, obvious consequence of that
rule. The primary query demands none of the unreferenced CTE's
output, therefore it is not executed at all.
The referenced text in the "previous section" is
This works because PostgreSQL's implementation
evaluates only as many rows of a WITH query as are actually
fetched by the parent query.
which is the same thing in slightly different words.
regards, tom lane
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Bharath Rupireddy | 2026-06-29 15:22:50 | Re: Report oldest xmin source when autovacuum cannot remove tuples |
| Previous Message | Nathan Bossart | 2026-06-29 15:16:40 | Re: bump minimum supported version of psql and pg_{dump,dumpall,upgrade} to v10 |