src/backend/commands/alter.c | 28 ++++++++++------------------ src/backend/commands/collationcmds.c | 25 +------------------------ src/backend/commands/functioncmds.c | 31 +------------------------------ src/include/commands/collationcmds.h | 4 ++-- src/include/commands/defrem.h | 5 ++--- 5 files changed, 16 insertions(+), 77 deletions(-) diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index f628754..85d4a2c 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -19,9 +19,11 @@ #include "catalog/dependency.h" #include "catalog/indexing.h" #include "catalog/namespace.h" +#include "catalog/pg_collation.h" #include "catalog/pg_largeobject.h" #include "catalog/pg_largeobject_metadata.h" #include "catalog/pg_namespace.h" +#include "catalog/pg_proc.h" #include "commands/alter.h" #include "commands/collationcmds.h" #include "commands/conversioncmds.h" @@ -146,20 +148,9 @@ ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt) { switch (stmt->objectType) { - case OBJECT_AGGREGATE: - return AlterFunctionNamespace(stmt->object, stmt->objarg, true, - stmt->newschema); - - case OBJECT_COLLATION: - return AlterCollationNamespace(stmt->object, stmt->newschema); - case OBJECT_EXTENSION: return AlterExtensionNamespace(stmt->object, stmt->newschema); - case OBJECT_FUNCTION: - return AlterFunctionNamespace(stmt->object, stmt->objarg, false, - stmt->newschema); - case OBJECT_SEQUENCE: case OBJECT_TABLE: case OBJECT_VIEW: @@ -172,6 +163,9 @@ ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt) stmt->objectType); /* generic code path */ + case OBJECT_AGGREGATE: + case OBJECT_FUNCTION: + case OBJECT_COLLATION: case OBJECT_CONVERSION: case OBJECT_OPERATOR: case OBJECT_OPCLASS: @@ -253,18 +247,12 @@ AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid, break; } - case OCLASS_PROC: - oldNspOid = AlterFunctionNamespace_oid(objid, nspOid); - break; - case OCLASS_TYPE: oldNspOid = AlterTypeNamespace_oid(objid, nspOid, objsMoved); break; + case OCLASS_PROC: case OCLASS_COLLATION: - oldNspOid = AlterCollationNamespace_oid(objid, nspOid); - break; - case OCLASS_CONVERSION: case OCLASS_OPERATOR: case OCLASS_OPCLASS: @@ -380,6 +368,10 @@ AlterObjectNamespace_internal(Relation rel, Oid objid, Oid nspOid) errmsg("%s already exists in schema \"%s\"", getObjectDescriptionOids(classId, objid), get_namespace_name(nspOid)))); + else if (classId == ProcedureRelationId) + AlterFunctionNamespace_oid(rel, objid, nspOid); + else if (classId == CollationRelationId) + AlterCollationNamespace_oid(rel, objid, nspOid); /* Build modified tuple */ values = palloc0(RelationGetNumberOfAttributes(rel) * sizeof(Datum)); diff --git a/src/backend/commands/collationcmds.c b/src/backend/commands/collationcmds.c index b763f15..0450e3a 100644 --- a/src/backend/commands/collationcmds.c +++ b/src/backend/commands/collationcmds.c @@ -213,35 +213,14 @@ RenameCollation(List *name, const char *newname) } /* - * Execute ALTER COLLATION SET SCHEMA - */ -Oid -AlterCollationNamespace(List *name, const char *newschema) -{ - Oid collOid, - nspOid; - - collOid = get_collation_oid(name, false); - - nspOid = LookupCreationNamespace(newschema); - - AlterCollationNamespace_oid(collOid, nspOid); - - return collOid; -} - -/* * Change collation schema, by oid */ Oid -AlterCollationNamespace_oid(Oid collOid, Oid newNspOid) +AlterCollationNamespace_oid(Relation rel, Oid collOid, Oid newNspOid) { Oid oldNspOid; - Relation rel; char *collation_name; - rel = heap_open(CollationRelationId, RowExclusiveLock); - /* * We have to check for name collision ourselves, because * AlterObjectNamespace_internal doesn't know how to deal with the encoding @@ -277,7 +256,5 @@ AlterCollationNamespace_oid(Oid collOid, Oid newNspOid) /* OK, do the work */ oldNspOid = AlterObjectNamespace_internal(rel, collOid, newNspOid); - heap_close(rel, RowExclusiveLock); - return oldNspOid; } diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c index c858511..ec34358 100644 --- a/src/backend/commands/functioncmds.c +++ b/src/backend/commands/functioncmds.c @@ -1693,36 +1693,12 @@ DropCastById(Oid castOid) * These commands are identical except for the lookup procedure, so share code. */ Oid -AlterFunctionNamespace(List *name, List *argtypes, bool isagg, - const char *newschema) -{ - Oid procOid; - Oid nspOid; - - /* get function OID */ - if (isagg) - procOid = LookupAggNameTypeNames(name, argtypes, false); - else - procOid = LookupFuncNameTypeNames(name, argtypes, false); - - /* get schema OID and check its permissions */ - nspOid = LookupCreationNamespace(newschema); - - AlterFunctionNamespace_oid(procOid, nspOid); - - return procOid; -} - -Oid -AlterFunctionNamespace_oid(Oid procOid, Oid nspOid) +AlterFunctionNamespace_oid(Relation procRel, Oid procOid, Oid nspOid) { Oid oldNspOid; HeapTuple tup; - Relation procRel; Form_pg_proc proc; - procRel = heap_open(ProcedureRelationId, RowExclusiveLock); - /* * We have to check for name collisions ourselves, because * AlterObjectNamespace_internal doesn't know how to deal with the @@ -1744,11 +1720,6 @@ AlterFunctionNamespace_oid(Oid procOid, Oid nspOid) NameStr(proc->proname), get_namespace_name(nspOid)))); - /* OK, do the work */ - oldNspOid = AlterObjectNamespace_internal(procRel, procOid, nspOid); - - heap_close(procRel, RowExclusiveLock); - return oldNspOid; } diff --git a/src/include/commands/collationcmds.h b/src/include/commands/collationcmds.h index c7b536a..debab8e 100644 --- a/src/include/commands/collationcmds.h +++ b/src/include/commands/collationcmds.h @@ -19,7 +19,7 @@ extern Oid DefineCollation(List *names, List *parameters); extern Oid RenameCollation(List *name, const char *newname); -extern Oid AlterCollationNamespace(List *name, const char *newschema); -extern Oid AlterCollationNamespace_oid(Oid collOid, Oid newNspOid); +extern Oid AlterCollationNamespace_oid(Relation rel, + Oid collOid, Oid newNspOid); #endif /* COLLATIONCMDS_H */ diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h index c327136..981060f 100644 --- a/src/include/commands/defrem.h +++ b/src/include/commands/defrem.h @@ -15,6 +15,7 @@ #define DEFREM_H #include "nodes/parsenodes.h" +#include "utils/rel.h" /* commands/dropcmds.c */ extern void RemoveObjects(DropStmt *stmt); @@ -50,9 +51,7 @@ extern Oid RenameFunction(List *name, List *argtypes, const char *newname); extern Oid AlterFunction(AlterFunctionStmt *stmt); extern Oid CreateCast(CreateCastStmt *stmt); extern void DropCastById(Oid castOid); -extern Oid AlterFunctionNamespace(List *name, List *argtypes, bool isagg, - const char *newschema); -extern Oid AlterFunctionNamespace_oid(Oid procOid, Oid nspOid); +extern Oid AlterFunctionNamespace_oid(Relation rel, Oid procOid, Oid nspOid); extern void ExecuteDoStmt(DoStmt *stmt); extern Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok);