Add new postgres -O option to allow system table structure changes.
authorBruce Momjian <bruce@momjian.us>
Wed, 17 Mar 1999 22:53:31 +0000 (22:53 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 17 Mar 1999 22:53:31 +0000 (22:53 +0000)
13 files changed:
src/backend/bootstrap/bootstrap.c
src/backend/catalog/aclchk.c
src/backend/catalog/heap.c
src/backend/commands/command.c
src/backend/commands/rename.c
src/backend/commands/trigger.c
src/backend/storage/file/fd.c
src/backend/tcop/postgres.c
src/backend/tcop/utility.c
src/backend/utils/init/globals.c
src/bin/initdb/initdb.sh
src/include/miscadmin.h
src/man/postgres.1

index 7e860e499a7d6a48f07eb03d9037c38e9451af2a..711ed0f796470a75c631ba7ba846d24562fda91a 100644 (file)
@@ -182,7 +182,7 @@ static char *relname;                       /* current relation name */
 Form_pg_attribute attrtypes[MAXATTR];  /* points to attribute info */
 static char *values[MAXATTR];  /* cooresponding attribute values */
 int                    numattr;                        /* number of attributes for cur. rel */
-extern int     fsyncOff;                       /* do not fsync the database */
+extern bool    disableFsync;                   /* do not fsync the database */
 
 /* The test for HAVE_SIGSETJMP fails on Linux 2.0.x because the test
  *     explicitly disallows sigsetjmp being a #define, which is how it
@@ -335,7 +335,7 @@ BootstrapMain(int argc, char *argv[])
                                Noversion = true;
                                break;
                        case 'F':
-                               fsyncOff = true;
+                               disableFsync = true;
                                break;
                        case 'O':
                                override = true;
index 9c24c8f11dfed2f803027dbd95c409214040fc7f..0fde0f2e9a0292ee6f0178ede7b83a0c37e8053c 100644 (file)
@@ -38,6 +38,7 @@
 #include "utils/memutils.h"
 #include "utils/syscache.h"
 #include "utils/tqual.h"
+#include "miscadmin.h"
 
 static int32 aclcheck(char *relname, Acl *acl, AclId id, AclIdType idtype, AclMode mode);
 
@@ -398,7 +399,7 @@ pg_aclcheck(char *relname, char *usename, AclMode mode)
         * themselves from themselves.)
         */
        if (((mode & ACL_WR) || (mode & ACL_AP)) &&
-               IsSystemRelationName(relname) &&
+               !allowSystemTableMods && IsSystemRelationName(relname) &&
                !((Form_pg_shadow) GETSTRUCT(tuple))->usecatupd)
        {
                elog(DEBUG, "pg_aclcheck: catalog update to \"%s\": permission denied",
index fd5355ad7bf336441f6c7cf3bb1200e40bae1996..0eea1b8bac7d9c1b19ea3b673ee92f1f50db53af 100644 (file)
@@ -195,7 +195,7 @@ heap_create(char *relname,
         */
        AssertArg(natts > 0);
 
-       if (relname && IsSystemRelationName(relname) && IsNormalProcessingMode())
+       if (relname && !allowSystemTableMods && IsSystemRelationName(relname) && IsNormalProcessingMode())
        {
                elog(ERROR, "Illegal class name '%s'"
                         "\n\tThe 'pg_' name prefix is reserved for system catalogs",
@@ -1260,7 +1260,8 @@ heap_destroy_with_catalog(char *relname)
         * ----------------
         */
        /* allow temp of pg_class? Guess so. */
-       if (!istemp && IsSystemRelationName(RelationGetRelationName(rel)->data))
+       if (!istemp &&
+               !allowSystemTableMods && IsSystemRelationName(RelationGetRelationName(rel)->data))
                elog(ERROR, "System relation '%s' cannot be destroyed",
                         &rel->rd_rel->relname);
 
index 764f7ec4e156f24bce8b93da110d7d26c0bac6fa..ae5ea16b6763ba8ffa1a82772b5074f7700e9576 100644 (file)
@@ -308,7 +308,7 @@ PerformAddAttribute(char *relationName,
         *
         * normally, only the owner of a class can change its schema.
         */
-       if (IsSystemRelationName(relationName))
+       if (!allowSystemTableMods && IsSystemRelationName(relationName))
                elog(ERROR, "PerformAddAttribute: class \"%s\" is a system catalog",
                         relationName);
 #ifndef NO_SECURITY
index 8ed5e4f4f44f08ff8ba924bf4d82071922703151..a757eca46536872095430cd03f485952360b9c3a 100644 (file)
@@ -81,7 +81,7 @@ renameatt(char *relname,
         *
         * normally, only the owner of a class can change its schema.
         */
-       if (IsSystemRelationName(relname))
+       if (!allowSystemTableMods && IsSystemRelationName(relname))
                elog(ERROR, "renameatt: class \"%s\" is a system catalog",
                         relname);
 #ifndef NO_SECURITY
@@ -207,11 +207,11 @@ renamerel(char *oldrelname, char *newrelname)
                                newpath[MAXPGPATH];
        Relation        irelations[Num_pg_class_indices];
 
-       if (IsSystemRelationName(oldrelname))
+       if (!allowSystemTableMods && IsSystemRelationName(oldrelname))
                elog(ERROR, "renamerel: system relation \"%s\" not renamed",
                         oldrelname);
 
-       if (IsSystemRelationName(newrelname))
+       if (!allowSystemTableMods && IsSystemRelationName(newrelname))
                elog(ERROR, "renamerel: Illegal class name: \"%s\" -- pg_ is reserved for system catalogs",
                         newrelname);
 
index 1a06065da0e8d6a679ffc25b2cf2be96ac9f9627..7299a7660a6676433139c293783113b8baac9145 100644 (file)
@@ -66,7 +66,7 @@ CreateTrigger(CreateTrigStmt *stmt)
        int                     found = 0;
        int                     i;
 
-       if (IsSystemRelationName(stmt->relname))
+       if (!allowSystemTableMods && IsSystemRelationName(stmt->relname))
                elog(ERROR, "CreateTrigger: can't create trigger for system relation %s", stmt->relname);
 
 #ifndef NO_SECURITY
index e1e58a0351b4879bf9961befb01e5f49779058bd..6244b37c86a99e42ddfee1450075608c72d2b08b 100644 (file)
@@ -168,9 +168,7 @@ static long pg_nofile(void);
 int
 pg_fsync(int fd)
 {
-       extern int      fsyncOff;
-
-       return fsyncOff ? 0 : fsync(fd);
+       return disableFsync ? 0 : fsync(fd);
 }
 
 #define fsync pg_fsync
index d54b0fa72b0db8e10f97871e1bf713ee2c63f3ed..b4fb2ef0feac0e4d73754bf18a415394a9697b37 100644 (file)
@@ -917,6 +917,7 @@ usage(char *progname)
 #ifdef LOCK_MGR_DEBUG
        fprintf(stderr, "\t-K \t\tset locking debug level [0|1|2]\n");
 #endif
+       fprintf(stderr, "\t-O \t\tallow system table structure changes\n");
        fprintf(stderr, "\t-P port\t\tset port file descriptor\n");
        fprintf(stderr, "\t-Q \t\tsuppress informational messages\n");
        fprintf(stderr, "\t-S buffers\tset amount of sort memory available\n");
@@ -1017,7 +1018,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
        optind = 1;                                     /* reset after postmaster usage */
 
        while ((flag = getopt(argc, argv,
-                                                 "A:B:CD:d:Eef:iK:Lm:MNo:P:pQS:st:v:x:FW:"))
+                                                 "A:B:CD:d:Eef:iK:Lm:MNOo:P:pQS:st:v:x:FW:"))
                   != EOF)
                switch (flag)
                {
@@ -1096,7 +1097,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
                                 *      turn off fsync
                                 * --------------------
                                 */
-                               fsyncOff = 1;
+                               disableFsync = true;
                                break;
 
                        case 'f':
@@ -1168,6 +1169,14 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
                                StrNCpy(OutputFileName, optarg, MAXPGPATH);
                                break;
 
+                       case 'O':
+                               /* --------------------
+                                *      allow system table structure modifications
+                                * --------------------
+                                */
+                               allowSystemTableMods = true;
+                               break;
+
                        case 'p':                       /* started by postmaster */
                                /* ----------------
                                 *      p - special flag passed if backend was forked
@@ -1522,7 +1531,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
        if (!IsUnderPostmaster)
        {
                puts("\nPOSTGRES backend interactive interface ");
-               puts("$Revision: 1.104 $ $Date: 1999/02/21 03:49:27 $\n");
+               puts("$Revision: 1.105 $ $Date: 1999/03/17 22:53:18 $\n");
        }
 
        /* ----------------
index a7cc5ba98604b874cc967eeedaf2d6ab38f1a994..ea63eccd490dc172b3c39132faca2d550f32aee3 100644 (file)
@@ -187,7 +187,7 @@ ProcessUtility(Node *parsetree,
                                foreach(arg, args)
                                {
                                        relname = strVal(lfirst(arg));
-                                       if (IsSystemRelationName(relname))
+                                       if (!allowSystemTableMods && IsSystemRelationName(relname))
                                                elog(ERROR, "class \"%s\" is a system catalog",
                                                         relname);
                                        rel = heap_openr(relname);
@@ -268,7 +268,7 @@ ProcessUtility(Node *parsetree,
                                CHECK_IF_ABORTED();
 
                                relname = stmt->relname;
-                               if (IsSystemRelationName(relname))
+                               if (!allowSystemTableMods && IsSystemRelationName(relname))
                                        elog(ERROR, "class \"%s\" is a system catalog",
                                                 relname);
 #ifndef NO_SECURITY
@@ -457,7 +457,7 @@ ProcessUtility(Node *parsetree,
                                {
                                        case INDEX:
                                                relname = stmt->name;
-                                               if (IsSystemRelationName(relname))
+                                               if (!allowSystemTableMods && IsSystemRelationName(relname))
                                                        elog(ERROR, "class \"%s\" is a system catalog index",
                                                                 relname);
 #ifndef NO_SECURITY
index 3a3e82c806615fef7993a07d8ff08f2e9c36ccc0..92e44d4c90bf86ac7bb398e695d781e3e9a0ec85 100644 (file)
@@ -82,7 +82,8 @@ char          DateFormat[20] = "%d-%m-%Y";            /* mjl: sizes! or better
                                                                                                 * malloc? XXX */
 char           FloatFormat[20] = "%f";
 
-int                    fsyncOff = 0;
+bool           disableFsync = false;
+bool           allowSystemTableMods = false;
 int                    SortMem = 512;
 
 char      *IndexedCatalogNames[] = {
index d72199bddafdf11d990d79cb9ab82fa8b1f1308b..640e6b9a425231481b1f2b51aa9d464975153a27 100644 (file)
@@ -398,7 +398,7 @@ fi
 
 echo
 
-PGSQL_OPT="-o /dev/null -F -Q -D$PGDATA"
+PGSQL_OPT="-o /dev/null -O -F -Q -D$PGDATA"
 
 # If the COPY is first, the VACUUM generates an error, so we vacuum first
 echo "Vacuuming template1"
@@ -408,7 +408,7 @@ echo "COPY pg_shadow TO '$PGDATA/pg_pwd' USING DELIMITERS '\\t'" | \
        postgres $PGSQL_OPT template1 > /dev/null
 
 echo "Creating public pg_user view"
-echo "CREATE TABLE xpg_user (          \
+echo "CREATE TABLE pg_user (           \
            usename     name,           \
            usesysid    int4,           \
            usecreatedb bool,           \
@@ -418,12 +418,6 @@ echo "CREATE TABLE xpg_user (              \
            passwd              text,           \
            valuntil    abstime);" | postgres $PGSQL_OPT template1 > /dev/null
 
-#move it into pg_user
-echo "UPDATE pg_class SET relname = 'pg_user' WHERE relname = 'xpg_user';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-echo "UPDATE pg_type SET typname = 'pg_user' WHERE typname = 'xpg_user';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-mv $PGDATA/base/template1/xpg_user $PGDATA/base/template1/pg_user
 
 echo "CREATE RULE \"_RETpg_user\" AS ON SELECT TO pg_user DO INSTEAD   \
            SELECT usename, usesysid, usecreatedb, usetrace,            \
@@ -434,16 +428,10 @@ echo "REVOKE ALL on pg_shadow FROM public" | \
        postgres $PGSQL_OPT template1 > /dev/null
 
 echo "Creating view pg_rules"
-echo "CREATE TABLE xpg_rules (         \
+echo "CREATE TABLE pg_rules (          \
            tablename   name,           \
            rulename    name,           \
            definition  text);" | postgres $PGSQL_OPT template1 > /dev/null
-#move it into pg_rules
-echo "UPDATE pg_class SET relname = 'pg_rules' WHERE relname = 'xpg_rules';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-echo "UPDATE pg_type SET typname = 'pg_rules' WHERE typname = 'xpg_rules';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-mv $PGDATA/base/template1/xpg_rules $PGDATA/base/template1/pg_rules
 
 echo "CREATE RULE \"_RETpg_rules\" AS ON SELECT TO pg_rules DO INSTEAD \
            SELECT C.relname AS tablename,                              \
@@ -455,16 +443,10 @@ echo "CREATE RULE \"_RETpg_rules\" AS ON SELECT TO pg_rules DO INSTEAD    \
        postgres $PGSQL_OPT template1 > /dev/null
 
 echo "Creating view pg_views"
-echo "CREATE TABLE xpg_views (         \
+echo "CREATE TABLE pg_views (          \
            viewname    name,           \
            viewowner   name,           \
            definition  text);" | postgres $PGSQL_OPT template1 > /dev/null
-#move it into pg_views
-echo "UPDATE pg_class SET relname = 'pg_views' WHERE relname = 'xpg_views';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-echo "UPDATE pg_type SET typname = 'pg_views' WHERE typname = 'xpg_views';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-mv $PGDATA/base/template1/xpg_views $PGDATA/base/template1/pg_views
 
 echo "CREATE RULE \"_RETpg_views\" AS ON SELECT TO pg_views DO INSTEAD \
            SELECT C.relname AS viewname,                               \
@@ -476,18 +458,12 @@ echo "CREATE RULE \"_RETpg_views\" AS ON SELECT TO pg_views DO INSTEAD    \
        postgres $PGSQL_OPT template1 > /dev/null
 
 echo "Creating view pg_tables"
-echo "CREATE TABLE xpg_tables (                \
+echo "CREATE TABLE pg_tables (         \
            tablename   name,           \
            tableowner  name,           \
            hasindexes  bool,           \
            hasrules    bool,           \
            hastriggers bool);" | postgres $PGSQL_OPT template1 > /dev/null
-#move it into pg_tables
-echo "UPDATE pg_class SET relname = 'pg_tables' WHERE relname = 'xpg_tables';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-echo "UPDATE pg_type SET typname = 'pg_tables' WHERE typname = 'xpg_tables';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-mv $PGDATA/base/template1/xpg_tables $PGDATA/base/template1/pg_tables
 
 echo "CREATE RULE \"_RETpg_tables\" AS ON SELECT TO pg_tables DO INSTEAD       \
            SELECT C.relname AS tablename,                              \
@@ -501,16 +477,10 @@ echo "CREATE RULE \"_RETpg_tables\" AS ON SELECT TO pg_tables DO INSTEAD  \
        postgres $PGSQL_OPT template1 > /dev/null
 
 echo "Creating view pg_indexes"
-echo "CREATE TABLE xpg_indexes (       \
+echo "CREATE TABLE pg_indexes (        \
            tablename   name,           \
            indexname   name,           \
            indexdef    text);" | postgres $PGSQL_OPT template1 > /dev/null
-#move it into pg_indexes
-echo "UPDATE pg_class SET relname = 'pg_indexes' WHERE relname = 'xpg_indexes';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-echo "UPDATE pg_type SET typname = 'pg_indexes' WHERE typname = 'xpg_indexes';" |\
-       postgres $PGSQL_OPT template1 > /dev/null
-mv $PGDATA/base/template1/xpg_indexes $PGDATA/base/template1/pg_indexes
 
 echo "CREATE RULE \"_RETpg_indexes\" AS ON SELECT TO pg_indexes DO INSTEAD     \
            SELECT C.relname AS tablename,                              \
@@ -528,4 +498,3 @@ echo "copy pg_description from '$GLOBAL_DESCR'" | \
        postgres $PGSQL_OPT template1 > /dev/null
 echo "vacuum analyze" | \
        postgres $PGSQL_OPT template1 > /dev/null
-
index 1486145df2b768c0d8d6002b1e9a3956d7c1c000..f1decbcb0ca5eb8d88129737fdb5ab2a68f9c1fd 100644 (file)
@@ -94,7 +94,8 @@ extern char CTZName[];
 extern char FloatFormat[];
 extern char DateFormat[];
 
-extern int     fsyncOff;
+extern bool    disableFsync;
+extern bool    allowSystemTableMods;
 extern int     SortMem;
 
 extern Oid     LastOidProcessed;       /* for query rewrite */
index c0d9dded7723011cddc787ff38d71852c33b699b..89b99533c73bf06bebcc72608e02dacb38e0356c 100644 (file)
@@ -22,6 +22,9 @@ data_directory]
 .BR "-F"
 ]
 [\c
+.BR "-O"
+]
+[\c
 .BR "-P"
 filedes]
 [\c
@@ -99,6 +102,9 @@ Disable automatic fsync() call after each transaction.
 This option improves performance, but an operating system crash
 while a transaction is in progress will probably cause data loss.
 .TP
+.BR "-O"
+Override restrictions, so system table structures can be modified(pg_*).
+.TP
 .BR "-P" " filedes"
 .IR "filedes"
 specifies the file descriptor that corresponds to the socket (port) on