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.3 2003/07/22 19:00:07 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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129

			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)
						aclcheck_error(aclresult,
									   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
	}
}