diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index b0e06c037f..20be094f46 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -3543,6 +3543,13 @@ RelationBuildLocalRelation(const char *relname, rel->rd_rel->relam = accessmtd; + /* + * RelationInitTableAccessMethod will do syscache lookups, so we mustn't + * run it in CacheMemoryContext. Fortunately, the remaining steps don't + * require a long-lived current context. + */ + MemoryContextSwitchTo(oldcxt); + if (relkind == RELKIND_RELATION || relkind == RELKIND_SEQUENCE || relkind == RELKIND_TOASTVALUE || @@ -3566,11 +3573,6 @@ RelationBuildLocalRelation(const char *relname, */ EOXactListAdd(rel); - /* - * done building relcache entry. - */ - MemoryContextSwitchTo(oldcxt); - /* It's fully valid */ rel->rd_isvalid = true;