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
This commit is contained in:
Tom Lane 2023-04-05 15:56:07 -04:00
parent 84adc8e20f
commit 65eb2d00c6

View File

@ -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;