diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c index 78b566532e..2a6ddf11ff 100644 --- a/src/backend/catalog/catalog.c +++ b/src/backend/catalog/catalog.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/catalog/catalog.c,v 1.43 2001/08/10 18:57:33 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/catalog/catalog.c,v 1.44 2001/11/16 23:30:35 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -77,6 +77,10 @@ GetDatabasePath(Oid tblNode) * IsSystemRelationName * True iff name is the name of a system catalog relation. * + * NB: TOAST relations are considered system relations by this test. + * This is appropriate in many places but not all. Where it's not, + * also check IsToastRelationName. + * * We now make a new requirement where system catalog relns must begin * with pg_ while user relns are forbidden to do so. Make the test * trivial and instantaneous. @@ -86,12 +90,20 @@ GetDatabasePath(Oid tblNode) bool IsSystemRelationName(const char *relname) { - if (relname[0] && relname[1] && relname[2]) - return (relname[0] == 'p' && - relname[1] == 'g' && - relname[2] == '_'); - else - return FALSE; + /* ugly coding for speed */ + return (relname[0] == 'p' && + relname[1] == 'g' && + relname[2] == '_'); +} + +/* + * IsToastRelationName + * True iff name is the name of a TOAST support relation (or index). + */ +bool +IsToastRelationName(const char *relname) +{ + return strncmp(relname, "pg_toast_", 9) == 0; } /* diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c index 11f4dc52bf..a868c6c1c0 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/acl.c,v 1.65 2001/10/25 05:49:43 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/acl.c,v 1.66 2001/11/16 23:30:35 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -385,7 +385,9 @@ acldefault(const char *relname, AclId ownerid) aip = ACL_DAT(acl); aip[0].ai_idtype = ACL_IDTYPE_WORLD; aip[0].ai_id = ACL_ID_WORLD; - aip[0].ai_mode = IsSystemRelationName(relname) ? ACL_SELECT : ACL_WORLD_DEFAULT; + aip[0].ai_mode = (IsSystemRelationName(relname) && + !IsToastRelationName(relname)) ? ACL_SELECT + : ACL_WORLD_DEFAULT; aip[1].ai_idtype = ACL_IDTYPE_UID; aip[1].ai_id = ownerid; aip[1].ai_mode = ACL_OWNER_DEFAULT; diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index 9ebf5f3bf2..40d79942d5 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -56,7 +56,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.46 2001/10/25 05:49:46 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/cache/inval.c,v 1.47 2001/11/16 23:30:35 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -437,9 +437,13 @@ PrepareForTupleInvalidation(Relation relation, HeapTuple tuple, * We only need to worry about invalidation for tuples that are in * system relations; user-relation tuples are never in catcaches and * can't affect the relcache either. + * + * TOAST tuples can likewise be ignored here. */ if (!IsSystemRelationName(NameStr(RelationGetForm(relation)->relname))) return; + if (IsToastRelationName(NameStr(RelationGetForm(relation)->relname))) + return; /* * First let the catcache do its thing diff --git a/src/include/catalog/catalog.h b/src/include/catalog/catalog.h index cf4f36fe4e..25f6fcb0c5 100644 --- a/src/include/catalog/catalog.h +++ b/src/include/catalog/catalog.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: catalog.h,v 1.20 2001/11/05 17:46:31 momjian Exp $ + * $Id: catalog.h,v 1.21 2001/11/16 23:30:35 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -22,6 +22,7 @@ extern char *relpath(RelFileNode rnode); extern char *GetDatabasePath(Oid tblNode); extern bool IsSystemRelationName(const char *relname); +extern bool IsToastRelationName(const char *relname); extern bool IsSharedSystemRelationName(const char *relname); extern Oid newoid(void);