]> granicus.if.org Git - postgresql/commitdiff
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,