diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c index 616d875dc3..36a617d8ae 100644 --- a/src/backend/utils/cache/catcache.c +++ b/src/backend/utils/cache/catcache.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.22 1998/02/11 19:12:47 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.23 1998/02/23 17:43:19 scrappy Exp $ * * Notes: * XXX This needs to use exception.h to handle recovery when @@ -620,6 +620,29 @@ ResetSystemCache() MemoryContextSwitchTo(oldcxt); } +/* -------------------------------- + * SystemCacheRelationFlushed + * + * RelationFlushRelation() frees some information referenced in the + * cache structures. So we get informed when this is done and arrange + * for the next SearchSysCache() call that this information is setup + * again. + * -------------------------------- + */ +void +SystemCacheRelationFlushed(Oid relId) +{ + struct catcache *cache; + + for (cache = Caches; PointerIsValid(cache); cache = cache->cc_next) + { + if (cache->relationId == relId) + { + cache->relationId = InvalidOid; + } + } +} + /* -------------------------------- * InitIndexedSysCache * diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index e7b44380ab..20762257e8 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.9 1997/11/17 16:59:22 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.10 1998/02/23 17:43:23 scrappy Exp $ * * Note - this code is real crufty... * @@ -512,6 +512,20 @@ RelationInvalidateRelationCache(Relation relation, (*function) (relationId, objectId); } + +/* + * InitLocalInvalidateData + * + * Setup this before anything could ever get invalid! + * Called by InitPostgres(); + */ +void +InitLocalInvalidateData() +{ + ValidateHacks(); +} + + /* * DiscardInvalid -- * Causes the invalidated cache state to be discarded. diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 28d9848f7b..f40d5a3fdb 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.35 1998/01/31 04:38:52 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.36 1998/02/23 17:43:25 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -65,6 +65,7 @@ #include "utils/relcache.h" #include "utils/hsearch.h" #include "utils/relcache.h" +#include "utils/catcache.h" #include "catalog/catname.h" #include "catalog/catalog.h" @@ -1344,6 +1345,7 @@ RelationFlushRelation(Relation *relationPtr, RelationCacheDelete(relation); FreeTupleDesc(relation->rd_att); + SystemCacheRelationFlushed(relation->rd_id); FreeTriggerDesc(relation); diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index e3ec4131be..2cd2a83b3c 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.22 1998/01/29 03:23:28 scrappy Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.23 1998/02/23 17:43:53 scrappy Exp $ * * NOTES * InitPostgres() is the function called from PostgresMain @@ -62,6 +62,7 @@ #include "utils/elog.h" #include "utils/palloc.h" #include "utils/mcxt.h" /* for EnableMemoryContext, etc. */ +#include "utils/inval.h" #include "catalog/catname.h" #include "catalog/pg_database.h" @@ -586,6 +587,12 @@ InitPostgres(char *name) /* database name */ */ InitUserid(); + /* ---------------- + * initialize local data in cache invalidation stuff + * ---------------- + */ + InitLocalInvalidateData(); + /* ---------------- * ok, all done, now let's make sure we don't do it again. * ---------------- diff --git a/src/include/utils/catcache.h b/src/include/utils/catcache.h index 81215d0987..e32035b749 100644 --- a/src/include/utils/catcache.h +++ b/src/include/utils/catcache.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: catcache.h,v 1.9 1998/01/24 22:50:34 momjian Exp $ + * $Id: catcache.h,v 1.10 1998/02/23 17:44:22 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -66,6 +66,7 @@ extern GlobalMemory CacheCxt; extern void CatalogCacheIdInvalidate(int cacheId, Index hashIndex, ItemPointer pointer); extern void ResetSystemCache(void); +extern void SystemCacheRelationFlushed(Oid relId); extern CatCache * InitSysCache(char *relname, char *indname, int id, int nkeys, int key[], HeapTuple (*iScanfuncP) ()); extern HeapTuple SearchSysCache(struct catcache * cache, Datum v1, Datum v2, diff --git a/src/include/utils/inval.h b/src/include/utils/inval.h index 06ebf21927..a487e88a74 100644 --- a/src/include/utils/inval.h +++ b/src/include/utils/inval.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: inval.h,v 1.7 1997/09/08 21:55:08 momjian Exp $ + * $Id: inval.h,v 1.8 1998/02/23 17:44:24 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -16,6 +16,8 @@ #include #include +extern void InitLocalInvalidateData(void); + extern void DiscardInvalid(void); extern void RegisterInvalid(bool send);