]> granicus.if.org Git - postgresql/commitdiff
Toast all the system-table columns that seem to need it. It turns out
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 6 Aug 2000 04:40:08 +0000 (04:40 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 6 Aug 2000 04:40:08 +0000 (04:40 +0000)
that giving pg_proc a toast table required solving the same problems
we'd have to solve for pg_class --- pg_proc is one of the relations
that gets bootstrapped in relcache.c.  Solution is to go back at the
end of initialization and read in the *real* pg_class row to replace
the phony entry created by formrdesc().  This should work as long as
there's no need to touch any toasted values during initialization,
which seems a reasonable assumption.
Although I did not add a toast-table for every single system table
with a varlena attribute, I believe that it would work to just do
ALTER TABLE pg_class CREATE TOAST TABLE.  So anyone who's really
intent on having several thousand ACL entries for a rel could do it.
NOTE: I didn't force initdb, but you must do one to see the effects
of this patch.

src/backend/commands/analyze.c
src/backend/utils/cache/relcache.c
src/backend/utils/init/postinit.c
src/bin/initdb/initdb.sh
src/include/catalog/pg_attribute.h
src/include/utils/relcache.h

index c584d9722091b29c1325fa377698e663d710ca2c..757003f81129fc5e079cac53e4440c34d4cd328e 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.3 2000/07/05 23:11:08 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/commands/analyze.c,v 1.4 2000/08/06 04:40:08 tgl Exp $
  *
 
  *-------------------------------------------------------------------------
@@ -106,7 +106,7 @@ analyze_rel(Oid relid, List *anal_cols2, int MESSAGE_LEVEL)
                elog(NOTICE, "Skipping \"%s\" --- only table owner can VACUUM it",
                         RelationGetRelationName(onerel));
                */
-               heap_close(onerel, AccessExclusiveLock);
+               heap_close(onerel, NoLock);
                CommitTransactionCommand();
                return;
        }
@@ -220,7 +220,8 @@ analyze_rel(Oid relid, List *anal_cols2, int MESSAGE_LEVEL)
 
        heap_endscan(scan);
 
-       heap_close(onerel, AccessShareLock);
+       /* close rel, but keep lock so it doesn't go away before commit */
+       heap_close(onerel, NoLock);
 
        /* update statistics in pg_class */
        update_attstats(relid, attr_cnt, vacattrstats);
@@ -388,8 +389,8 @@ bucketcpy(Form_pg_attribute attr, Datum value, Datum *bucket, int *bucket_len)
 /*
  *     update_attstats() -- update attribute statistics for one relation
  *
- *             Updates of pg_attribute statistics are handled by over-write.
- *             for reasons described above.
+ *             Updates of pg_attribute statistics are handled by over-write,
+ *             for reasons described above.  pg_statistic rows are added normally.
  *
  *             To keep things simple, we punt for pg_statistic, and don't try
  *             to compute or store rows for pg_statistic itself in pg_statistic.
@@ -510,7 +511,7 @@ update_attstats(Oid relid, int natts, VacAttrStats *vacattrstats)
                         * deleted all the pg_statistic tuples for the rel, so we
                         * just have to insert new ones here.
                         *
-                        * Note vacuum_rel() has seen to it that we won't come here
+                        * Note analyze_rel() has seen to it that we won't come here
                         * when vacuuming pg_statistic itself.
                         */
                        if (VacAttrStatsLtGtValid(stats) && stats->initialized)
@@ -524,6 +525,7 @@ update_attstats(Oid relid, int natts, VacAttrStats *vacattrstats)
                                                        nonnull_cnt_d = stats->nonnull_cnt;             /* prevent overflow */
                                Datum           values[Natts_pg_statistic];
                                char            nulls[Natts_pg_statistic];
+                               Relation        irelations[Num_pg_statistic_indices];
 
                                nullratio = null_cnt_d / (nonnull_cnt_d + null_cnt_d);
                                bestratio = best_cnt_d / (nonnull_cnt_d + null_cnt_d);
@@ -567,31 +569,12 @@ update_attstats(Oid relid, int natts, VacAttrStats *vacattrstats)
 
                                stup = heap_formtuple(sd->rd_att, values, nulls);
 
