*** 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 */
