From 65eb2d00c6c1bab29db9fa6575185a40d823fe9d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Wed, 5 Apr 2023 15:56:07 -0400 Subject: [PATCH] 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 --- src/backend/utils/cache/plancache.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/backend/utils/cache/plancache.c b/src/backend/utils/cache/plancache.c index 77c2ba3f8f..87210fcf62 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;