-                               /* ----------------
-                                *      Watch out for oversize tuple, which can happen if
-                                *      all three of the saved data values are long.
-                                *      Our fallback strategy is just to not store the
-                                *      pg_statistic tuple at all in that case.  (We could
-                                *      replace the values by NULLs and still store the
-                                *      numeric stats, but presently selfuncs.c couldn't
-                                *      do anything useful with that case anyway.)
-                                *
-                                *      We could reduce the probability of overflow, but not
-                                *      prevent it, by storing the data values as compressed
-                                *      text; is that worth doing?      The problem should go
-                                *      away whenever long tuples get implemented...
-                                * ----------------
-                                */
-                               if (MAXALIGN(stup->t_len) <= MaxTupleSize)
-                               {
-                                       /* OK, store tuple and update indexes too */
-                                       Relation        irelations[Num_pg_statistic_indices];
+                               /* store tuple and update indexes too */
+                               heap_insert(sd, stup);
 
-                                       heap_insert(sd, stup);
-                                       CatalogOpenIndices(Num_pg_statistic_indices, Name_pg_statistic_indices, irelations);
-                                       CatalogIndexInsert(irelations, Num_pg_statistic_indices, sd, stup);
-                                       CatalogCloseIndices(Num_pg_statistic_indices, irelations);
-                               }
+                               CatalogOpenIndices(Num_pg_statistic_indices, Name_pg_statistic_indices, irelations);
+                               CatalogIndexInsert(irelations, Num_pg_statistic_indices, sd, stup);
+                               CatalogCloseIndices(Num_pg_statistic_indices, irelations);
 
                                /* release allocated space */
                                pfree(DatumGetPointer(values[Anum_pg_statistic_stacommonval - 1]));
index 84f20757d6a237a3eac36f70d660622176945ed5..59758adb62d0f2f370f4f0e98357b923e24d8c51 100644 (file)
@@ -8,13 +8,14 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.108 2000/07/30 22:13:55 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.109 2000/08/06 04:39:03 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
 /*
  * INTERFACE ROUTINES
- *             RelationInitialize                              - initialize relcache
+ *             RelationCacheInitialize                 - initialize relcache
+ *             RelationCacheInitializePhase2   - finish initializing relcache
  *             RelationIdCacheGetRelation              - get a reldesc from the cache (id)
  *             RelationNameCacheGetRelation    - get a reldesc from the cache (name)
  *             RelationIdGetRelation                   - get a reldesc by relation id
@@ -217,6 +218,7 @@ static void write_irels(void);
 
 static void formrdesc(char *relationName, int natts,
                  FormData_pg_attribute *att);
+static void fixrdesc(char *relationName);
 
 static HeapTuple ScanPgRelation(RelationBuildDescInfo buildinfo);
 static HeapTuple scan_pg_rel_seq(RelationBuildDescInfo buildinfo);
@@ -1081,8 +1083,9 @@ IndexedAccessMethodInitialize(Relation relation)
  *             formrdesc
  *
  *             This is a special cut-down version of RelationBuildDesc()
- *             used by RelationInitialize() in initializing the relcache.
- *             The relation descriptor is built just from the supplied parameters.
+ *             used by RelationCacheInitialize() in initializing the relcache.
+ *             The relation descriptor is built just from the supplied parameters,
+ *             without actually looking at any system table entries.
  *
  * NOTE: we assume we are already switched into CacheMemoryContext.
  * --------------------------------
@@ -1115,18 +1118,23 @@ formrdesc(char *relationName,
        RelationSetReferenceCount(relation, 1);
 
        /* ----------------
-        *      initialize relation tuple form
+        *      all entries built with this routine are nailed-in-cache
         * ----------------
         */
