pgsql: Fix misbehavior of CTE-used-in-a-subplan during EPQ rechecks.

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)postgresql(dot)org
Subject: pgsql: Fix misbehavior of CTE-used-in-a-subplan during EPQ rechecks.
Date: 2018-02-19 21:00:41
Message-ID: E1ensYD-0001Pa-CL@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Fix misbehavior of CTE-used-in-a-subplan during EPQ rechecks.

An updating query that reads a CTE within an InitPlan or SubPlan could get
incorrect results if it updates rows that are concurrently being modified.
This is caused by CteScanNext supposing that nothing inside its recursive
ExecProcNode call could change which read pointer is selected in the CTE's
shared tuplestore. While that's normally true because of scoping
considerations, it can break down if an EPQ plan tree gets built during the
call, because EvalPlanQualStart builds execution trees for all subplans
whether they're going to be used during the recheck or not. And it seems
like a pretty shaky assumption anyway, so let's just reselect our own read
pointer here.

Per bug #14870 from Andrei Gorita. This has been broken since CTEs were
implemented, so back-patch to all supported branches.

Discussion: https://postgr.es/m/20171024155358.1471.82377@wrigleys.postgresql.org

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/159efe4af4509741c25d6b95ddd9fda86facce42

Modified Files
--------------
src/backend/executor/nodeCtescan.c | 13 +++++++++++++
src/test/isolation/expected/eval-plan-qual.out | 15 +++++++++++++++
src/test/isolation/specs/eval-plan-qual.spec | 9 +++++++++
3 files changed, 37 insertions(+)

Browse pgsql-committers by date

  From Date Subject
Next Message David G. Johnston 2018-02-19 22:16:48 Re: pgsql: Allow UNIQUE indexes on partitioned tables
Previous Message Alvaro Herrera 2018-02-19 20:57:46 pgsql: Fix expected output