summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2001-11-16 23:30:35 +0000
committerTom Lane2001-11-16 23:30:35 +0000
commitc845b4272c572efd372b026201c95d58c0b0043f (patch)
tree6f12e21e991e591046c1d5df94e2fd19404952e7
parentaea081bb275211f9d9e68a05db8c8b3eb31f2585 (diff)
IsSystemRelationName() treats TOAST relations as system relations.
This seems the right thing for most usages, but I notice two places where it is the wrong thing. One is that the default permissions on TOAST rels should be no-access, not world-readable; the other is that PrepareForTupleInvalidation doesn't really need to spend time looking at tuples of TOAST relations.
-rw-r--r--src/backend/catalog/catalog.c26
-rw-r--r--src/backend/utils/adt/acl.c6
-rw-r--r--src/backend/utils/cache/inval.c6
-rw-r--r--src/include/catalog/catalog.h3
4 files changed, 30 insertions, 11 deletions
diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c
index 78b566532ef..2a6ddf11ff3 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 11f4dc52bf0..a868c6c1c05 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 9ebf5f3bf2f..40d79942d5e 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 cf4f36fe4eb..25f6fcb0c5c 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);