postgres.git / summary / log / commit / refs

commit    58625e48a3fdfd64b0f8b9297c36d824a3ce8327
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Tue Oct 18 21:11:13 2011 +0000
First released in: 9.2.0, 8.3.17, 8.4.10, 9.0.6, 9.1.2

    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.


src/bin/pg_dump/common.c | 2 +- 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 7ab6ce889a7..fd7ce1d8f7d 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -129,7 +129,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 c5816aed0e6..831a80f2274 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -1013,8 +1013,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 *tinfo) @@ -1023,19 +1026,30 @@ selectDumpableType(TypeInfo *tinfo) if (OidIsValid(tinfo->typrelid) && tinfo->typrelkind != RELKIND_COMPOSITE_TYPE) { - tinfo->dobj.dump = false; + TableInfo *tytable = findTableByOid(tinfo->typrelid); + tinfo->dobj.objType = DO_DUMMY_TYPE; + if (tytable != NULL) + tinfo->dobj.dump = tytable->dobj.dump; + else + tinfo->dobj.dump = false; + return; } /* skip auto-generated array types */ - else if (tinfo->isArray) + if (tinfo->isArray) { - tinfo->dobj.dump = false; tinfo->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 (!tinfo->dobj.namespace->dobj.dump) + if (!tinfo->dobj.namespace->dobj.dump) tinfo->dobj.dump = false; /* skip undefined placeholder types */ [parent: 6d363e0d2f30]