diff options
| -rw-r--r-- | src/bin/pg_dump/common.c | 2 | ||||
| -rw-r--r-- | src/bin/pg_dump/pg_dump.c | 26 | 
2 files changed, 21 insertions, 7 deletions
| diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index 9a5c6b9360a..bf06f678e20 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -131,7 +131,7 @@ getSchemaData(int *numTablesPtr)  	funinfo = getFuncs(&numFuncs);  	funinfoindex = buildIndexArray(funinfo, numFuncs, sizeof(FuncInfo)); -	/* this must be after getFuncs */ +	/* this must be after getTables and getFuncs */  	if (g_verbose)  		write_msg(NULL, "reading user-defined types\n");  	typinfo = getTypes(&numTypes); diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index b73392b6258..aa0b56c5a0d 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1021,8 +1021,11 @@ selectDumpableTable(TableInfo *tbinfo)   * If it's a table's rowtype or an autogenerated array type, we also apply a   * special type code to facilitate sorting into the desired order.	(We don't   * want to consider those to be ordinary types because that would bring tables - * up into the datatype part of the dump order.)  Those tests should be made - * first to ensure the objType change is applied regardless of namespace etc. + * up into the datatype part of the dump order.)  We still set the object's + * dump flag; that's not going to cause the dummy type to be dumped, but we + * need it so that casts involving such types will be dumped correctly -- see + * dumpCast.  This means the flag should be set the same as for the underlying + * object (the table or base type).   */  static void  selectDumpableType(TypeInfo *tyinfo) @@ -1031,19 +1034,30 @@ selectDumpableType(TypeInfo *tyinfo)  	if (OidIsValid(tyinfo->typrelid) &&  		tyinfo->typrelkind != RELKIND_COMPOSITE_TYPE)  	{ -		tyinfo->dobj.dump = false; +		TableInfo  *tytable = findTableByOid(tyinfo->typrelid); +  		tyinfo->dobj.objType = DO_DUMMY_TYPE; +		if (tytable != NULL) +			tyinfo->dobj.dump = tytable->dobj.dump; +		else +			tyinfo->dobj.dump = false; +		return;  	}  	/* skip auto-generated array types */ -	else if (tyinfo->isArray) +	if (tyinfo->isArray)  	{ -		tyinfo->dobj.dump = false;  		tyinfo->dobj.objType = DO_DUMMY_TYPE; +		/* +		 * Fall through to set the dump flag; we assume that the subsequent +		 * rules will do the same thing as they would for the array's base +		 * type.  (We cannot reliably look up the base type here, since +		 * getTypes may not have processed it yet.) +		 */  	}  	/* dump only types in dumpable namespaces */ -	else if (!tyinfo->dobj.namespace->dobj.dump) +	if (!tyinfo->dobj.namespace->dobj.dump)  		tyinfo->dobj.dump = false;  	/* skip undefined placeholder types */ | 