-       relation->rd_rel = (Form_pg_class) palloc(CLASS_TUPLE_SIZE);
-       MemSet(relation->rd_rel, 0, CLASS_TUPLE_SIZE);
-       strcpy(RelationGetPhysicalRelationName(relation), relationName);
+       relation->rd_isnailed = true;
 
        /* ----------------
-        *      initialize attribute tuple form
+        *      initialize relation tuple form
+        *
+        *      The data we insert here is pretty incomplete/bogus, but it'll
+        *      serve to get us launched.  RelationCacheInitializePhase2() will
+        *      read the real data from pg_class and replace what we've done here.
         * ----------------
         */
-       relation->rd_att = CreateTemplateTupleDesc(natts);
+       relation->rd_rel = (Form_pg_class) palloc(CLASS_TUPLE_SIZE);
+       MemSet(relation->rd_rel, 0, CLASS_TUPLE_SIZE);
+
+       strcpy(RelationGetPhysicalRelationName(relation), relationName);
 
        /*
         * For debugging purposes, it's important to distinguish between
@@ -1134,23 +1142,21 @@ formrdesc(char *relationName,
         * code in the buffer manager that traces allocations that has to know
         * about this.
         */
-
        if (IsSystemRelationName(relationName))
-       {
-               relation->rd_rel->relowner = 6; /* XXX use sym const */
                relation->rd_rel->relisshared = IsSharedSystemRelationName(relationName);
-       }
        else
-       {
-               relation->rd_rel->relowner = 0;
                relation->rd_rel->relisshared = false;
-       }
 
-       relation->rd_rel->relpages = 1;         /* XXX */
-       relation->rd_rel->reltuples = 1;        /* XXX */
+       relation->rd_rel->relpages = 1;
+       relation->rd_rel->reltuples = 1;
        relation->rd_rel->relkind = RELKIND_RELATION;
        relation->rd_rel->relnatts = (int16) natts;
-       relation->rd_isnailed = true;
+
+       /* ----------------
+        *      initialize attribute tuple form
+        * ----------------
+        */
+       relation->rd_att = CreateTemplateTupleDesc(natts);
 
        /* ----------------
         *      initialize tuple desc info
@@ -1187,8 +1193,8 @@ formrdesc(char *relationName,
         * the rdesc for pg_class must already exist.  Therefore we must do
         * the check (and possible set) after cache insertion.
         *
-        * XXX I believe the above comment is misguided; we should be
-        * running in bootstrap or init processing mode, and CatalogHasIndex
+        * XXX I believe the above comment is misguided; we should be running
+        * in bootstrap or init processing mode here, and CatalogHasIndex
         * relies on hard-wired info in those cases.
         */
        relation->rd_rel->relhasindex =
@@ -1196,6 +1202,56 @@ formrdesc(char *relationName,
 }
 
 
+/* --------------------------------
+ *             fixrdesc
+ *
+ *             Update the phony data inserted by formrdesc() with real info
+ *             from pg_class.
+ * --------------------------------
+ */
+static void
+fixrdesc(char *relationName)
+{
+       RelationBuildDescInfo buildinfo;
+       HeapTuple       pg_class_tuple;
+       Form_pg_class relp;
+       Relation        relation;
+
+       /* ----------------
+        *      find the tuple in pg_class corresponding to the given relation name
+        * ----------------
+        */
+       buildinfo.infotype = INFO_RELNAME;
+       buildinfo.i.info_name = relationName;
+
+       pg_class_tuple = ScanPgRelation(buildinfo);
+
+       if (!HeapTupleIsValid(pg_class_tuple))
+               elog(FATAL, "fixrdesc: no pg_class entry for %s",
+                        relationName);
+       relp = (Form_pg_class) GETSTRUCT(pg_class_tuple);
+
+       /* ----------------
+        *      find the pre-made relcache entry (better be there!)
+        * ----------------
+        */
+       relation = RelationNameCacheGetRelation(relationName);
+       if (!RelationIsValid(relation))
+               elog(FATAL, "fixrdesc: no existing relcache entry for %s",
+                        relationName);
+
+       /* ----------------
+        *      and copy pg_class_tuple to relation->rd_rel.
+        *      (See notes in AllocateRelationDesc())
+        * ----------------
+        */
+       Assert(relation->rd_rel != NULL);
+       memcpy((char *) relation->rd_rel, (char *) relp, CLASS_TUPLE_SIZE);
+
+       heap_freetuple(pg_class_tuple);
+}
+
+
 /* ----------------------------------------------------------------
  *                              Relation Descriptor Lookup Interface
  * ----------------------------------------------------------------
@@ -1829,7 +1885,7 @@ RelationPurgeLocalRelation(bool xactCommitted)
 }
 
 /* --------------------------------
- *             RelationInitialize
+ *             RelationCacheInitialize
  *
  *             This initializes the relation descriptor cache.
  * --------------------------------
@@ -1838,7 +1894,7 @@ RelationPurgeLocalRelation(bool xactCommitted)
 #define INITRELCACHESIZE               400
 
 void
-RelationInitialize(void)
+RelationCacheInitialize(void)
 {
        MemoryContext oldcxt;
        HASHCTL         ctl;
@@ -1870,6 +1926,8 @@ RelationInitialize(void)
         *      initialize the cache with pre-made relation descriptors
         *      for some of the more important system relations.  These
         *      relations should always be in the cache.
+        *
+        *      NB: see also the list in RelationCacheInitializePhase2().
         * ----------------
         */
        formrdesc(RelationRelationName, Natts_pg_class, Desc_pg_class);
