Put back allow_system_table_mods check in heap_create().
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 3 Jun 2013 14:22:31 +0000 (17:22 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 3 Jun 2013 14:22:31 +0000 (17:22 +0300)
This reverts commit a475c6036752c26dca538632b68fd2cc592976b7.

Erik Rijkers reported back in January 2013 that after the patch, if you do
"pg_dump -t myschema.mytable" to dump a single table, and restore that in
a database where myschema does not exist, the table is silently created in
pg_catalog instead. That is because pg_dump uses
"SET search_path=myschema, pg_catalog" to set schema the table is created
in. While allow_system_table_mods is not a very elegant solution to this,
we can't leave it as it is, so for now, revert it back to the way it was
previously.

src/backend/bootstrap/bootparse.y
src/backend/catalog/heap.c
src/backend/catalog/index.c
src/include/catalog/heap.h

index d40fd6827c0f7d1d9cb6a4f3f2a1f13308c00bcd..cee72c186b0ea175e2ed338486712ff663010c83 100644 (file)
@@ -222,7 +222,8 @@ Boot_CreateStmt:
                                                   RELKIND_RELATION,
                                                   RELPERSISTENCE_PERMANENT,
                                                   shared_relation,
-                                                  mapped_relation);
+                                                  mapped_relation,
+                                                  true);
                        elog(DEBUG4, "bootstrap relation created");
                    }
                    else
index 7622a9655eac76612ae05b48d1eb69e49f3d6454..45a84e44a1d3b75f17067ee722a17c47c65f96f1 100644 (file)
@@ -246,7 +246,8 @@ heap_create(const char *relname,
            char relkind,
            char relpersistence,
            bool shared_relation,
-           bool mapped_relation)
+           bool mapped_relation,
+           bool allow_system_table_mods)
 {
    bool        create_storage;
    Relation    rel;
@@ -254,6 +255,18 @@ heap_create(const char *relname,
    /* The caller must have provided an OID for the relation. */
    Assert(OidIsValid(relid));
 
+   /*
+    * sanity checks
+    */
+   if (!allow_system_table_mods &&
+       (IsSystemNamespace(relnamespace) || IsToastNamespace(relnamespace)) &&
+       IsNormalProcessingMode())
+       ereport(ERROR,
+               (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+                errmsg("permission denied to create \"%s.%s\"",
+                       get_namespace_name(relnamespace), relname),
+       errdetail("System catalog modifications are currently disallowed.")));
+
    /*
     * Decide if we need storage or not, and handle a couple other special
     * cases for particular relkinds.
@@ -1132,7 +1145,8 @@ heap_create_with_catalog(const char *relname,
                               relkind,
                               relpersistence,
                               shared_relation,
-                              mapped_relation);
+                              mapped_relation,
+                              allow_system_table_mods);
 
    Assert(relid == RelationGetRelid(new_rel_desc));
 
index 7966558218f4f24cd9bf8953b473f212a0454fc1..5f61ecbfdf3ab7ac3f69f038041800ca35f19654 100644 (file)
@@ -825,7 +825,8 @@ index_create(Relation heapRelation,
                                RELKIND_INDEX,
                                relpersistence,
                                shared_relation,
-                               mapped_relation);
+                               mapped_relation,
+                               allow_system_table_mods);
 
    Assert(indexRelationId == RelationGetRelid(indexRelation));
 
index 26266e17d58a736232e4ba04476de2254e55fc94..b43765b026a7c1b177cf562601aad816382e6334 100644 (file)
@@ -46,7 +46,8 @@ extern Relation heap_create(const char *relname,
            char relkind,
            char relpersistence,
            bool shared_relation,
-           bool mapped_relation);
+           bool mapped_relation,
+           bool allow_system_table_mods);
 
 extern Oid heap_create_with_catalog(const char *relname,
                         Oid relnamespace,