]> granicus.if.org Git - postgresql/commitdiff
Fix core dump in pg_dump --binary-upgrade on zero-column composite type.
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 17 Oct 2014 16:49:03 +0000 (12:49 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 17 Oct 2014 16:49:03 +0000 (12:49 -0400)
This reverts nearly all of commit 28f6cab61ab8958b1a7dfb019724687d92722538
in favor of just using the typrelid we already have in pg_dump's TypeInfo
struct for the composite type.  As coded, it'd crash if the composite type
had no attributes, since then the query would return no rows.

Back-patch to all supported versions.  It seems to not really be a problem
in 9.0 because that version rejects the syntax "create type t as ()", but
we might as well keep the logic similar in all affected branches.

Report and fix by Rushabh Lathia.

src/bin/pg_dump/pg_dump.c

index bbdc0c8213be4eb4c99a9f5c70b880c68ec6140a..7837b2104d6b8b74b334b23274e381426ad1d16d 100644 (file)
@@ -8978,7 +8978,6 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
        int                     i_attalign;
        int                     i_attisdropped;
        int                     i_attcollation;
-       int                     i_typrelid;
        int                     i;
        int                     actual_atts;
 
@@ -8999,8 +8998,7 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
                        "pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, "
                                                  "a.attlen, a.attalign, a.attisdropped, "
                                                  "CASE WHEN a.attcollation <> at.typcollation "
-                                                 "THEN a.attcollation ELSE 0 END AS attcollation, "
-                                                 "ct.typrelid "
+                                                 "THEN a.attcollation ELSE 0 END AS attcollation "
                                                  "FROM pg_catalog.pg_type ct "
                                "JOIN pg_catalog.pg_attribute a ON a.attrelid = ct.typrelid "
                                        "LEFT JOIN pg_catalog.pg_type at ON at.oid = a.atttypid "
@@ -9018,8 +9016,7 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
                appendPQExpBuffer(query, "SELECT a.attname, "
                        "pg_catalog.format_type(a.atttypid, a.atttypmod) AS atttypdefn, "
                                                  "a.attlen, a.attalign, a.attisdropped, "
-                                                 "0 AS attcollation, "
-                                                 "ct.typrelid "
+                                                 "0 AS attcollation "
                                         "FROM pg_catalog.pg_type ct, pg_catalog.pg_attribute a "
                                                  "WHERE ct.oid = '%u'::pg_catalog.oid "
                                                  "AND a.attrelid = ct.typrelid "
@@ -9037,15 +9034,12 @@ dumpCompositeType(Archive *fout, TypeInfo *tyinfo)
        i_attalign = PQfnumber(res, "attalign");
        i_attisdropped = PQfnumber(res, "attisdropped");
        i_attcollation = PQfnumber(res, "attcollation");
-       i_typrelid = PQfnumber(res, "typrelid");
 
        if (binary_upgrade)
        {
-               Oid                     typrelid = atooid(PQgetvalue(res, 0, i_typrelid));
-
                binary_upgrade_set_type_oids_by_type_oid(fout, q,
                                                                                                 tyinfo->dobj.catId.oid);
-               binary_upgrade_set_pg_class_oids(fout, q, typrelid, false);
+               binary_upgrade_set_pg_class_oids(fout, q, tyinfo->typrelid, false);
        }
 
        qtypname = pg_strdup(fmtId(tyinfo->dobj.name));