diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2014-10-17 12:49:00 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2014-10-17 12:49:00 -0400 |
commit | 5c38a1d4ecce849b1e105f59ccca5a926181e4f0 (patch) | |
tree | 19d95c6f5d3caf2c4724c8f6cfc789518abe497e | |
parent | 7584649a1c58029a83a7a57d74cedcf1af434c97 (diff) |
Fix core dump in pg_dump --binary-upgrade on zero-column composite type.
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.
-rw-r--r-- | src/bin/pg_dump/pg_dump.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 089f77ab34a..1e8f089224c 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -9273,7 +9273,6 @@ dumpCompositeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo) int i_attalign; int i_attisdropped; int i_attcollation; - int i_typrelid; int i; int actual_atts; @@ -9294,8 +9293,7 @@ dumpCompositeType(Archive *fout, DumpOptions *dopt, 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 " @@ -9313,8 +9311,7 @@ dumpCompositeType(Archive *fout, DumpOptions *dopt, 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 " @@ -9332,15 +9329,12 @@ dumpCompositeType(Archive *fout, DumpOptions *dopt, TypeInfo *tyinfo) i_attalign = PQfnumber(res, "attalign"); i_attisdropped = PQfnumber(res, "attisdropped"); i_attcollation = PQfnumber(res, "attcollation"); - i_typrelid = PQfnumber(res, "typrelid"); if (dopt->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)); |