PFA patch patch for the master branch. On Thu, Oct 16, 2014 at 11:09 AM, Rushabh Lathia <rushabh.lat...@gmail.com> wrote:
> Hi All, > > pg_dump binary-upgrade fail with segmentation fault for type without > element. > > Consider the following testcase: > > rushabh@postgresql$ ./db/bin/psql postgres > psql (9.5devel) > Type "help" for help. > > postgres=# drop type typ; > DROP TYPE > postgres=# create type typ as (); > CREATE TYPE > postgres=# \q > rushabh@postgresql$ ./db/bin/pg_dump postgres --binary-upgrade > pg_dump: row number 0 is out of range 0..-1 > Segmentation fault (core dumped) > > Stake trace: > > (gdb) bt > #0 0x0000003a2cc375f2 in ____strtoull_l_internal () from /lib64/libc.so.6 > #1 0x0000000000417a08 in dumpCompositeType (fout=0x1365200, > tyinfo=0x13b1340) at pg_dump.c:9356 > #2 0x00000000004156a2 in dumpType (fout=0x1365200, tyinfo=0x13b1340) at > pg_dump.c:8449 > #3 0x0000000000414b08 in dumpDumpableObject (fout=0x1365200, > dobj=0x13b1340) at pg_dump.c:8135 > #4 0x00000000004041f8 in main (argc=3, argv=0x7fff838ff6e8) at > pg_dump.c:812 > > Into dumpCompositeType(), query fetch the elements for the composite type, > but in case there are no elements for the type then it returns zero rows. > In > the following code block: > > 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); > } > > it fetching the typrelid which require for binary_upgrade. But in case > query > is returning zero rows (for the composite type without element) is failing. > > Looking further into code I found that rather then fetching typrelid, we > can > use the already stored typrelid from TypeInfo structure. > > Following commit added code related to binary_upgrade: > > commit 28f6cab61ab8958b1a7dfb019724687d92722538 > Author: Bruce Momjian <br...@momjian.us> > Date: Wed Jan 6 05:18:18 2010 +0000 > > binary upgrade: > > Preserve relfilenodes for views and composite types --- even though we > don't store data in, them, they do consume relfilenodes. > > Bump catalog version. > > PFA patch to fix the issue. I think this need to fix in the back branch as > well > because its effecting pg_upgrade. Fix should backport till PG91, as on PG90 > it was not allowed to create type without element. > > postgres=# select version(); > > version > > ------------------------------------------------------------------------------------------------------------------- > PostgreSQL 9.0.18 on x86_64-unknown-linux-gnu, compiled by GCC gcc (GCC) > 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit > (1 row) > postgres=# create type typ as (); > ERROR: syntax error at or near ")" > LINE 1: create type typ as (); > ^ > > Regards, > Rushabh Lathia > www.EnterpriseDB.com > -- Rushabh Lathia
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index c56a4cb..c528577 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -9269,7 +9269,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; @@ -9290,8 +9289,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 " @@ -9309,8 +9307,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 " @@ -9328,15 +9325,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));
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers