aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2011-10-18 17:11:01 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2011-10-18 17:11:01 -0400
commit35d6ce97e78be24eca29226b3b67ca9a3a1384fd (patch)
tree27318f9d49d1f5c94f7776392a8fa9ad44edea48 /src
parent8c1501b292895bb883eaf6663934e9f7c45b043d (diff)
downloadpostgresql-35d6ce97e78be24eca29226b3b67ca9a3a1384fd.tar.gz
postgresql-35d6ce97e78be24eca29226b3b67ca9a3a1384fd.zip
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')
-rw-r--r--src/bin/pg_dump/common.c2
-rw-r--r--src/bin/pg_dump/pg_dump.c26
2 files changed, 21 insertions, 7 deletions
diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c
index a631f64c36f..aa9c606969e 100644
--- a/src/bin/pg_dump/common.c
+++ b/src/bin/pg_dump/common.c
@@ -125,7 +125,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 9d0e3d671e3..fce9d3b9560 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -1093,8 +1093,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)
@@ -1103,19 +1106,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 */