summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-06-03 17:22:31 +0300
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2013-06-03 17:22:31 +0300
commit15386281a62071f322155b74cb32c2fea92e8350 (patch)
tree4899cf699d4593ecb27672bae9ec3c6df8c45101 /src
parentf129615fe72f70868a86862b663dd7d78dd5cb71 (diff)
Put back allow_system_table_mods check in heap_create().
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.
Diffstat (limited to 'src')
-rw-r--r--src/backend/bootstrap/bootparse.y3
-rw-r--r--src/backend/catalog/heap.c18
-rw-r--r--src/backend/catalog/index.c3
-rw-r--r--src/include/catalog/heap.h3
4 files changed, 22 insertions, 5 deletions
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index d40fd6827c0..cee72c186b0 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -222,7 +222,8 @@ Boot_CreateStmt:
RELKIND_RELATION,
RELPERSISTENCE_PERMANENT,
shared_relation,
- mapped_relation);
+ mapped_relation,
+ true);
elog(DEBUG4, "bootstrap relation created");
}
else
diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c
index 7622a9655ea..45a84e44a1d 100644
--- a/src/backend/catalog/heap.c
+++ b/src/backend/catalog/heap.c
@@ -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;
@@ -255,6 +256,18 @@ heap_create(const char *relname,
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));
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index 7966558218f..5f61ecbfdf3 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -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));
diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h
index 26266e17d58..b43765b026a 100644
--- a/src/include/catalog/heap.h
+++ b/src/include/catalog/heap.h
@@ -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,