Here's a cleaned up version of this patch, for HEAD. (The patches for 9.1 and 9.2 required minor conflict fixes, but nothing substantial).
The main difference from Dimitri's patch is that I added enough support code so that AlterRelationNamespaceInternal() is always getting a valid ObjectAddresses list, and get rid of the checks for a NULL one. It seems cleaner and simpler to me this way. This means I had to add support for object types that may never be visited more than once (indexes), but I don't think this is a problem. Remaining object types are those that use the generic code path in HEAD (as patched by KaiGai). We know (because the generic code path checks) that in these cases, relations are never involved; the only other funny cases I saw were collations and functions, but those are funny only because the lookups are unlike the normal cases; they don't have any subsidiary objects that would cause trouble. While I am looking at this code: I am uneasy about AlterObjectNamespace_oid() ignoring object classes that it doesn't explicitely know about. This means we will fail to cover new cases we might come up with. For example, can we have event triggers in extensions, and do event triggers belong to a schema? If so, we already have a bug here in HEAD. I would like us to get rid of the "default: break;" case, and instead explicitely list the object classes we ignore. That way, the compiler will warn us as soon as we add a new object class and neglect to add it here. -- Álvaro Herrera http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
*** a/src/backend/catalog/pg_constraint.c --- b/src/backend/catalog/pg_constraint.c *************** *** 679,685 **** RenameConstraintById(Oid conId, const char *newname) */ void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, ! Oid newNspId, bool isType) { Relation conRel; ScanKeyData key[1]; --- 679,685 ---- */ void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, ! Oid newNspId, bool isType, ObjectAddresses *objsMoved) { Relation conRel; ScanKeyData key[1]; *************** *** 712,717 **** AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, --- 712,725 ---- while (HeapTupleIsValid((tup = systable_getnext(scan)))) { Form_pg_constraint conform = (Form_pg_constraint) GETSTRUCT(tup); + ObjectAddress thisobj; + + thisobj.classId = ConstraintRelationId; + thisobj.objectId = HeapTupleGetOid(tup); + thisobj.objectSubId = 0; + + if (object_address_present(&thisobj, objsMoved)) + continue; if (conform->connamespace == oldNspId) { *************** *** 729,734 **** AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, --- 737,744 ---- * changeDependencyFor(). */ } + + add_exact_object_address(&thisobj, objsMoved); } systable_endscan(scan); *** a/src/backend/commands/alter.c --- b/src/backend/commands/alter.c *************** *** 252,258 **** ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt) * object doesn't have a schema. */ Oid ! AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid) { Oid oldNspOid = InvalidOid; ObjectAddress dep; --- 252,259 ---- * object doesn't have a schema. */ Oid ! AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid, ! ObjectAddresses *objsMoved) { Oid oldNspOid = InvalidOid; ObjectAddress dep; *************** *** 266,285 **** AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid) case OCLASS_CLASS: { Relation rel; - Relation classRel; rel = relation_open(objid, AccessExclusiveLock); oldNspOid = RelationGetNamespace(rel); ! classRel = heap_open(RelationRelationId, RowExclusiveLock); ! ! AlterRelationNamespaceInternal(classRel, ! objid, ! oldNspOid, ! nspOid, ! true); ! ! heap_close(classRel, RowExclusiveLock); relation_close(rel, NoLock); break; --- 267,277 ---- case OCLASS_CLASS: { Relation rel; rel = relation_open(objid, AccessExclusiveLock); oldNspOid = RelationGetNamespace(rel); ! AlterTableNamespaceInternal(rel, oldNspOid, nspOid, objsMoved); relation_close(rel, NoLock); break; *************** *** 290,296 **** AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid) break; case OCLASS_TYPE: ! oldNspOid = AlterTypeNamespace_oid(objid, nspOid); break; case OCLASS_COLLATION: --- 282,288 ---- break; case OCLASS_TYPE: ! oldNspOid = AlterTypeNamespace_oid(objid, nspOid, objsMoved); break; case OCLASS_COLLATION: *** a/src/backend/commands/extension.c --- b/src/backend/commands/extension.c *************** *** 2204,2209 **** AlterExtensionNamespace(List *names, const char *newschema) --- 2204,2210 ---- Relation depRel; SysScanDesc depScan; HeapTuple depTup; + ObjectAddresses *objsMoved; if (list_length(names) != 1) ereport(ERROR, *************** *** 2278,2283 **** AlterExtensionNamespace(List *names, const char *newschema) --- 2279,2286 ---- errmsg("extension \"%s\" does not support SET SCHEMA", NameStr(extForm->extname)))); + objsMoved = new_object_addresses(); + /* * Scan pg_depend to find objects that depend directly on the extension, * and alter each one's schema. *************** *** 2317,2325 **** AlterExtensionNamespace(List *names, const char *newschema) if (dep.objectSubId != 0) /* should not happen */ elog(ERROR, "extension should not have a sub-object dependency"); dep_oldNspOid = AlterObjectNamespace_oid(dep.classId, dep.objectId, ! nspOid); /* * Remember previous namespace of first object that has one --- 2320,2330 ---- if (dep.objectSubId != 0) /* should not happen */ elog(ERROR, "extension should not have a sub-object dependency"); + /* Relocate the object */ dep_oldNspOid = AlterObjectNamespace_oid(dep.classId, dep.objectId, ! nspOid, ! objsMoved); /* * Remember previous namespace of first object that has one *** a/src/backend/commands/tablecmds.c --- b/src/backend/commands/tablecmds.c *************** *** 261,270 **** static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, int16 seqNumber, Relation inhRelation); static int findAttrByName(const char *attributeName, List *schema); static void AlterIndexNamespaces(Relation classRel, Relation rel, ! Oid oldNspOid, Oid newNspOid); static void AlterSeqNamespaces(Relation classRel, Relation rel, ! Oid oldNspOid, Oid newNspOid, ! const char *newNspName, LOCKMODE lockmode); static void ATExecValidateConstraint(Relation rel, char *constrName, bool recurse, bool recursing, LOCKMODE lockmode); static int transformColumnNameList(Oid relId, List *colList, --- 261,270 ---- int16 seqNumber, Relation inhRelation); static int findAttrByName(const char *attributeName, List *schema); static void AlterIndexNamespaces(Relation classRel, Relation rel, ! Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved); static void AlterSeqNamespaces(Relation classRel, Relation rel, ! Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved, ! LOCKMODE lockmode); static void ATExecValidateConstraint(Relation rel, char *constrName, bool recurse, bool recursing, LOCKMODE lockmode); static int transformColumnNameList(Oid relId, List *colList, *************** *** 9711,9718 **** AlterTableNamespace(AlterObjectSchemaStmt *stmt) Oid relid; Oid oldNspOid; Oid nspOid; - Relation classRel; RangeVar *newrv; relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, stmt->missing_ok, false, --- 9711,9718 ---- Oid relid; Oid oldNspOid; Oid nspOid; RangeVar *newrv; + ObjectAddresses *objsMoved; relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, stmt->missing_ok, false, *************** *** 9753,9779 **** AlterTableNamespace(AlterObjectSchemaStmt *stmt) /* common checks on switching namespaces */ CheckSetNamespace(oldNspOid, nspOid, RelationRelationId, relid); /* OK, modify the pg_class row and pg_depend entry */ classRel = heap_open(RelationRelationId, RowExclusiveLock); ! AlterRelationNamespaceInternal(classRel, relid, oldNspOid, nspOid, true); /* Fix the table's row type too */ ! AlterTypeNamespaceInternal(rel->rd_rel->reltype, nspOid, false, false); /* Fix other dependent stuff */ if (rel->rd_rel->relkind == RELKIND_RELATION) { ! AlterIndexNamespaces(classRel, rel, oldNspOid, nspOid); ! AlterSeqNamespaces(classRel, rel, oldNspOid, nspOid, stmt->newschema, ! AccessExclusiveLock); ! AlterConstraintNamespaces(relid, oldNspOid, nspOid, false); } heap_close(classRel, RowExclusiveLock); - - /* close rel, but keep lock until commit */ - relation_close(rel, NoLock); } /* --- 9753,9799 ---- /* common checks on switching namespaces */ CheckSetNamespace(oldNspOid, nspOid, RelationRelationId, relid); + objsMoved = new_object_addresses(); + AlterTableNamespaceInternal(rel, oldNspOid, nspOid, objsMoved); + free_object_addresses(objsMoved); + + /* close rel, but keep lock until commit */ + relation_close(rel, NoLock); + } + + /* + * The guts of relocating a table to another namespace: besides moving + * the table itself, its dependent objects are relocated to the new schema. + */ + void + AlterTableNamespaceInternal(Relation rel, Oid oldNspOid, Oid nspOid, + ObjectAddresses *objsMoved) + { + Relation classRel; + + Assert(objsMoved != NULL); + /* OK, modify the pg_class row and pg_depend entry */ classRel = heap_open(RelationRelationId, RowExclusiveLock); ! AlterRelationNamespaceInternal(classRel, RelationGetRelid(rel), oldNspOid, ! nspOid, true, objsMoved); /* Fix the table's row type too */ ! AlterTypeNamespaceInternal(rel->rd_rel->reltype, ! nspOid, false, false, objsMoved); /* Fix other dependent stuff */ if (rel->rd_rel->relkind == RELKIND_RELATION) { ! AlterIndexNamespaces(classRel, rel, oldNspOid, nspOid, objsMoved); ! AlterSeqNamespaces(classRel, rel, oldNspOid, nspOid, ! objsMoved, AccessExclusiveLock); ! AlterConstraintNamespaces(RelationGetRelid(rel), oldNspOid, nspOid, ! false, objsMoved); } heap_close(classRel, RowExclusiveLock); } /* *************** *** 9784,9793 **** AlterTableNamespace(AlterObjectSchemaStmt *stmt) void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, ! bool hasDependEntry) { HeapTuple classTup; Form_pg_class classForm; classTup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relOid)); if (!HeapTupleIsValid(classTup)) --- 9804,9814 ---- void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, ! bool hasDependEntry, ObjectAddresses *objsMoved) { HeapTuple classTup; Form_pg_class classForm; + ObjectAddress thisobj; classTup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relOid)); if (!HeapTupleIsValid(classTup)) *************** *** 9796,9822 **** AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Assert(classForm->relnamespace == oldNspOid); ! /* check for duplicate name (more friendly than unique-index failure) */ ! if (get_relname_relid(NameStr(classForm->relname), ! newNspOid) != InvalidOid) ! ereport(ERROR, ! (errcode(ERRCODE_DUPLICATE_TABLE), ! errmsg("relation \"%s\" already exists in schema \"%s\"", ! NameStr(classForm->relname), ! get_namespace_name(newNspOid)))); ! /* classTup is a copy, so OK to scribble on */ ! classForm->relnamespace = newNspOid; ! simple_heap_update(classRel, &classTup->t_self, classTup); ! CatalogUpdateIndexes(classRel, classTup); ! /* Update dependency on schema if caller said so */ ! if (hasDependEntry && ! changeDependencyFor(RelationRelationId, relOid, ! NamespaceRelationId, oldNspOid, newNspOid) != 1) ! elog(ERROR, "failed to change schema dependency for relation \"%s\"", ! NameStr(classForm->relname)); heap_freetuple(classTup); } --- 9817,9855 ---- Assert(classForm->relnamespace == oldNspOid); ! thisobj.classId = RelationRelationId; ! thisobj.objectId = relOid; ! thisobj.objectSubId = 0; ! ! /* ! * Do nothing when there's nothing to do. ! */ ! if (!object_address_present(&thisobj, objsMoved)) ! { ! /* check for duplicate name (more friendly than unique-index failure) */ ! if (get_relname_relid(NameStr(classForm->relname), ! newNspOid) != InvalidOid) ! ereport(ERROR, ! (errcode(ERRCODE_DUPLICATE_TABLE), ! errmsg("relation \"%s\" already exists in schema \"%s\"", ! NameStr(classForm->relname), ! get_namespace_name(newNspOid)))); ! /* classTup is a copy, so OK to scribble on */ ! classForm->relnamespace = newNspOid; ! simple_heap_update(classRel, &classTup->t_self, classTup); ! CatalogUpdateIndexes(classRel, classTup); ! /* Update dependency on schema if caller said so */ ! if (hasDependEntry && ! changeDependencyFor(RelationRelationId, relOid, ! NamespaceRelationId, oldNspOid, newNspOid) != 1) ! elog(ERROR, "failed to change schema dependency for relation \"%s\"", ! NameStr(classForm->relname)); ! ! add_exact_object_address(&thisobj, objsMoved); ! } heap_freetuple(classTup); } *************** *** 9829,9835 **** AlterRelationNamespaceInternal(Relation classRel, Oid relOid, */ static void AlterIndexNamespaces(Relation classRel, Relation rel, ! Oid oldNspOid, Oid newNspOid) { List *indexList; ListCell *l; --- 9862,9868 ---- */ static void AlterIndexNamespaces(Relation classRel, Relation rel, ! Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved) { List *indexList; ListCell *l; *************** *** 9839,9853 **** AlterIndexNamespaces(Relation classRel, Relation rel, foreach(l, indexList) { Oid indexOid = lfirst_oid(l); /* * Note: currently, the index will not have its own dependency on the * namespace, so we don't need to do changeDependencyFor(). There's no * row type in pg_type, either. */ ! AlterRelationNamespaceInternal(classRel, indexOid, ! oldNspOid, newNspOid, ! false); } list_free(indexList); --- 9872,9898 ---- foreach(l, indexList) { Oid indexOid = lfirst_oid(l); + ObjectAddress thisobj; + + thisobj.classId = RelationRelationId; + thisobj.objectId = indexOid; + thisobj.objectSubId = 0; /* * Note: currently, the index will not have its own dependency on the * namespace, so we don't need to do changeDependencyFor(). There's no * row type in pg_type, either. + * + * XXX this objsMoved test may be pointless -- surely we have a single + * dependency link from a relation to each index? */ ! if (!object_address_present(&thisobj, objsMoved)) ! { ! AlterRelationNamespaceInternal(classRel, indexOid, ! oldNspOid, newNspOid, ! false, objsMoved); ! add_exact_object_address(&thisobj, objsMoved); ! } } list_free(indexList); *************** *** 9862,9868 **** AlterIndexNamespaces(Relation classRel, Relation rel, */ static void AlterSeqNamespaces(Relation classRel, Relation rel, ! Oid oldNspOid, Oid newNspOid, const char *newNspName, LOCKMODE lockmode) { Relation depRel; SysScanDesc scan; --- 9907,9914 ---- */ static void AlterSeqNamespaces(Relation classRel, Relation rel, ! Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved, ! LOCKMODE lockmode) { Relation depRel; SysScanDesc scan; *************** *** 9914,9927 **** AlterSeqNamespaces(Relation classRel, Relation rel, /* Fix the pg_class and pg_depend entries */ AlterRelationNamespaceInternal(classRel, depForm->objid, oldNspOid, newNspOid, ! true); /* * Sequences have entries in pg_type. We need to be careful to move * them to the new namespace, too. */ AlterTypeNamespaceInternal(RelationGetForm(seqRel)->reltype, ! newNspOid, false, false); /* Now we can close it. Keep the lock till end of transaction. */ relation_close(seqRel, NoLock); --- 9960,9973 ---- /* Fix the pg_class and pg_depend entries */ AlterRelationNamespaceInternal(classRel, depForm->objid, oldNspOid, newNspOid, ! true, objsMoved); /* * Sequences have entries in pg_type. We need to be careful to move * them to the new namespace, too. */ AlterTypeNamespaceInternal(RelationGetForm(seqRel)->reltype, ! newNspOid, false, false, objsMoved); /* Now we can close it. Keep the lock till end of transaction. */ relation_close(seqRel, NoLock); *** a/src/backend/commands/typecmds.c --- b/src/backend/commands/typecmds.c *************** *** 3322,3327 **** AlterTypeNamespace(List *names, const char *newschema, ObjectType objecttype) --- 3322,3328 ---- TypeName *typename; Oid typeOid; Oid nspOid; + ObjectAddresses *objsMoved; /* Make a TypeName so we can use standard type lookup machinery */ typename = makeTypeNameFromNameList(names); *************** *** 3337,3347 **** AlterTypeNamespace(List *names, const char *newschema, ObjectType objecttype) /* get schema OID and check its permissions */ nspOid = LookupCreationNamespace(newschema); ! AlterTypeNamespace_oid(typeOid, nspOid); } Oid ! AlterTypeNamespace_oid(Oid typeOid, Oid nspOid) { Oid elemOid; --- 3338,3350 ---- /* get schema OID and check its permissions */ nspOid = LookupCreationNamespace(newschema); ! objsMoved = new_object_addresses(); ! AlterTypeNamespace_oid(typeOid, nspOid, objsMoved); ! free_object_addresses(objsMoved); } Oid ! AlterTypeNamespace_oid(Oid typeOid, Oid nspOid, ObjectAddresses *objsMoved) { Oid elemOid; *************** *** 3360,3366 **** AlterTypeNamespace_oid(Oid typeOid, Oid nspOid) format_type_be(elemOid)))); /* and do the work */ ! return AlterTypeNamespaceInternal(typeOid, nspOid, false, true); } /* --- 3363,3369 ---- format_type_be(elemOid)))); /* and do the work */ ! return AlterTypeNamespaceInternal(typeOid, nspOid, false, true, objsMoved); } /* *************** *** 3381,3387 **** AlterTypeNamespace_oid(Oid typeOid, Oid nspOid) Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, ! bool errorOnTableType) { Relation rel; HeapTuple tup; --- 3384,3391 ---- Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, ! bool errorOnTableType, ! ObjectAddresses *objsMoved) { Relation rel; HeapTuple tup; *************** *** 3389,3394 **** AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, --- 3393,3409 ---- Oid oldNspOid; Oid arrayOid; bool isCompositeType; + ObjectAddress thisobj; + + /* + * Make sure we haven't moved this object previously. + */ + thisobj.classId = TypeRelationId; + thisobj.objectId = typeOid; + thisobj.objectSubId = 0; + + if (object_address_present(&thisobj, objsMoved)) + return InvalidOid; rel = heap_open(TypeRelationId, RowExclusiveLock); *************** *** 3449,3455 **** AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, AlterRelationNamespaceInternal(classRel, typform->typrelid, oldNspOid, nspOid, ! false); heap_close(classRel, RowExclusiveLock); --- 3464,3470 ---- AlterRelationNamespaceInternal(classRel, typform->typrelid, oldNspOid, nspOid, ! false, objsMoved); heap_close(classRel, RowExclusiveLock); *************** *** 3458,3470 **** AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, * currently support this, but probably will someday). */ AlterConstraintNamespaces(typform->typrelid, oldNspOid, ! nspOid, false); } else { /* If it's a domain, it might have constraints */ if (typform->typtype == TYPTYPE_DOMAIN) ! AlterConstraintNamespaces(typeOid, oldNspOid, nspOid, true); } /* --- 3473,3486 ---- * currently support this, but probably will someday). */ AlterConstraintNamespaces(typform->typrelid, oldNspOid, ! nspOid, false, objsMoved); } else { /* If it's a domain, it might have constraints */ if (typform->typtype == TYPTYPE_DOMAIN) ! AlterConstraintNamespaces(typeOid, oldNspOid, nspOid, true, ! objsMoved); } /* *************** *** 3482,3490 **** AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, heap_close(rel, RowExclusiveLock); /* Recursively alter the associated array type, if any */ if (OidIsValid(arrayOid)) ! AlterTypeNamespaceInternal(arrayOid, nspOid, true, true); return oldNspOid; } --- 3498,3508 ---- heap_close(rel, RowExclusiveLock); + add_exact_object_address(&thisobj, objsMoved); + /* Recursively alter the associated array type, if any */ if (OidIsValid(arrayOid)) ! AlterTypeNamespaceInternal(arrayOid, nspOid, true, true, objsMoved); return oldNspOid; } *** a/src/include/catalog/pg_constraint.h --- b/src/include/catalog/pg_constraint.h *************** *** 20,25 **** --- 20,26 ---- #define PG_CONSTRAINT_H #include "catalog/genbki.h" + #include "catalog/dependency.h" #include "nodes/pg_list.h" /* ---------------- *************** *** 244,250 **** extern char *ChooseConstraintName(const char *name1, const char *name2, List *others); extern void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, ! Oid newNspId, bool isType); extern Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok); extern Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok); --- 245,251 ---- List *others); extern void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, ! Oid newNspId, bool isType, ObjectAddresses *objsMoved); extern Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok); extern Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok); *** a/src/include/commands/alter.h --- b/src/include/commands/alter.h *************** *** 14,26 **** #ifndef ALTER_H #define ALTER_H #include "nodes/parsenodes.h" #include "utils/relcache.h" extern void ExecRenameStmt(RenameStmt *stmt); extern void ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt); ! extern Oid AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid); extern Oid AlterObjectNamespace_internal(Relation rel, Oid objid, Oid nspOid); extern void ExecAlterOwnerStmt(AlterOwnerStmt *stmt); --- 14,28 ---- #ifndef ALTER_H #define ALTER_H + #include "catalog/dependency.h" #include "nodes/parsenodes.h" #include "utils/relcache.h" extern void ExecRenameStmt(RenameStmt *stmt); extern void ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt); ! extern Oid AlterObjectNamespace_oid(Oid classId, Oid objid, Oid nspOid, ! ObjectAddresses *objsMoved); extern Oid AlterObjectNamespace_internal(Relation rel, Oid objid, Oid nspOid); extern void ExecAlterOwnerStmt(AlterOwnerStmt *stmt); *** a/src/include/commands/tablecmds.h --- b/src/include/commands/tablecmds.h *************** *** 15,20 **** --- 15,21 ---- #define TABLECMDS_H #include "access/htup.h" + #include "catalog/dependency.h" #include "nodes/parsenodes.h" #include "storage/lock.h" #include "utils/relcache.h" *************** *** 36,44 **** extern void AlterTableInternal(Oid relid, List *cmds, bool recurse); extern void AlterTableNamespace(AlterObjectSchemaStmt *stmt); extern void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, ! bool hasDependEntry); extern void CheckTableNotInUse(Relation rel, const char *stmt); --- 37,49 ---- extern void AlterTableNamespace(AlterObjectSchemaStmt *stmt); + extern void AlterTableNamespaceInternal(Relation rel, Oid oldNspOid, + Oid nspOid, ObjectAddresses *objsMoved); + extern void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, ! bool hasDependEntry, ! ObjectAddresses *objsMoved); extern void CheckTableNotInUse(Relation rel, const char *stmt); *** a/src/include/commands/typecmds.h --- b/src/include/commands/typecmds.h *************** *** 15,20 **** --- 15,21 ---- #define TYPECMDS_H #include "access/htup.h" + #include "catalog/dependency.h" #include "nodes/parsenodes.h" *************** *** 45,53 **** extern void AlterTypeOwner(List *names, Oid newOwnerId, ObjectType objecttype); extern void AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId, bool hasDependEntry); extern void AlterTypeNamespace(List *names, const char *newschema, ObjectType objecttype); ! extern Oid AlterTypeNamespace_oid(Oid typeOid, Oid nspOid); ! extern Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, ! bool errorOnTableType); #endif /* TYPECMDS_H */ --- 46,55 ---- extern void AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId, bool hasDependEntry); extern void AlterTypeNamespace(List *names, const char *newschema, ObjectType objecttype); ! extern Oid AlterTypeNamespace_oid(Oid typeOid, Oid nspOid, ObjectAddresses *objsMoved); ! extern Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, ! bool errorOnTableType, ! ObjectAddresses *objsMoved); #endif /* TYPECMDS_H */
-- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs