From: Tom Lane Date: Wed, 5 Apr 2023 19:56:07 +0000 (-0400) Subject: Acquire locks on views in AcquirePlannerLocks, too. X-Git-Tag: REL_16_BETA1~310 X-Git-Url: http://git.postgresql.org/gitweb/?a=commitdiff_plain;h=65eb2d00c6c1bab29db9fa6575185a40d823fe9d;p=postgresql.git Acquire locks on views in AcquirePlannerLocks, too. Commit 47bb9db75 taught AcquireExecutorLocks to re-acquire locks on views using data from their RTE_SUBQUERY replacements, but it now seems like we should make AcquirePlannerLocks do the same. In this way, if a view has been redefined, we will notice that a bit earlier while checking validity of a cached plan and thereby avoid some wasted work. Report and patch by Amit Langote. Discussion: https://postgr.es/m/CA+HiwqH0xZOQ+GQAdKeckY1R4NOeHdzhtfxkAMJLSchpapNk5w@mail.gmail.com --- diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index 77c2ba3f8f4..87210fcf627 100644 --- a/src/backend/utils/cache/plancache.c +++ b/src/backend/utils/cache/plancache.c @@ -1846,6 +1846,14 @@ ScanQueryForLocks(Query *parsetree, bool acquire) break; case RTE_SUBQUERY: + /* If this was a view, must lock/unlock the view */ + if (OidIsValid(rte->relid)) + { + if (acquire) + LockRelationOid(rte->relid, rte->rellockmode); + else + UnlockRelationOid(rte->relid, rte->rellockmode); + } /* Recurse into subquery-in-FROM */ ScanQueryForLocks(rte->subquery, acquire); break;