diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2011-10-18 17:11:07 -0400 |
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2011-10-18 17:11:07 -0400 |
| commit | 015cda44cfc5e02ec7147ab55560bd14c74acf08 (patch) | |
| tree | 67fdcd6bba6f8cf12f6c51567fba1269800ab85e /src/bin/pg_dump/pg_dump.c | |
| parent | 9ca46f5bb67de41f524315e414ea57fdbd614111 (diff) | |
Fix pg_dump to dump casts between auto-generated types.
The heuristic for when to dump a cast failed for a cast between table
rowtypes, as reported by Frédéric Rejol. Fix it by setting
the "dump" flag for such a type the same way as the flag is set for the
underlying table or base type. This won't result in the auto-generated
type appearing in the output, since setting its objType to DO_DUMMY_TYPE
unconditionally suppresses that. But it will result in dumpCast doing what
was intended.
Back-patch to 8.3. The 8.2 code is rather different in this area, and it
doesn't seem worth any risk to fix a corner case that nobody has stumbled
on before.
Diffstat (limited to 'src/bin/pg_dump/pg_dump.c')
| -rw-r--r-- | src/bin/pg_dump/pg_dump.c | 26 |
1 files changed, 20 insertions, 6 deletions
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 */ |
