diff options
Diffstat (limited to 'src/backend/commands/schemacmds.c')
-rw-r--r-- | src/backend/commands/schemacmds.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/backend/commands/schemacmds.c b/src/backend/commands/schemacmds.c new file mode 100644 index 00000000000..191d5e329b8 --- /dev/null +++ b/src/backend/commands/schemacmds.c @@ -0,0 +1,116 @@ +/*------------------------------------------------------------------------- + * + * schemacmds.c + * schema creation command support code + * + * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group + * Portions Copyright (c) 1994, Regents of the University of California + * + * + * IDENTIFICATION + * $Header: /cvsroot/pgsql/src/backend/commands/schemacmds.c,v 1.1 2002/04/15 05:22:03 tgl Exp $ + * + *------------------------------------------------------------------------- + */ +#include "postgres.h" + +#include "catalog/catalog.h" +#include "catalog/pg_namespace.h" +#include "commands/schemacmds.h" +#include "miscadmin.h" +#include "parser/analyze.h" +#include "tcop/utility.h" +#include "utils/lsyscache.h" + + +/* + * CREATE SCHEMA + */ +void +CreateSchemaCommand(CreateSchemaStmt *stmt) +{ + const char *schemaName = stmt->schemaname; + const char *authId = stmt->authid; + List *parsetree_list; + List *parsetree_item; + const char *owner_name; + Oid owner_userid; + Oid saved_userid; + + saved_userid = GetUserId(); + + if (!authId) + { + owner_userid = saved_userid; + owner_name = GetUserName(owner_userid); + } + else if (superuser()) + { + owner_name = authId; + /* The following will error out if user does not exist */ + owner_userid = get_usesysid(owner_name); + /* + * Set the current user to the requested authorization so + * that objects created in the statement have the requested + * owner. (This will revert to session user on error or at + * the end of this routine.) + */ + SetUserId(owner_userid); + } + else /* not superuser */ + { + owner_userid = saved_userid; + owner_name = GetUserName(owner_userid); + if (strcmp(authId, owner_name) != 0) + elog(ERROR, "CREATE SCHEMA: permission denied" + "\n\t\"%s\" is not a superuser, so cannot create a schema for \"%s\"", + owner_name, authId); + } + + if (!allowSystemTableMods && IsReservedName(schemaName)) + elog(ERROR, "CREATE SCHEMA: Illegal schema name: \"%s\" -- pg_ is reserved for system schemas", + schemaName); + + /* Create the schema's namespace */ + NamespaceCreate(schemaName, owner_userid); + + /* Let commands in the schema-element-list know about the schema */ + CommandCounterIncrement(); + + /* + * Examine the list of commands embedded in the CREATE SCHEMA command, + * and reorganize them into a sequentially executable order with no + * forward references. Note that the result is still a list of raw + * parsetrees in need of parse analysis --- we cannot, in general, + * run analyze.c on one statement until we have actually executed the + * prior ones. + */ + parsetree_list = analyzeCreateSchemaStmt(stmt); + + /* + * Analyze and execute each command contained in the CREATE SCHEMA + */ + foreach(parsetree_item, parsetree_list) + { + Node *parsetree = (Node *) lfirst(parsetree_item); + List *querytree_list, + *querytree_item; + + querytree_list = parse_analyze(parsetree, NULL); + + foreach(querytree_item, querytree_list) + { + Query *querytree = (Query *) lfirst(querytree_item); + + /* schemas should contain only utility stmts */ + Assert(querytree->commandType == CMD_UTILITY); + /* do this step */ + ProcessUtility(querytree->utilityStmt, None, NULL); + /* make sure later steps can see the object created here */ + CommandCounterIncrement(); + } + } + + /* Reset current user */ + SetUserId(saved_userid); +} |