pgsql-v9.2-ddl-refactoring-part-4.v1.alter-rename-to.patch
application/octet-stream
Filename: pgsql-v9.2-ddl-refactoring-part-4.v1.alter-rename-to.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v9
| File | + | − |
|---|---|---|
| src/backend/catalog/objectaddress.c | 14 | 0 |
| src/backend/commands/aggregatecmds.c | 0 | 61 |
| src/backend/commands/alter.c | 220 | 95 |
| src/backend/commands/collationcmds.c | 0 | 66 |
| src/backend/commands/conversioncmds.c | 0 | 51 |
| src/backend/commands/functioncmds.c | 0 | 68 |
| src/backend/commands/opclasscmds.c | 0 | 148 |
| src/backend/commands/proclang.c | 0 | 41 |
| src/backend/commands/schemacmds.c | 0 | 51 |
| src/backend/commands/tablespace.c | 0 | 69 |
| src/backend/commands/tsearchcmds.c | 0 | 188 |
| src/backend/parser/gram.y | 7 | 5 |
| src/include/catalog/objectaddress.h | 1 | 1 |
| src/include/commands/collationcmds.h | 0 | 1 |
| src/include/commands/conversioncmds.h | 0 | 1 |
| src/include/commands/defrem.h | 0 | 8 |
| src/test/regress/expected/alter_rename.out | 7 | 7 |
src/backend/catalog/objectaddress.c | 14 ++
src/backend/commands/aggregatecmds.c | 61 ------
src/backend/commands/alter.c | 315 +++++++++++++++++++---------
src/backend/commands/collationcmds.c | 66 ------
src/backend/commands/conversioncmds.c | 51 -----
src/backend/commands/functioncmds.c | 68 ------
src/backend/commands/opclasscmds.c | 148 -------------
src/backend/commands/proclang.c | 41 ----
src/backend/commands/schemacmds.c | 51 -----
src/backend/commands/tablespace.c | 69 ------
src/backend/commands/tsearchcmds.c | 188 -----------------
src/backend/parser/gram.y | 12 +-
src/include/catalog/objectaddress.h | 2 +-
src/include/commands/collationcmds.h | 1 -
src/include/commands/conversioncmds.h | 1 -
src/include/commands/defrem.h | 8 -
src/test/regress/expected/alter_rename.out | 14 +-
17 files changed, 249 insertions(+), 861 deletions(-)
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 9162c26..e295fa3 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -1485,6 +1485,20 @@ get_object_tuple(ObjectAddress address)
}
/*
+ * get_object_name_attnum
+ *
+ * It returns attribute number of name of the given object type,
+ * or InvalidAttrNumber if it does not have name column.
+ */
+AttrNumber
+get_object_name_attnum(const ObjectAddress *address)
+{
+ ObjectPropertyType *property
+ = get_object_property_data(address->classId);
+ return property->attnum_name;
+}
+
+/*
* get_object_namespace_attnum
*
* It returns attribute number of namespace of the given object type,
diff --git a/src/backend/commands/aggregatecmds.c b/src/backend/commands/aggregatecmds.c
index 085a205..c50761f 100644
--- a/src/backend/commands/aggregatecmds.c
+++ b/src/backend/commands/aggregatecmds.c
@@ -206,67 +206,6 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters)
initval); /* initial condition */
}
-
-/*
- * RenameAggregate
- * Rename an aggregate.
- */
-void
-RenameAggregate(List *name, List *args, const char *newname)
-{
- Oid procOid;
- Oid namespaceOid;
- HeapTuple tup;
- Form_pg_proc procForm;
- Relation rel;
- AclResult aclresult;
-
- rel = heap_open(ProcedureRelationId, RowExclusiveLock);
-
- /* Look up function and make sure it's an aggregate */
- procOid = LookupAggNameTypeNames(name, args, false);
-
- tup = SearchSysCacheCopy1(PROCOID, ObjectIdGetDatum(procOid));
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for function %u", procOid);
- procForm = (Form_pg_proc) GETSTRUCT(tup);
-
- namespaceOid = procForm->pronamespace;
-
- /* make sure the new name doesn't exist */
- if (SearchSysCacheExists3(PROCNAMEARGSNSP,
- CStringGetDatum(newname),
- PointerGetDatum(&procForm->proargtypes),
- ObjectIdGetDatum(namespaceOid)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_FUNCTION),
- errmsg("function %s already exists in schema \"%s\"",
- funcname_signature_string(newname,
- procForm->pronargs,
- NIL,
- procForm->proargtypes.values),
- get_namespace_name(namespaceOid))));
-
- /* must be owner */
- if (!pg_proc_ownercheck(procOid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
- NameListToString(name));
-
- /* must have CREATE privilege on namespace */
- aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceOid));
-
- /* rename */
- namestrcpy(&(((Form_pg_proc) GETSTRUCT(tup))->proname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
/*
* Change aggregate owner
*/
diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c
index 2d60a99..9218edf 100644
--- a/src/backend/commands/alter.c
+++ b/src/backend/commands/alter.c
@@ -14,6 +14,7 @@
*/
#include "postgres.h"
+#include "catalog/catalog.h"
#include "catalog/dependency.h"
#include "catalog/indexing.h"
#include "catalog/namespace.h"
@@ -39,58 +40,216 @@
#include "utils/rel.h"
#include "utils/syscache.h"
+static void
+error_already_exist(ObjectType objtype,
+ const char *new_name, const char *nsp_name)
+{
+ const char *msg;
+ int code = ERRCODE_DUPLICATE_OBJECT;
+
+ switch (objtype)
+ {
+ case OBJECT_FUNCTION:
+ case OBJECT_AGGREGATE:
+ code = ERRCODE_DUPLICATE_FUNCTION;
+ msg = gettext_noop("function %s already exists in schema \"%s\"");
+ break;
+ case OBJECT_COLLATION:
+ msg = gettext_noop("collation \"%s\" already exists in schema \"%s\"");
+ break;
+ case OBJECT_CONVERSION:
+ msg = gettext_noop("conversion \"%s\" already exists in schema \"%s\"");
+ break;
+ case OBJECT_LANGUAGE:
+ msg = gettext_noop("language \"%s\" already exists");
+ break;
+ case OBJECT_OPCLASS:
+ msg = gettext_noop("operator class \"%s\" already exists in schema \"%s\"");
+ break;
+ case OBJECT_OPFAMILY:
+ msg = gettext_noop("operator family \"%s\" already exists in schema \"%s\"");
+ break;
+ case OBJECT_TSPARSER:
+ msg = gettext_noop("text search parser \"%s\" already exists in shcema \"%s\"");
+ break;
+ case OBJECT_TSDICTIONARY:
+ msg = gettext_noop("text search dictionary \"%s\" already exists in shema \"%s\"");
+ break;
+ case OBJECT_TSTEMPLATE:
+ msg = gettext_noop("text search template \"%s\" already exists in schema \"%s\"");
+ break;
+ case OBJECT_TSCONFIGURATION:
+ msg = gettext_noop("text search configuration \"%s\" already exists in schema \"%s\"");
+ break;
+ case OBJECT_SCHEMA:
+ msg = gettext_noop("schema \"%s\" already exists");
+ break;
+ case OBJECT_TABLESPACE:
+ msg = gettext_noop("tablespace \"%s\" already exists");
+ break;
+ default:
+ elog(ERROR, "unexpected object type (%d)", (int)objtype);
+ return;
+ }
+ if (nsp_name)
+ ereport(ERROR, (errcode(code), errmsg(msg, new_name, nsp_name)));
+ else
+ ereport(ERROR, (errcode(code), errmsg(msg, new_name)));
+}
/*
- * Executes an ALTER OBJECT / RENAME TO statement. Based on the object
- * type, the function appropriate to that type is executed.
+ * AltereObjectRenameInternal
+ *
+ * Generic function to change the name of a given object, for simple cases
+ * (won't work for tables, nor other cases where we need to do more than change
+ * the name column of a single catalog entry).
*/
-void
-ExecRenameStmt(RenameStmt *stmt)
+static void
+AltereObjectRenameInternal(ObjectType objtype, ObjectAddress address,
+ const char *new_name, Relation relation)
{
- switch (stmt->renameType)
+ Relation catalog;
+ AttrNumber Anum_name;
+ Oid namespaceId = InvalidOid;
+ HeapTuple oldtup;
+ HeapTuple newtup;
+ NameData namebuf;
+ AclResult aclresult;
+ Datum *values;
+ bool *nulls;
+ bool *replaces;
+
+ catalog = heap_open(address.classId, RowExclusiveLock);
+
+ Anum_name = get_object_name_attnum(&address);
+ namespaceId = get_object_namespace(&address);
+
+ /* must have ownership of the obejct being renamed */
+ check_object_ownership(GetUserId(), address, relation);
+
+ switch (objtype)
{
- case OBJECT_AGGREGATE:
- RenameAggregate(stmt->object, stmt->objarg, stmt->newname);
+ case OBJECT_LANGUAGE:
+ /* nothing to check more than ownership */
break;
- case OBJECT_COLLATION:
- RenameCollation(stmt->object, stmt->newname);
- break;
+ case OBJECT_SCHEMA:
+ /* must have CREATE privilege on database */
+ aclresult = pg_database_aclcheck(MyDatabaseId,
+ GetUserId(), ACL_CREATE);
+ if (aclresult != ACLCHECK_OK)
+ aclcheck_error(aclresult, ACL_KIND_DATABASE,
+ get_database_name(MyDatabaseId));
- case OBJECT_CONVERSION:
- RenameConversion(stmt->object, stmt->newname);
+ if (!allowSystemTableMods && IsReservedName(new_name))
+ ereport(ERROR,
+ (errcode(ERRCODE_RESERVED_NAME),
+ errmsg("unacceptable schema name \"%s\"", new_name),
+ errdetail("The prefix \"pg_\" is reserved for system schemas.")));
break;
- case OBJECT_DATABASE:
- RenameDatabase(stmt->subname, stmt->newname);
+ case OBJECT_TABLESPACE:
+ if (!allowSystemTableMods && IsReservedName(new_name))
+ ereport(ERROR,
+ (errcode(ERRCODE_RESERVED_NAME),
+ errmsg("unacceptable tablespace name \"%s\"", new_name),
+ errdetail("The prefix \"pg_\" is reserved for system tablespaces.")));
break;
- case OBJECT_FUNCTION:
- RenameFunction(stmt->object, stmt->objarg, stmt->newname);
+ default:
+ /* must have CREATE privilege on namespace */
+ namespaceId = get_object_namespace(&address);
+ Assert(OidIsValid(namespaceId));
+ aclresult = pg_namespace_aclcheck(namespaceId,
+ GetUserId(), ACL_CREATE);
+ if (aclresult != ACLCHECK_OK)
+ aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
+ get_namespace_name(namespaceId));
break;
+ }
- case OBJECT_LANGUAGE:
- RenameLanguage(stmt->subname, stmt->newname);
- break;
+ /*
+ * Check for duplicate names
+ */
+ if (object_exists_namespace(address, InvalidOid, new_name))
+ error_already_exist(objtype, new_name,
+ !OidIsValid(namespaceId) ? NULL
+ : get_namespace_name(namespaceId));
+
+ /*
+ * Build modified tuple
+ */
+ oldtup = get_object_tuple(address);
- case OBJECT_OPCLASS:
- RenameOpClass(stmt->object, stmt->subname, stmt->newname);
- break;
+ values = palloc0(RelationGetNumberOfAttributes(catalog) * sizeof(Datum));
+ nulls = palloc0(RelationGetNumberOfAttributes(catalog) * sizeof(bool));
+ replaces = palloc0(RelationGetNumberOfAttributes(catalog) * sizeof(bool));
+
+ namestrcpy(&namebuf, new_name);
+ values[Anum_name - 1] = NameGetDatum(&namebuf);
+ replaces[Anum_name - 1] = true;
+ newtup = heap_modify_tuple(oldtup, RelationGetDescr(catalog),
+ values, nulls, replaces);
+
+ /* Perform actual update */
+ simple_heap_update(catalog, &oldtup->t_self, newtup);
+ CatalogUpdateIndexes(catalog, newtup);
+
+ /* Release memory */
+ pfree(values);
+ pfree(nulls);
+ pfree(replaces);
+
+ heap_close(catalog, NoLock);
+}
+
+/*
+ * Executes an ALTER OBJECT / RENAME TO statement. Based on the object
+ * type, the function appropriate to that type is executed.
+ */
+void
+ExecRenameStmt(RenameStmt *stmt)
+{
+ ObjectAddress address;
+ Relation relation;
+ Oid relid;
+ switch (stmt->renameType)
+ {
+ case OBJECT_AGGREGATE:
+ case OBJECT_COLLATION:
+ case OBJECT_CONVERSION:
+ case OBJECT_FUNCTION:
+ case OBJECT_LANGUAGE:
+ case OBJECT_OPCLASS:
case OBJECT_OPFAMILY:
- RenameOpFamily(stmt->object, stmt->subname, stmt->newname);
+ case OBJECT_TSPARSER:
+ case OBJECT_TSDICTIONARY:
+ case OBJECT_TSTEMPLATE:
+ case OBJECT_TSCONFIGURATION:
+ case OBJECT_SCHEMA:
+ case OBJECT_TABLESPACE:
+ address = get_object_address(stmt->renameType,
+ stmt->object,
+ stmt->objarg,
+ &relation,
+ AccessExclusiveLock,
+ false);
+ AltereObjectRenameInternal(stmt->renameType, address,
+ stmt->newname, relation);
+ if (relation)
+ heap_close(relation, NoLock);
break;
+ case OBJECT_DATABASE:
+ RenameDatabase(stmt->subname, stmt->newname);
+ break;
case OBJECT_ROLE:
RenameRole(stmt->subname, stmt->newname);
break;
- case OBJECT_SCHEMA:
- RenameSchema(stmt->subname, stmt->newname);
- break;
-
- case OBJECT_TABLESPACE:
- RenameTableSpace(stmt->subname, stmt->newname);
+ case OBJECT_TYPE:
+ RenameType(stmt->object, stmt->newname);
break;
case OBJECT_TABLE:
@@ -101,77 +260,43 @@ ExecRenameStmt(RenameStmt *stmt)
case OBJECT_ATTRIBUTE:
case OBJECT_TRIGGER:
case OBJECT_FOREIGN_TABLE:
+ CheckRelationOwnership(stmt->relation, true);
+ /*
+ * Lock level used here should match what will be taken later,
+ * in RenameRelation, renameatt, or renametrig.
+ */
+ relid = RangeVarGetRelid(stmt->relation, AccessExclusiveLock,
+ false, false);
+ if (stmt->renameType == OBJECT_COLUMN ||
+ stmt->renameType == OBJECT_ATTRIBUTE)
+ {
+ renameatt(relid, stmt);
+ }
+ else if (stmt->renameType == OBJECT_TRIGGER)
+ {
+ renametrig(relid,
+ stmt->subname, /* old att name */
+ stmt->newname); /* new att name */
+ }
+ else
{
- Oid relid;
-
- CheckRelationOwnership(stmt->relation, true);
-
/*
- * Lock level used here should match what will be taken later,
- * in RenameRelation, renameatt, or renametrig.
+ * RENAME TABLE requires that we (still) hold
+ * CREATE rights on the containing namespace, as
+ * well as ownership of the table.
*/
- relid = RangeVarGetRelid(stmt->relation, AccessExclusiveLock,
- false, false);
-
- switch (stmt->renameType)
- {
- case OBJECT_TABLE:
- case OBJECT_SEQUENCE:
- case OBJECT_VIEW:
- case OBJECT_INDEX:
- case OBJECT_FOREIGN_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, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceId));
-
- RenameRelation(relid, stmt->newname, stmt->renameType);
- break;
- }
- case OBJECT_COLUMN:
- case OBJECT_ATTRIBUTE:
- renameatt(relid, stmt);
- break;
- case OBJECT_TRIGGER:
- renametrig(relid,
- stmt->subname, /* old att name */
- stmt->newname); /* new att name */
- break;
- default:
- /* can't happen */ ;
- }
- break;
- }
-
- case OBJECT_TSPARSER:
- RenameTSParser(stmt->object, stmt->newname);
- break;
+ Oid namespaceId = get_rel_namespace(relid);
+ AclResult aclresult;
- case OBJECT_TSDICTIONARY:
- RenameTSDictionary(stmt->object, stmt->newname);
- break;
+ aclresult = pg_namespace_aclcheck(namespaceId,
+ GetUserId(),
+ ACL_CREATE);
+ if (aclresult != ACLCHECK_OK)
+ aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
+ get_namespace_name(namespaceId));
- case OBJECT_TSTEMPLATE:
- RenameTSTemplate(stmt->object, stmt->newname);
- break;
-
- case OBJECT_TSCONFIGURATION:
- RenameTSConfiguration(stmt->object, stmt->newname);
- break;
-
- case OBJECT_TYPE:
- RenameType(stmt->object, stmt->newname);
+ RenameRelation(relid, stmt->newname, stmt->renameType);
+ }
break;
default:
diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c
index 09020d1..f219d6e 100644
--- a/src/backend/commands/collationcmds.c
+++ b/src/backend/commands/collationcmds.c
@@ -145,72 +145,6 @@ DefineCollation(List *names, List *parameters)
}
/*
- * Rename collation
- */
-void
-RenameCollation(List *name, const char *newname)
-{
- Oid collationOid;
- Oid namespaceOid;
- HeapTuple tup;
- Relation rel;
- AclResult aclresult;
-
- rel = heap_open(CollationRelationId, RowExclusiveLock);
-
- collationOid = get_collation_oid(name, false);
-
- tup = SearchSysCacheCopy1(COLLOID, ObjectIdGetDatum(collationOid));
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for collation %u", collationOid);
-
- namespaceOid = ((Form_pg_collation) GETSTRUCT(tup))->collnamespace;
-
- /* make sure the new name doesn't exist */
- if (SearchSysCacheExists3(COLLNAMEENCNSP,
- CStringGetDatum(newname),
- Int32GetDatum(GetDatabaseEncoding()),
- ObjectIdGetDatum(namespaceOid)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("collation \"%s\" for encoding \"%s\" already exists in schema \"%s\"",
- newname,
- GetDatabaseEncodingName(),
- get_namespace_name(namespaceOid))));
-
- /* mustn't match an any-encoding entry, either */
- if (SearchSysCacheExists3(COLLNAMEENCNSP,
- CStringGetDatum(newname),
- Int32GetDatum(-1),
- ObjectIdGetDatum(namespaceOid)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("collation \"%s\" already exists in schema \"%s\"",
- newname,
- get_namespace_name(namespaceOid))));
-
- /* must be owner */
- if (!pg_collation_ownercheck(collationOid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_COLLATION,
- NameListToString(name));
-
- /* must have CREATE privilege on namespace */
- aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceOid));
-
- /* rename */
- namestrcpy(&(((Form_pg_collation) GETSTRUCT(tup))->collname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_freetuple(tup);
-
- heap_close(rel, RowExclusiveLock);
-}
-
-/*
* Change collation owner, by name
*/
void
diff --git a/src/backend/commands/conversioncmds.c b/src/backend/commands/conversioncmds.c
index 950f870..5b61cf0 100644
--- a/src/backend/commands/conversioncmds.c
+++ b/src/backend/commands/conversioncmds.c
@@ -118,57 +118,6 @@ CreateConversionCommand(CreateConversionStmt *stmt)
}
/*
- * Rename conversion
- */
-void
-RenameConversion(List *name, const char *newname)
-{
- Oid conversionOid;
- Oid namespaceOid;
- HeapTuple tup;
- Relation rel;
- AclResult aclresult;
-
- rel = heap_open(ConversionRelationId, RowExclusiveLock);
-
- conversionOid = get_conversion_oid(name, false);
-
- tup = SearchSysCacheCopy1(CONVOID, ObjectIdGetDatum(conversionOid));
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for conversion %u", conversionOid);
-
- namespaceOid = ((Form_pg_conversion) GETSTRUCT(tup))->connamespace;
-
- /* make sure the new name doesn't exist */
- if (SearchSysCacheExists2(CONNAMENSP,
- CStringGetDatum(newname),
- ObjectIdGetDatum(namespaceOid)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("conversion \"%s\" already exists in schema \"%s\"",
- newname, get_namespace_name(namespaceOid))));
-
- /* must be owner */
- if (!pg_conversion_ownercheck(conversionOid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_CONVERSION,
- NameListToString(name));
-
- /* must have CREATE privilege on namespace */
- aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceOid));
-
- /* rename */
- namestrcpy(&(((Form_pg_conversion) GETSTRUCT(tup))->conname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
-/*
* Change conversion owner, by name
*/
void
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index 5102d87..1821c61 100644
--- a/src/backend/commands/functioncmds.c
+++ b/src/backend/commands/functioncmds.c
@@ -1013,74 +1013,6 @@ RemoveFunctionById(Oid funcOid)
}
}
-
-/*
- * Rename function
- */
-void
-RenameFunction(List *name, List *argtypes, const char *newname)
-{
- Oid procOid;
- Oid namespaceOid;
- HeapTuple tup;
- Form_pg_proc procForm;
- Relation rel;
- AclResult aclresult;
-
- rel = heap_open(ProcedureRelationId, RowExclusiveLock);
-
- procOid = LookupFuncNameTypeNames(name, argtypes, false);
-
- tup = SearchSysCacheCopy1(PROCOID, ObjectIdGetDatum(procOid));
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for function %u", procOid);
- procForm = (Form_pg_proc) GETSTRUCT(tup);
-
- if (procForm->proisagg)
- ereport(ERROR,
- (errcode(ERRCODE_WRONG_OBJECT_TYPE),
- errmsg("\"%s\" is an aggregate function",
- NameListToString(name)),
- errhint("Use ALTER AGGREGATE to rename aggregate functions.")));
-
- namespaceOid = procForm->pronamespace;
-
- /* make sure the new name doesn't exist */
- if (SearchSysCacheExists3(PROCNAMEARGSNSP,
- CStringGetDatum(newname),
- PointerGetDatum(&procForm->proargtypes),
- ObjectIdGetDatum(namespaceOid)))
- {
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_FUNCTION),
- errmsg("function %s already exists in schema \"%s\"",
- funcname_signature_string(newname,
- procForm->pronargs,
- NIL,
- procForm->proargtypes.values),
- get_namespace_name(namespaceOid))));
- }
-
- /* must be owner */
- if (!pg_proc_ownercheck(procOid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_PROC,
- NameListToString(name));
-
- /* must have CREATE privilege on namespace */
- aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceOid));
-
- /* rename */
- namestrcpy(&(procForm->proname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
/*
* Change function owner by name and args
*/
diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c
index 7598561..1e16d32 100644
--- a/src/backend/commands/opclasscmds.c
+++ b/src/backend/commands/opclasscmds.c
@@ -1642,154 +1642,6 @@ RemoveAmProcEntryById(Oid entryOid)
heap_close(rel, RowExclusiveLock);
}
-
-/*
- * Rename opclass
- */
-void
-RenameOpClass(List *name, const char *access_method, const char *newname)
-{
- Oid opcOid;
- Oid amOid;
- Oid namespaceOid;
- HeapTuple origtup;
- HeapTuple tup;
- Relation rel;
- AclResult aclresult;
-
- amOid = get_am_oid(access_method, false);
-
- rel = heap_open(OperatorClassRelationId, RowExclusiveLock);
-
- /* Look up the opclass. */
- origtup = OpClassCacheLookup(amOid, name, false);
- tup = heap_copytuple(origtup);
- ReleaseSysCache(origtup);
- opcOid = HeapTupleGetOid(tup);
- namespaceOid = ((Form_pg_opclass) GETSTRUCT(tup))->opcnamespace;
-
- /* make sure the new name doesn't exist */
- if (SearchSysCacheExists3(CLAAMNAMENSP,
- ObjectIdGetDatum(amOid),
- CStringGetDatum(newname),
- ObjectIdGetDatum(namespaceOid)))
- {
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("operator class \"%s\" for access method \"%s\" already exists in schema \"%s\"",
- newname, access_method,
- get_namespace_name(namespaceOid))));
- }
-
- /* must be owner */
- if (!pg_opclass_ownercheck(opcOid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_OPCLASS,
- NameListToString(name));
-
- /* must have CREATE privilege on namespace */
- aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceOid));
-
- /* rename */
- namestrcpy(&(((Form_pg_opclass) GETSTRUCT(tup))->opcname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
-/*
- * Rename opfamily
- */
-void
-RenameOpFamily(List *name, const char *access_method, const char *newname)
-{
- Oid opfOid;
- Oid amOid;
- Oid namespaceOid;
- char *schemaname;
- char *opfname;
- HeapTuple tup;
- Relation rel;
- AclResult aclresult;
-
- amOid = get_am_oid(access_method, false);
-
- rel = heap_open(OperatorFamilyRelationId, RowExclusiveLock);
-
- /*
- * Look up the opfamily
- */
- DeconstructQualifiedName(name, &schemaname, &opfname);
-
- if (schemaname)
- {
- namespaceOid = LookupExplicitNamespace(schemaname);
-
- tup = SearchSysCacheCopy3(OPFAMILYAMNAMENSP,
- ObjectIdGetDatum(amOid),
- PointerGetDatum(opfname),
- ObjectIdGetDatum(namespaceOid));
- if (!HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator family \"%s\" does not exist for access method \"%s\"",
- opfname, access_method)));
-
- opfOid = HeapTupleGetOid(tup);
- }
- else
- {
- opfOid = OpfamilynameGetOpfid(amOid, opfname);
- if (!OidIsValid(opfOid))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("operator family \"%s\" does not exist for access method \"%s\"",
- opfname, access_method)));
-
- tup = SearchSysCacheCopy1(OPFAMILYOID, ObjectIdGetDatum(opfOid));
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for opfamily %u", opfOid);
-
- namespaceOid = ((Form_pg_opfamily) GETSTRUCT(tup))->opfnamespace;
- }
-
- /* make sure the new name doesn't exist */
- if (SearchSysCacheExists3(OPFAMILYAMNAMENSP,
- ObjectIdGetDatum(amOid),
- CStringGetDatum(newname),
- ObjectIdGetDatum(namespaceOid)))
- {
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"",
- newname, access_method,
- get_namespace_name(namespaceOid))));
- }
-
- /* must be owner */
- if (!pg_opfamily_ownercheck(opfOid, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_OPFAMILY,
- NameListToString(name));
-
- /* must have CREATE privilege on namespace */
- aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceOid));
-
- /* rename */
- namestrcpy(&(((Form_pg_opfamily) GETSTRUCT(tup))->opfname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
/*
* Change opclass owner by name
*/
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index b7ed1a4..370b2a7 100644
--- a/src/backend/commands/proclang.c
+++ b/src/backend/commands/proclang.c
@@ -536,47 +536,6 @@ DropProceduralLanguageById(Oid langOid)
}
/*
- * Rename language
- */
-void
-RenameLanguage(const char *oldname, const char *newname)
-{
- HeapTuple tup;
- Relation rel;
-
- /* Translate both names for consistency with CREATE */
- oldname = case_translate_language_name(oldname);
- newname = case_translate_language_name(newname);
-
- rel = heap_open(LanguageRelationId, RowExclusiveLock);
-
- tup = SearchSysCacheCopy1(LANGNAME, CStringGetDatum(oldname));
- if (!HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("language \"%s\" does not exist", oldname)));
-
- /* make sure the new name doesn't exist */
- if (SearchSysCacheExists1(LANGNAME, CStringGetDatum(newname)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("language \"%s\" already exists", newname)));
-
- /* must be owner of PL */
- if (!pg_language_ownercheck(HeapTupleGetOid(tup), GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_LANGUAGE,
- oldname);
-
- /* rename */
- namestrcpy(&(((Form_pg_language) GETSTRUCT(tup))->lanname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
-/*
* Change language owner
*/
void
diff --git a/src/backend/commands/schemacmds.c b/src/backend/commands/schemacmds.c
index 8daa9d0..a22fbcd 100644
--- a/src/backend/commands/schemacmds.c
+++ b/src/backend/commands/schemacmds.c
@@ -169,57 +169,6 @@ RemoveSchemaById(Oid schemaOid)
heap_close(relation, RowExclusiveLock);
}
-
-/*
- * Rename schema
- */
-void
-RenameSchema(const char *oldname, const char *newname)
-{
- HeapTuple tup;
- Relation rel;
- AclResult aclresult;
-
- rel = heap_open(NamespaceRelationId, RowExclusiveLock);
-
- tup = SearchSysCacheCopy1(NAMESPACENAME, CStringGetDatum(oldname));
- if (!HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_SCHEMA),
- errmsg("schema \"%s\" does not exist", oldname)));
-
- /* make sure the new name doesn't exist */
- if (OidIsValid(get_namespace_oid(newname, true)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_SCHEMA),
- errmsg("schema \"%s\" already exists", newname)));
-
- /* must be owner */
- if (!pg_namespace_ownercheck(HeapTupleGetOid(tup), GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_NAMESPACE,
- oldname);
-
- /* must have CREATE privilege on database */
- aclresult = pg_database_aclcheck(MyDatabaseId, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_DATABASE,
- get_database_name(MyDatabaseId));
-
- if (!allowSystemTableMods && IsReservedName(newname))
- ereport(ERROR,
- (errcode(ERRCODE_RESERVED_NAME),
- errmsg("unacceptable schema name \"%s\"", newname),
- errdetail("The prefix \"pg_\" is reserved for system schemas.")));
-
- /* rename */
- namestrcpy(&(((Form_pg_namespace) GETSTRUCT(tup))->nspname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
void
AlterSchemaOwner_oid(Oid oid, Oid newOwnerId)
{
diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c
index d223f8c..37a6b5e 100644
--- a/src/backend/commands/tablespace.c
+++ b/src/backend/commands/tablespace.c
@@ -781,75 +781,6 @@ directory_is_empty(const char *path)
return true;
}
-
-/*
- * Rename a tablespace
- */
-void
-RenameTableSpace(const char *oldname, const char *newname)
-{
- Relation rel;
- ScanKeyData entry[1];
- HeapScanDesc scan;
- HeapTuple tup;
- HeapTuple newtuple;
- Form_pg_tablespace newform;
-
- /* Search pg_tablespace */
- rel = heap_open(TableSpaceRelationId, RowExclusiveLock);
-
- ScanKeyInit(&entry[0],
- Anum_pg_tablespace_spcname,
- BTEqualStrategyNumber, F_NAMEEQ,
- CStringGetDatum(oldname));
- scan = heap_beginscan(rel, SnapshotNow, 1, entry);
- tup = heap_getnext(scan, ForwardScanDirection);
- if (!HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_UNDEFINED_OBJECT),
- errmsg("tablespace \"%s\" does not exist",
- oldname)));
-
- newtuple = heap_copytuple(tup);
- newform = (Form_pg_tablespace) GETSTRUCT(newtuple);
-
- heap_endscan(scan);
-
- /* Must be owner */
- if (!pg_tablespace_ownercheck(HeapTupleGetOid(newtuple), GetUserId()))
- aclcheck_error(ACLCHECK_NO_PRIV, ACL_KIND_TABLESPACE, oldname);
-
- /* Validate new name */
- if (!allowSystemTableMods && IsReservedName(newname))
- ereport(ERROR,
- (errcode(ERRCODE_RESERVED_NAME),
- errmsg("unacceptable tablespace name \"%s\"", newname),
- errdetail("The prefix \"pg_\" is reserved for system tablespaces.")));
-
- /* Make sure the new name doesn't exist */
- ScanKeyInit(&entry[0],
- Anum_pg_tablespace_spcname,
- BTEqualStrategyNumber, F_NAMEEQ,
- CStringGetDatum(newname));
- scan = heap_beginscan(rel, SnapshotNow, 1, entry);
- tup = heap_getnext(scan, ForwardScanDirection);
- if (HeapTupleIsValid(tup))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("tablespace \"%s\" already exists",
- newname)));
-
- heap_endscan(scan);
-
- /* OK, update the entry */
- namestrcpy(&(newform->spcname), newname);
-
- simple_heap_update(rel, &newtuple->t_self, newtuple);
- CatalogUpdateIndexes(rel, newtuple);
-
- heap_close(rel, NoLock);
-}
-
/*
* Change tablespace owner
*/
diff --git a/src/backend/commands/tsearchcmds.c b/src/backend/commands/tsearchcmds.c
index 471d6d1..73b8c0d 100644
--- a/src/backend/commands/tsearchcmds.c
+++ b/src/backend/commands/tsearchcmds.c
@@ -301,49 +301,6 @@ RemoveTSParserById(Oid prsId)
heap_close(relation, RowExclusiveLock);
}
-/*
- * ALTER TEXT SEARCH PARSER RENAME
- */
-void
-RenameTSParser(List *oldname, const char *newname)
-{
- HeapTuple tup;
- Relation rel;
- Oid prsId;
- Oid namespaceOid;
-
- if (!superuser())
- ereport(ERROR,
- (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
- errmsg("must be superuser to rename text search parsers")));
-
- rel = heap_open(TSParserRelationId, RowExclusiveLock);
-
- prsId = get_ts_parser_oid(oldname, false);
-
- tup = SearchSysCacheCopy1(TSPARSEROID, ObjectIdGetDatum(prsId));
-
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for text search parser %u", prsId);
-
- namespaceOid = ((Form_pg_ts_parser) GETSTRUCT(tup))->prsnamespace;
-
- if (SearchSysCacheExists2(TSPARSERNAMENSP,
- PointerGetDatum(newname),
- ObjectIdGetDatum(namespaceOid)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("text search parser \"%s\" already exists",
- newname)));
-
- namestrcpy(&(((Form_pg_ts_parser) GETSTRUCT(tup))->prsname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
/* ---------------------- TS Dictionary commands -----------------------*/
/*
@@ -527,57 +484,6 @@ DefineTSDictionary(List *names, List *parameters)
}
/*
- * ALTER TEXT SEARCH DICTIONARY RENAME
- */
-void
-RenameTSDictionary(List *oldname, const char *newname)
-{
- HeapTuple tup;
- Relation rel;
- Oid dictId;
- Oid namespaceOid;
- AclResult aclresult;
-
- rel = heap_open(TSDictionaryRelationId, RowExclusiveLock);
-
- dictId = get_ts_dict_oid(oldname, false);
-
- tup = SearchSysCacheCopy1(TSDICTOID, ObjectIdGetDatum(dictId));
-
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for text search dictionary %u",
- dictId);
-
- namespaceOid = ((Form_pg_ts_dict) GETSTRUCT(tup))->dictnamespace;
-
- if (SearchSysCacheExists2(TSDICTNAMENSP,
- PointerGetDatum(newname),
- ObjectIdGetDatum(namespaceOid)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("text search dictionary \"%s\" already exists",
- newname)));
-
- /* must be owner */
- if (!pg_ts_dict_ownercheck(dictId, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_TSDICTIONARY,
- NameListToString(oldname));
-
- /* must have CREATE privilege on namespace */
- aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
- if (aclresult != ACLCHECK_OK)
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceOid));
-
- namestrcpy(&(((Form_pg_ts_dict) GETSTRUCT(tup))->dictname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
-/*
* Guts of TS dictionary deletion.
*/
void
@@ -950,50 +856,6 @@ DefineTSTemplate(List *names, List *parameters)
}
/*
- * ALTER TEXT SEARCH TEMPLATE RENAME
- */
-void
-RenameTSTemplate(List *oldname, const char *newname)
-{
- HeapTuple tup;
- Relation rel;
- Oid tmplId;
- Oid namespaceOid;
-
- if (!superuser())
- ereport(ERROR,
- (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
- errmsg("must be superuser to rename text search templates")));
-
- rel = heap_open(TSTemplateRelationId, RowExclusiveLock);
-
- tmplId = get_ts_template_oid(oldname, false);
-
- tup = SearchSysCacheCopy1(TSTEMPLATEOID, ObjectIdGetDatum(tmplId));
-
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for text search template %u",
- tmplId);
-
- namespaceOid = ((Form_pg_ts_template) GETSTRUCT(tup))->tmplnamespace;
-
- if (SearchSysCacheExists2(TSTEMPLATENAMENSP,
- PointerGetDatum(newname),
- ObjectIdGetDatum(namespaceOid)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("text search template \"%s\" already exists",
- newname)));
-
- namestrcpy(&(((Form_pg_ts_template) GETSTRUCT(tup))->tmplname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
-/*
* Guts of TS template deletion.
*/
void
@@ -1289,56 +1151,6 @@ DefineTSConfiguration(List *names, List *parameters)
}
/*
- * ALTER TEXT SEARCH CONFIGURATION RENAME
- */
-void
-RenameTSConfiguration(List *oldname, const char *newname)
-{
- HeapTuple tup;
- Relation rel;
- Oid cfgId;
- AclResult aclresult;
- Oid namespaceOid;
-
- rel = heap_open(TSConfigRelationId, RowExclusiveLock);
-
- cfgId = get_ts_config_oid(oldname, false);
-
- tup = SearchSysCacheCopy1(TSCONFIGOID, ObjectIdGetDatum(cfgId));
-
- if (!HeapTupleIsValid(tup)) /* should not happen */
- elog(ERROR, "cache lookup failed for text search configuration %u",
- cfgId);
-
- namespaceOid = ((Form_pg_ts_config) GETSTRUCT(tup))->cfgnamespace;
-
- if (SearchSysCacheExists2(TSCONFIGNAMENSP,
- PointerGetDatum(newname),
- ObjectIdGetDatum(namespaceOid)))
- ereport(ERROR,
- (errcode(ERRCODE_DUPLICATE_OBJECT),
- errmsg("text search configuration \"%s\" already exists",
- newname)));
-
- /* must be owner */
- if (!pg_ts_config_ownercheck(cfgId, GetUserId()))
- aclcheck_error(ACLCHECK_NOT_OWNER, ACL_KIND_TSCONFIGURATION,
- NameListToString(oldname));
-
- /* must have CREATE privilege on namespace */
- aclresult = pg_namespace_aclcheck(namespaceOid, GetUserId(), ACL_CREATE);
- aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
- get_namespace_name(namespaceOid));
-
- namestrcpy(&(((Form_pg_ts_config) GETSTRUCT(tup))->cfgname), newname);
- simple_heap_update(rel, &tup->t_self, tup);
- CatalogUpdateIndexes(rel, tup);
-
- heap_close(rel, NoLock);
- heap_freetuple(tup);
-}
-
-/*
* Guts of TS configuration deletion.
*/
void
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 7940121..b79b654 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -6487,7 +6487,8 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
{
RenameStmt *n = makeNode(RenameStmt);
n->renameType = OBJECT_LANGUAGE;
- n->subname = $4;
+ n->object = list_make1(makeString($4));
+ n->objarg = NIL;
n->newname = $7;
$$ = (Node *)n;
}
@@ -6496,7 +6497,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
RenameStmt *n = makeNode(RenameStmt);
n->renameType = OBJECT_OPCLASS;
n->object = $4;
- n->subname = $6;
+ n->objarg = list_make1(makeString($6));
n->newname = $9;
$$ = (Node *)n;
}
@@ -6505,7 +6506,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
RenameStmt *n = makeNode(RenameStmt);
n->renameType = OBJECT_OPFAMILY;
n->object = $4;
- n->subname = $6;
+ n->objarg = list_make1(makeString($6));
n->newname = $9;
$$ = (Node *)n;
}
@@ -6513,7 +6514,8 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
{
RenameStmt *n = makeNode(RenameStmt);
n->renameType = OBJECT_SCHEMA;
- n->subname = $3;
+ n->object = list_make1(makeString($3));
+ n->objarg = NIL;
n->newname = $6;
$$ = (Node *)n;
}
@@ -6611,7 +6613,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name
{
RenameStmt *n = makeNode(RenameStmt);
n->renameType = OBJECT_TABLESPACE;
- n->subname = $3;
+ n->object = list_make1(makeString($3));
n->newname = $6;
$$ = (Node *)n;
}
diff --git a/src/include/catalog/objectaddress.h b/src/include/catalog/objectaddress.h
index a5d3325..bc46a80 100644
--- a/src/include/catalog/objectaddress.h
+++ b/src/include/catalog/objectaddress.h
@@ -41,7 +41,7 @@ extern bool object_exists_namespace(ObjectAddress address,
const char *new_name);
extern HeapTuple get_object_tuple(ObjectAddress address);
-
+extern AttrNumber get_object_name_attnum(const ObjectAddress *address);
extern AttrNumber get_object_namespace_attnum(const ObjectAddress *address);
extern Oid get_object_namespace(const ObjectAddress *address);
diff --git a/src/include/commands/collationcmds.h b/src/include/commands/collationcmds.h
index d161d74..a2b7879 100644
--- a/src/include/commands/collationcmds.h
+++ b/src/include/commands/collationcmds.h
@@ -18,7 +18,6 @@
#include "nodes/parsenodes.h"
extern void DefineCollation(List *names, List *parameters);
-extern void RenameCollation(List *name, const char *newname);
extern void AlterCollationOwner(List *name, Oid newOwnerId);
extern void AlterCollationOwner_oid(Oid collationOid, Oid newOwnerId);
diff --git a/src/include/commands/conversioncmds.h b/src/include/commands/conversioncmds.h
index 6a8a02f..b592131 100644
--- a/src/include/commands/conversioncmds.h
+++ b/src/include/commands/conversioncmds.h
@@ -18,7 +18,6 @@
#include "nodes/parsenodes.h"
extern void CreateConversionCommand(CreateConversionStmt *parsetree);
-extern void RenameConversion(List *name, const char *newname);
extern void AlterConversionOwner(List *name, Oid newOwnerId);
extern void AlterConversionOwner_oid(Oid conversionOid, Oid newOwnerId);
diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h
index b4c0c91..6e38ebf 100644
--- a/src/include/commands/defrem.h
+++ b/src/include/commands/defrem.h
@@ -64,7 +64,6 @@ extern void CreateFunction(CreateFunctionStmt *stmt, const char *queryString);
extern void RemoveFunctionById(Oid funcOid);
extern void SetFunctionReturnType(Oid funcOid, Oid newRetType);
extern void SetFunctionArgType(Oid funcOid, int argIndex, Oid newArgType);
-extern void RenameFunction(List *name, List *argtypes, const char *newname);
extern void AlterFunctionOwner(List *name, List *argtypes, Oid newOwnerId);
extern void AlterFunctionOwner_oid(Oid procOid, Oid newOwnerId);
extern void AlterFunction(AlterFunctionStmt *stmt);
@@ -83,7 +82,6 @@ extern void AlterOperatorOwner_oid(Oid operOid, Oid newOwnerId);
/* commands/aggregatecmds.c */
extern void DefineAggregate(List *name, List *args, bool oldstyle,
List *parameters);
-extern void RenameAggregate(List *name, List *args, const char *newname);
extern void AlterAggregateOwner(List *name, List *args, Oid newOwnerId);
/* commands/opclasscmds.c */
@@ -94,8 +92,6 @@ extern void RemoveOpClassById(Oid opclassOid);
extern void RemoveOpFamilyById(Oid opfamilyOid);
extern void RemoveAmOpEntryById(Oid entryOid);
extern void RemoveAmProcEntryById(Oid entryOid);
-extern void RenameOpClass(List *name, const char *access_method, const char *newname);
-extern void RenameOpFamily(List *name, const char *access_method, const char *newname);
extern void AlterOpClassOwner(List *name, const char *access_method, Oid newOwnerId);
extern void AlterOpClassOwner_oid(Oid opclassOid, Oid newOwnerId);
extern void AlterOpFamilyOwner(List *name, const char *access_method, Oid newOwnerId);
@@ -106,21 +102,17 @@ extern Oid get_opfamily_oid(Oid amID, List *opfamilyname, bool missing_ok);
/* commands/tsearchcmds.c */
extern void DefineTSParser(List *names, List *parameters);
-extern void RenameTSParser(List *oldname, const char *newname);
extern void RemoveTSParserById(Oid prsId);
extern void DefineTSDictionary(List *names, List *parameters);
-extern void RenameTSDictionary(List *oldname, const char *newname);
extern void RemoveTSDictionaryById(Oid dictId);
extern void AlterTSDictionary(AlterTSDictionaryStmt *stmt);
extern void AlterTSDictionaryOwner(List *name, Oid newOwnerId);
extern void DefineTSTemplate(List *names, List *parameters);
-extern void RenameTSTemplate(List *oldname, const char *newname);
extern void RemoveTSTemplateById(Oid tmplId);
extern void DefineTSConfiguration(List *names, List *parameters);
-extern void RenameTSConfiguration(List *oldname, const char *newname);
extern void RemoveTSConfigurationById(Oid cfgId);
extern void AlterTSConfiguration(AlterTSConfigurationStmt *stmt);
extern void AlterTSConfigurationOwner(List *name, Oid newOwnerId);
diff --git a/src/test/regress/expected/alter_rename.out b/src/test/regress/expected/alter_rename.out
index 7248b49..38ba86f 100644
--- a/src/test/regress/expected/alter_rename.out
+++ b/src/test/regress/expected/alter_rename.out
@@ -124,7 +124,7 @@ CREATE FUNCTION testfunc_b(int)
RETURNS int LANGUAGE sql
AS 'SELECT $1 + $1';
ALTER FUNCTION testfunc_a(int) RENAME TO testfunc_b; -- fail
-ERROR: function testfunc_b(integer) already exists in schema "testschema_1"
+ERROR: function testfunc_b already exists in schema "testschema_1"
ALTER FUNCTION testfunc_b(int) SET SCHEMA testschema_2; -- OK
ALTER FUNCTION testfunc_a(int) RENAME TO testfunc_b; -- OK
ALTER FUNCTION testfunc_b(int) SET SCHEMA testschema_2; -- fail
@@ -138,7 +138,7 @@ CREATE AGGREGATE testagg_b(
initcond1 = '0'
);
ALTER AGGREGATE testagg_a(int) RENAME TO testagg_b; -- fail
-ERROR: function testagg_b(integer) already exists in schema "testschema_1"
+ERROR: function testagg_b already exists in schema "testschema_1"
ALTER AGGREGATE testagg_b(int) SET SCHEMA testschema_2; -- OK
ALTER AGGREGATE testagg_a(int) RENAME TO testagg_b; -- OK
ALTER AGGREGATE testagg_b(int) SET SCHEMA testschema_2; -- fail
@@ -177,7 +177,7 @@ ERROR: operator @#@(bigint,bigint) already exists in schema "testschema_2"
CREATE OPERATOR FAMILY testopfamily_a USING btree;
CREATE OPERATOR FAMILY testopfamily_b USING btree;
ALTER OPERATOR FAMILY testopfamily_a USING btree RENAME TO testopfamily_b; -- fail
-ERROR: operator family "testopfamily_b" for access method "btree" already exists in schema "testschema_1"
+ERROR: operator family "testopfamily_b" already exists in schema "testschema_1"
ALTER OPERATOR FAMILY testopfamily_b USING btree SET SCHEMA testschema_2; -- OK
ALTER OPERATOR FAMILY testopfamily_a USING btree RENAME TO testopfamily_b; -- OK
ALTER OPERATOR FAMILY testopfamily_b USING btree SET SCHEMA testschema_2; -- fail
@@ -187,7 +187,7 @@ CREATE OPERATOR CLASS testopclass_a
CREATE OPERATOR CLASS testopclass_b
FOR TYPE circle USING btree FAMILY testopfamily_b AS OPERATOR 1 =;
ALTER OPERATOR CLASS testopclass_a USING btree RENAME TO testopclass_b; -- fail
-ERROR: operator class "testopclass_b" for access method "btree" already exists in schema "testschema_1"
+ERROR: operator class "testopclass_b" already exists in schema "testschema_1"
ALTER OPERATOR CLASS testopclass_b USING btree SET SCHEMA testschema_2; -- OK
ALTER OPERATOR CLASS testopclass_a USING btree RENAME TO testopclass_b; -- OK
ALTER OPERATOR CLASS testopclass_b USING btree SET SCHEMA testschema_2; -- fail
@@ -206,7 +206,7 @@ CREATE TEXT SEARCH DICTIONARY testtsdict_b (
AffFile=ispell_sample
);
ALTER TEXT SEARCH DICTIONARY testtsdict_a RENAME TO testtsdict_b; -- fail
-ERROR: text search dictionary "testtsdict_b" already exists
+ERROR: text search dictionary "testtsdict_b" already exists in shema "testschema_1"
ALTER TEXT SEARCH DICTIONARY testtsdict_b SET SCHEMA testschema_2; -- OK
ALTER TEXT SEARCH DICTIONARY testtsdict_a RENAME TO testtsdict_b; -- OK
ALTER TEXT SEARCH DICTIONARY testtsdict_b SET SCHEMA testschema_2; -- fail
@@ -214,7 +214,7 @@ ERROR: text search dictionary testtsdict_b already exists in schema "testschema
CREATE TEXT SEARCH CONFIGURATION testtsconf_a (COPY=english);
CREATE TEXT SEARCH CONFIGURATION testtsconf_b (COPY=english);
ALTER TEXT SEARCH CONFIGURATION testtsconf_a RENAME TO testtsconf_b; -- fail
-ERROR: text search configuration "testtsconf_b" already exists
+ERROR: text search configuration "testtsconf_b" already exists in schema "testschema_1"
ALTER TEXT SEARCH CONFIGURATION testtsconf_b SET SCHEMA testschema_2; -- OK
ALTER TEXT SEARCH CONFIGURATION testtsconf_a RENAME TO testtsconf_b; -- OK
ALTER TEXT SEARCH CONFIGURATION testtsconf_b SET SCHEMA testschema_2; -- fail
@@ -225,7 +225,7 @@ ERROR: text search configuration testtsconf_b already exists in schema "testsch
CREATE COLLATION testcollation_a FROM "C";
CREATE COLLATION testcollation_b FROM "C";
ALTER COLLATION testcollation_a RENAME TO testcollation_b; -- fail
-ERROR: collation "testcollation_b" for encoding "UTF8" already exists in schema "testschema_1"
+ERROR: collation "testcollation_b" already exists in schema "testschema_1"
ALTER COLLATION testcollation_b SET SCHEMA testschema_2; -- OK
ALTER COLLATION testcollation_a RENAME TO testcollation_b; -- OK
ALTER COLLATION testcollation_b SET SCHEMA testschema_2; -- fail