diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index ad7e2072908a54e7cd0761027c803c7bbad62512..90d37b566ae6e2549cd97077c87989a22b7798ae 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -817,6 +817,10 @@ InitPlan(QueryDesc *queryDesc, int eflags) /* get relation's OID (will produce InvalidOid if subquery) */ relid = getrelid(rc->rti, rangeTable); + /* + * If you change the conditions under which rel locks are acquired + * here, be sure to adjust ExecOpenScanRelation to match. + */ switch (rc->markType) { case ROW_MARK_EXCLUSIVE: diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c index 022041bea44c159acc09ecf13994207c00bae2a1..0736d2a310254e959a0fd56077c7d0b41322e587 100644 --- a/src/backend/executor/execUtils.c +++ b/src/backend/executor/execUtils.c @@ -820,7 +820,9 @@ ExecOpenScanRelation(EState *estate, Index scanrelid, int eflags) { ExecRowMark *erm = lfirst(l); - if (erm->rti == scanrelid) + /* Keep this check in sync with InitPlan! */ + if (erm->rti == scanrelid && + erm->relation != NULL) { lockmode = NoLock; break;