alter.c 3.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
/*-------------------------------------------------------------------------
 *
 * alter.c
 *	  Drivers for generic alter commands
 *
 * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
11
 *	  $Header: /cvsroot/pgsql/src/backend/commands/alter.c,v 1.4 2003/08/01 00:15:19 tgl Exp $
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 *
 *-------------------------------------------------------------------------
 */
#include "postgres.h"

#include "access/htup.h"
#include "catalog/catalog.h"
#include "catalog/namespace.h"
#include "catalog/pg_class.h"
#include "commands/alter.h"
#include "commands/conversioncmds.h"
#include "commands/dbcommands.h"
#include "commands/defrem.h"
#include "commands/proclang.h"
#include "commands/schemacmds.h"
#include "commands/tablecmds.h"
#include "commands/trigger.h"
#include "commands/user.h"
#include "miscadmin.h"
#include "parser/parse_clause.h"
32
#include "tcop/utility.h"
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
#include "utils/acl.h"
#include "utils/lsyscache.h"
#include "utils/syscache.h"


void
ExecRenameStmt(RenameStmt *stmt)
{
	switch (stmt->renameType)
	{
		case OBJECT_AGGREGATE:
			RenameAggregate(stmt->object, (TypeName *) lfirst(stmt->objarg), stmt->newname);
			break;

		case OBJECT_CONVERSION:
			RenameConversion(stmt->object, stmt->newname);
			break;

		case OBJECT_DATABASE:
			RenameDatabase(stmt->subname, stmt->newname);
			break;

		case OBJECT_FUNCTION:
			RenameFunction(stmt->object, stmt->objarg, stmt->newname);
			break;

		case OBJECT_GROUP:
			RenameGroup(stmt->subname, stmt->newname);
			break;

		case OBJECT_LANGUAGE:
			RenameLanguage(stmt->subname, stmt->newname);
			break;

		case OBJECT_OPCLASS:
			RenameOpClass(stmt->object, stmt->subname, stmt->newname);
			break;

		case OBJECT_SCHEMA:
			RenameSchema(stmt->subname, stmt->newname);
			break;

		case OBJECT_USER:
			RenameUser(stmt->subname, stmt->newname);
			break;

		case OBJECT_TABLE:
		case OBJECT_COLUMN:
		case OBJECT_TRIGGER:
		{
			Oid			relid;

85
			CheckRelationOwnership(stmt->relation, true);
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104

			relid = RangeVarGetRelid(stmt->relation, false);

			switch (stmt->renameType)
			{
				case OBJECT_TABLE:
				{
					/*
					 * RENAME TABLE requires that we (still) hold
					 * CREATE rights on the containing namespace, as
					 * well as ownership of the table.
					 */
					Oid			namespaceId = get_rel_namespace(relid);
					AclResult	aclresult;

					aclresult = pg_namespace_aclcheck(namespaceId,
													  GetUserId(),
													  ACL_CREATE);
					if (aclresult != ACLCHECK_OK)
105
						aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
									   get_namespace_name(namespaceId));

					renamerel(relid, stmt->newname);
					break;
				}
				case OBJECT_COLUMN:
					renameatt(relid,
							  stmt->subname,		/* old att name */
							  stmt->newname,		/* new att name */
							  interpretInhOption(stmt->relation->inhOpt),		/* recursive? */
							  false);		/* recursing already? */
					break;
				case OBJECT_TRIGGER:
					renametrig(relid,
							   stmt->subname,		/* old att name */
							   stmt->newname);		/* new att name */
					break;
				default:
					/*can't happen*/;
			}
			break;
		}

		default:
130 131
			elog(ERROR, "unrecognized rename stmt type: %d",
				 (int) stmt->renameType);
132 133
	}
}