@@ -1892,6 +1950,34 @@ RelationInitialize(void)
        MemoryContextSwitchTo(oldcxt);
 }
 
+/* --------------------------------
+ *             RelationCacheInitializePhase2
+ *
+ *             This completes initialization of the relcache after catcache
+ *             is functional and we are able to actually load data from pg_class.
+ * --------------------------------
+ */
+void
+RelationCacheInitializePhase2(void)
+{
+       /*
+        * Get the real pg_class tuple for each nailed-in-cache relcache entry
+        * that was made by RelationCacheInitialize(), and replace the phony
+        * rd_rel entry made by formrdesc().  This is necessary so that we have,
+        * for example, the correct toast-table info for tables that have such.
+        */
+       if (!IsBootstrapProcessingMode())
+       {
+               fixrdesc(RelationRelationName);
+               fixrdesc(AttributeRelationName);
+               fixrdesc(ProcedureRelationName);
+               fixrdesc(TypeRelationName);
+               /* We don't bother to update the entries for pg_variable or pg_log. */
+       }
+}
+
+
+
 static void
 AttrDefaultFetch(Relation relation)
 {
index ba0e2dd97afa02cf0dc006ca05ceb294ec23aa0c..f63590cdb98b1afc0dcddd3c2d47f8b9b8116c6b 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.63 2000/07/08 03:04:16 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/utils/init/postinit.c,v 1.64 2000/08/06 04:39:10 tgl Exp $
  *
  *
  *-------------------------------------------------------------------------
@@ -313,7 +313,8 @@ InitPostgres(const char *dbname)
         * it to examine AMI transaction status, and this is never written
         * after initdb is done. -mer 15 June 1992
         */
-       RelationInitialize();           /* pre-allocated reldescs created here */
+       RelationCacheInitialize();      /* pre-allocated reldescs created here */
+
        InitializeTransactionSystem();          /* pg_log,etc init/crash recovery
                                                                                 * here */
 
@@ -362,6 +363,9 @@ InitPostgres(const char *dbname)
        if (!bootstrap)
                StartTransactionCommand();
 
+       /* replace faked-up relcache entries with the real info */
+       RelationCacheInitializePhase2();
+
        /*
         * Set ourselves to the proper user id and figure out our postgres
         * user id.  If we ever add security so that we check for valid
index 8fbc8c68260628b7a0b7da2a73c2e9c158f3e266..6a23e7a72dc9cfedb5837c5d9f14208fdb60863b 100644 (file)
@@ -23,7 +23,7 @@
 #
 # Copyright (c) 1994, Regents of the University of California
 #
-# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.101 2000/07/06 21:33:38 petere Exp $
+# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.102 2000/08/06 04:39:22 tgl Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -519,9 +519,19 @@ if [ "$PwPrompt" ]; then
 fi
 
 
-echo "Enabling unlimited storage for pg_rewrite"
+echo "Enabling unlimited row width for system tables."
+echo "ALTER TABLE pg_attrdef CREATE TOAST TABLE" \
+        | "$PGPATH"/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+echo "ALTER TABLE pg_description CREATE TOAST TABLE" \
+        | "$PGPATH"/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+echo "ALTER TABLE pg_proc CREATE TOAST TABLE" \
+        | "$PGPATH"/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+echo "ALTER TABLE pg_relcheck CREATE TOAST TABLE" \
+        | "$PGPATH"/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
 echo "ALTER TABLE pg_rewrite CREATE TOAST TABLE" \
         | "$PGPATH"/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
+echo "ALTER TABLE pg_statistic CREATE TOAST TABLE" \
+        | "$PGPATH"/postgres $PGSQL_OPT template1 > /dev/null || exit_nicely
 
 
 echo "Creating view pg_user."
index 0ced47b064a6911cc59e5e840748efc7eb7ccf7c..1be654ee5b7f34699a00c453999a89359ed48d3d 100644 (file)
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: pg_attribute.h,v 1.62 2000/07/31 22:39:06 tgl Exp $
+ * $Id: pg_attribute.h,v 1.63 2000/08/06 04:39:33 tgl Exp $
  *
  * NOTES
  *       the genbki.sh script reads this file and generates .bki
@@ -130,9 +130,11 @@ CATALOG(pg_attribute) BOOTSTRAP
         * Possible values are
         *              'p': Value must be stored plain always
         *              'e': Value can be stored in "secondary" relation (if relation
-        *                       has rellongrelid attached)
+        *                       has one, see pg_class.reltoastrelid)
         *              'm': Value can be stored compressed inline
         *              'x': Value can be stored compressed inline or in "secondary"
+        * Note that 'm' fields can also be moved out to secondary storage,
+        * but only as a last resort ('e' and 'x' fields are moved first).
         *----------
         */
 
@@ -245,7 +247,7 @@ typedef FormData_pg_attribute *Form_pg_attribute;
 { 1247, {"typsend"},      24, 0,       4, 14, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
 { 1247, {"typalign"},     18, 0,       1, 15, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
 { 1247, {"typstorage"},           18, 0,       1, 16, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1247, {"typdefault"},    25, 0,  -1, 17, 0, -1, -1, '\0'     , 'p', '\0', 'i', '\0', '\0' }
+{ 1247, {"typdefault"},    25, 0,  -1, 17, 0, -1, -1, '\0'     , 'x', '\0', 'i', '\0', '\0' }
 
 DATA(insert OID = 0 ( 1247 typname                     19 0 NAMEDATALEN   1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1247 typowner                    23 0  4   2 0 -1 -1 t p f i f f));
@@ -263,7 +265,7 @@ DATA(insert OID = 0 ( 1247 typreceive               24 0  4  13 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1247 typsend                     24 0  4  14 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1247 typalign                    18 0  1  15 0 -1 -1 t p f c f f));
 DATA(insert OID = 0 ( 1247 typstorage          18 0  1  16 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1247 typdefault          25 0 -1  17 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1247 typdefault          25 0 -1  17 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1247 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1247 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1247 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
@@ -279,7 +281,7 @@ DATA(insert OID = 0 ( 1247 tableoid                 26 0  4  -7 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1262 datname                     19 0 NAMEDATALEN   1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1262 datdba                      23 0  4   2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1262 encoding                    23 0  4   3 0 -1 -1 t p f i f f));
-DATA(insert OID = 0 ( 1262 datpath                     25 0 -1   4 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1262 datpath                     25 0 -1   4 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1262 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1262 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1262 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
@@ -308,8 +310,8 @@ DATA(insert OID = 0 ( 1262 tableoid                 26 0  4  -7 0 -1 -1 t p f i f f));
 { 1255, {"properbyte_cpu"},            23, 0,  4, 13, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
 { 1255, {"propercall_cpu"},            23, 0,  4, 14, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
 { 1255, {"prooutin_ratio"},            23, 0,  4, 15, 0, -1, -1, '\001', 'p', '\0', 'i', '\0', '\0' }, \
-{ 1255, {"prosrc"},                            25, 0, -1, 16, 0, -1, -1, '\0', 'p', '\0', 'i', '\0', '\0' }, \
-{ 1255, {"probin"},                            17, 0, -1, 17, 0, -1, -1, '\0', 'p', '\0', 'i', '\0', '\0' }
+{ 1255, {"prosrc"},                            25, 0, -1, 16, 0, -1, -1, '\0', 'x', '\0', 'i', '\0', '\0' }, \
+{ 1255, {"probin"},                            17, 0, -1, 17, 0, -1, -1, '\0', 'x', '\0', 'i', '\0', '\0' }
 
 DATA(insert OID = 0 ( 1255 proname                     19 0 NAMEDATALEN   1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1255 proowner                    23 0  4   2 0 -1 -1 t p f i f f));
@@ -326,8 +328,8 @@ DATA(insert OID = 0 ( 1255 probyte_pct              23 0  4  12 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1255 properbyte_cpu      23 0  4  13 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1255 propercall_cpu      23 0  4  14 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1255 prooutin_ratio      23 0  4  15 0 -1 -1 t p f i f f));
-DATA(insert OID = 0 ( 1255 prosrc                      25 0 -1  16 0 -1 -1 f p f i f f));
-DATA(insert OID = 0 ( 1255 probin                      17 0 -1  17 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1255 prosrc                      25 0 -1  16 0 -1 -1 f x f i f f));
+DATA(insert OID = 0 ( 1255 probin                      17 0 -1  17 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1255 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1255 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1255 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
@@ -346,7 +348,7 @@ DATA(insert OID = 0 ( 1260 usecreatedb              16      0       1       3 0 -1 -1 t p f c f f));
 DATA(insert OID = 0 ( 1260 usetrace                    16      0       1       4 0 -1 -1 t p f c f f));
 DATA(insert OID = 0 ( 1260 usesuper                    16      0       1       5 0 -1 -1 t p f c f f));
 DATA(insert OID = 0 ( 1260 usecatupd           16      0       1       6 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1260 passwd                      25      0  -1   7 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1260 passwd                      25      0  -1   7 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1260 valuntil                    702 0   4       8 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1260 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1260 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
@@ -362,7 +364,7 @@ DATA(insert OID = 0 ( 1260 tableoid                 26 0  4  -7 0 -1 -1 t p f i f f));
  */
 DATA(insert OID = 0 ( 1261 groname                     19 0 NAMEDATALEN  1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1261 grosysid                    23 0  4   2 0 -1 -1 t p f i f f));
-DATA(insert OID = 0 ( 1261 grolist               1007 0 -1   3 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1261 grolist               1007 0 -1   3 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1261 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1261 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1261 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
@@ -440,7 +442,7 @@ DATA(insert OID = 0 ( 1249 tableoid                 26 0  4  -7 0 -1 -1 t p f i f f));
 { 1259, {"relhaspkey"},    16, 0,      1, 18, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
 { 1259, {"relhasrules"},   16, 0,      1, 19, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
 { 1259, {"relhassubclass"},16, 0,      1, 20, 0, -1, -1, '\001', 'p', '\0', 'c', '\0', '\0' }, \
-{ 1259, {"relacl"},             1034, 0,  -1, 21, 0, -1, -1,   '\0', 'm', '\0', 'i', '\0', '\0' }
+{ 1259, {"relacl"},             1034, 0,  -1, 21, 0, -1, -1,   '\0', 'x', '\0', 'i', '\0', '\0' }
 
 DATA(insert OID = 0 ( 1259 relname                     19 0 NAMEDATALEN   1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1259 reltype                     26 0  4   2 0 -1 -1 t p f i f f));
@@ -462,7 +464,7 @@ DATA(insert OID = 0 ( 1259 relrefs                  21 0  2  17 0 -1 -1 t p f s f f));
 DATA(insert OID = 0 ( 1259 relhaspkey          16 0  1  18 0 -1 -1 t p f c f f));
 DATA(insert OID = 0 ( 1259 relhasrules         16 0  1  19 0 -1 -1 t p f c f f));
 DATA(insert OID = 0 ( 1259 relhassubclass      16 0  1  20 0 -1 -1 t p f c f f));
-DATA(insert OID = 0 ( 1259 relacl                1034 0 -1  21 0 -1 -1 f m f i f f));
+DATA(insert OID = 0 ( 1259 relacl                1034 0 -1  21 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1259 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1259 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1259 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
@@ -477,8 +479,8 @@ DATA(insert OID = 0 ( 1259 tableoid                 26 0  4  -7 0 -1 -1 t p f i f f));
  */
 DATA(insert OID = 0 ( 1215 adrelid                     26 0  4   1 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1215 adnum                       21 0  2   2 0 -1 -1 t p f s f f));
-DATA(insert OID = 0 ( 1215 adbin                       25 0 -1   3 0 -1 -1 f p f i f f));
-DATA(insert OID = 0 ( 1215 adsrc                       25 0 -1   4 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1215 adbin                       25 0 -1   3 0 -1 -1 f x f i f f));
+DATA(insert OID = 0 ( 1215 adsrc                       25 0 -1   4 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1215 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1215 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1215 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
@@ -493,8 +495,8 @@ DATA(insert OID = 0 ( 1215 tableoid                 26 0  4  -7 0 -1 -1 t p f i f f));
  */
 DATA(insert OID = 0 ( 1216 rcrelid                     26 0  4   1 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1216 rcname                      19 0  NAMEDATALEN  2 0 -1 -1 f p f i f f));
-DATA(insert OID = 0 ( 1216 rcbin                       25 0 -1   3 0 -1 -1 f p f i f f));
-DATA(insert OID = 0 ( 1216 rcsrc                       25 0 -1   4 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1216 rcbin                       25 0 -1   3 0 -1 -1 f x f i f f));
+DATA(insert OID = 0 ( 1216 rcsrc                       25 0 -1   4 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1216 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1216 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1216 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
@@ -520,7 +522,7 @@ DATA(insert OID = 0 ( 1219 tgdeferrable             16 0  1   9 0 -1 -1 t p f c f f));
 DATA(insert OID = 0 ( 1219 tginitdeferred      16 0  1   10 0 -1 -1 t p f c f f));
 DATA(insert OID = 0 ( 1219 tgnargs                     21 0  2   11 0 -1 -1 t p f s f f));
 DATA(insert OID = 0 ( 1219 tgattr                      22 0  INDEX_MAX_KEYS*2  12 0 -1 -1 f p f i f f));
-DATA(insert OID = 0 ( 1219 tgargs                      17 0 -1   13 0 -1 -1 f p f i f f));
+DATA(insert OID = 0 ( 1219 tgargs                      17 0 -1   13 0 -1 -1 f x f i f f));
 DATA(insert OID = 0 ( 1219 ctid                                27 0  6  -1 0 -1 -1 f p f i f f));
 DATA(insert OID = 0 ( 1219 oid                         26 0  4  -2 0 -1 -1 t p f i f f));
 DATA(insert OID = 0 ( 1219 xmin                                28 0  4  -3 0 -1 -1 t p f i f f));
index aee58942a64d26fbf7cc55b6108af3d4b2042063..a2a2b5eb777ada97c7731797149fa5c08e48dfa7 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: relcache.h,v 1.20 2000/06/17 21:49:04 tgl Exp $
+ * $Id: relcache.h,v 1.21 2000/08/06 04:39:55 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -33,6 +33,12 @@ extern void RelationForgetRelation(Oid rid);
  */
 extern List *RelationGetIndexList(Relation relation);
 
+/*
+ * Routines for backend startup
+ */
+extern void RelationCacheInitialize(void);
+extern void RelationCacheInitializePhase2(void);
+
 /*
  * Routines for flushing/rebuilding relcache entries in various scenarios
  */
@@ -42,7 +48,6 @@ extern void RelationCacheInvalidate(void);
 
 extern void RelationRegisterRelation(Relation relation);
 extern void RelationPurgeLocalRelation(bool xactComitted);
-extern void RelationInitialize(void);
 
 extern void RelationCacheAbort(void);