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
 
        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);
 
 -- Fail, not empty
 DROP TABLESPACE regress_tblspace;
 ERROR:  tablespace "regress_tblspace" is not empty
+-- Adequate cache initialization before GRANT
+\c -
+BEGIN;
+GRANT ALL ON TABLESPACE regress_tblspace TO PUBLIC;
+ROLLBACK;
 CREATE ROLE regress_tablespace_user1 login;
 CREATE ROLE regress_tablespace_user2 login;
 GRANT USAGE ON SCHEMA testschema TO regress_tablespace_user2;
 
 -- Fail, not empty
 DROP TABLESPACE regress_tblspace;
 
+-- Adequate cache initialization before GRANT
+\c -
+BEGIN;
+GRANT ALL ON TABLESPACE regress_tblspace TO PUBLIC;
+ROLLBACK;
+
 CREATE ROLE regress_tablespace_user1 login;
 CREATE ROLE regress_tablespace_user2 login;
 GRANT USAGE ON SCHEMA testschema TO regress_tablespace_user2;