From 1657389c3c44b1765919773ad9cbaaab8a72fa64 Mon Sep 17 00:00:00 2001 From: Amit Langote Date: Mon, 25 Sep 2023 11:52:02 +0900 Subject: [PATCH v50 3/6] Assert that relations needing their permissions checked are locked --- src/backend/executor/execMain.c | 13 +++++++++++++ src/backend/storage/lmgr/lmgr.c | 1 + src/backend/utils/cache/lsyscache.c | 1 - 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 2d5234dee3..5e1b8a42e8 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -52,6 +52,7 @@ #include "miscadmin.h" #include "parser/parse_relation.h" #include "rewrite/rewriteHandler.h" +#include "storage/lmgr.h" #include "tcop/utility.h" #include "utils/acl.h" #include "utils/backend_status.h" @@ -602,6 +603,18 @@ ExecCheckPermissions(List *rangeTable, List *rteperminfos, (rte->rtekind == RTE_SUBQUERY && rte->relkind == RELKIND_VIEW)); + /* + * Relations whose permissions need to be checked must already + * have been locked by the parser or by GetCachedPlan() if a + * cached plan is being executed. + * + * XXX Maybe we should we skip calling ExecCheckPermissions from + * InitPlan in a parallel worker. + */ + Assert(IsParallelWorker() || + CheckRelationOidLockedByMe(rte->relid, AccessShareLock, + true)); + (void) getRTEPermissionInfo(rteperminfos, rte); /* Many-to-one mapping not allowed */ Assert(!bms_is_member(rte->perminfoindex, indexset)); diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c index 094522acb4..a1c89f5d72 100644 --- a/src/backend/storage/lmgr/lmgr.c +++ b/src/backend/storage/lmgr/lmgr.c @@ -26,6 +26,7 @@ #include "storage/procarray.h" #include "storage/sinvaladt.h" #include "utils/inval.h" +#include "utils/lsyscache.h" /* diff --git a/src/backend/utils/cache/lsyscache.c b/src/backend/utils/cache/lsyscache.c index 48a280d089..f647821382 100644 --- a/src/backend/utils/cache/lsyscache.c +++ b/src/backend/utils/cache/lsyscache.c @@ -2113,7 +2113,6 @@ get_rel_relam(Oid relid) return result; } - /* ---------- TRANSFORM CACHE ---------- */ Oid -- 2.43.0