Skip to content

Commit 3171edd

Browse files
committed
Fix ExecOpenScanRelation to take a lock on a ROW_MARK_COPY relation.
ExecOpenScanRelation assumed that any relation listed in the ExecRowMark list has been locked by InitPlan; but this is not true if the rel's markType is ROW_MARK_COPY, which is possible if it's a foreign table. In most (possibly all) cases, failure to acquire a lock here isn't really problematic because the parser, planner, or plancache would have taken the appropriate lock already. In principle though it might leave us vulnerable to working with a relation that we hold no lock on, and in any case if the executor isn't depending on previously-taken locks otherwise then it should not do so for ROW_MARK_COPY relations. Noted by Etsuro Fujita. Back-patch to all active versions, since the inconsistency has been there a long time. (It's almost certainly irrelevant in 9.0, since that predates foreign tables, but the code's still wrong on its own terms.)
1 parent 16be973 commit 3171edd

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

src/backend/executor/execMain.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,10 @@ InitPlan(QueryDesc *queryDesc, int eflags)
808808
if (rc->isParent)
809809
continue;
810810

811+
/*
812+
* If you change the conditions under which rel locks are acquired
813+
* here, be sure to adjust ExecOpenScanRelation to match.
814+
*/
811815
switch (rc->markType)
812816
{
813817
case ROW_MARK_EXCLUSIVE:

src/backend/executor/execUtils.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -820,7 +820,9 @@ ExecOpenScanRelation(EState *estate, Index scanrelid, int eflags)
820820
{
821821
ExecRowMark *erm = lfirst(l);
822822

823-
if (erm->rti == scanrelid)
823+
/* Keep this check in sync with InitPlan! */
824+
if (erm->rti == scanrelid &&
825+
erm->relation != NULL)
824826
{
825827
lockmode = NoLock;
826828
break;

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy