diff options
Diffstat (limited to 'src/backend/utils/cache/syscache.c')
-rw-r--r-- | src/backend/utils/cache/syscache.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/backend/utils/cache/syscache.c b/src/backend/utils/cache/syscache.c index f41b1c221a1..f7f4f56a4d2 100644 --- a/src/backend/utils/cache/syscache.c +++ b/src/backend/utils/cache/syscache.c @@ -287,11 +287,9 @@ HeapTuple SearchSysCacheLocked1(int cacheId, Datum key1) { + CatCache *cache = SysCache[cacheId]; ItemPointerData tid; LOCKTAG tag; - Oid dboid = - SysCache[cacheId]->cc_relisshared ? InvalidOid : MyDatabaseId; - Oid reloid = cacheinfo[cacheId].reloid; /*---------- * Since inplace updates may happen just before our LockTuple(), we must @@ -343,8 +341,15 @@ SearchSysCacheLocked1(int cacheId, tid = tuple->t_self; ReleaseSysCache(tuple); - /* like: LockTuple(rel, &tid, lockmode) */ - SET_LOCKTAG_TUPLE(tag, dboid, reloid, + + /* + * Do like LockTuple(rel, &tid, lockmode). While cc_relisshared won't + * change from one iteration to another, it may have been a temporary + * "false" until our first SearchSysCache1(). + */ + SET_LOCKTAG_TUPLE(tag, + cache->cc_relisshared ? InvalidOid : MyDatabaseId, + cache->cc_reloid, ItemPointerGetBlockNumber(&tid), ItemPointerGetOffsetNumber(&tid)); (void) LockAcquire(&tag, lockmode, false, false); |