]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
IsSystemRelationName() treats TOAST relations as system relations.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 16 Nov 2001 23:30:35 +0000 (23:30 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 16 Nov 2001 23:30:35 +0000 (23:30 +0000)
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.

src/backend/catalog/catalog.c
src/backend/utils/adt/acl.c
src/backend/utils/cache/inval.c
src/include/catalog/catalog.h

index 78b566532efe1d96a034b9b3288a6c7196ee1e56..2a6ddf11ff3a8d685833ce82c21c65af9c138348 100644 (file)
@@ -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;
 }
 
 /*
index 11f4dc52bf00b8e87060b2be1a72495e44f222db..a868c6c1c054a3ed0a9177295fe2e4d81f80bbd0 100644 (file)
@@ -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;
index 9ebf5f3bf2f086a4475597a5995133aaf39cf548..40d79942d5e0203e137d5bed7ff14e0207c9cb28 100644 (file)
@@ -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
index cf4f36fe4eb80bed2188174cb251c78d404f0298..25f6fcb0c5c1dc92877f1ec57ee16faa6752f279 100644 (file)
@@ -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);