diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index a695485b5c9..66b10c2aa77 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -12,7 +12,7 @@ * by PostgreSQL * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.337 2003/07/25 19:37:21 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.338 2003/07/25 21:02:52 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -2371,6 +2371,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) j, k; PQExpBuffer q = createPQExpBuffer(); + int i_attnum; int i_attname; int i_atttypname; int i_atttypmod; @@ -2421,12 +2422,13 @@ getTableAttrs(TableInfo *tblinfo, int numTables) if (g_fout->remoteVersion >= 70300) { + /* need left join here to not fail on dropped columns ... */ appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, a.attstattarget, a.attstorage, t.typstorage, " - "a.attnotnull, a.atthasdef, a.attisdropped, a.attislocal, " - "pg_catalog.format_type(a.atttypid,a.atttypmod) as atttypname " - "from pg_catalog.pg_attribute a, pg_catalog.pg_type t " - "where a.atttypid = t.oid " - "and a.attrelid = '%s'::pg_catalog.oid " + "a.attnotnull, a.atthasdef, a.attisdropped, a.attislocal, " + "pg_catalog.format_type(t.oid,a.atttypmod) as atttypname " + "from pg_catalog.pg_attribute a left join pg_catalog.pg_type t " + "on a.atttypid = t.oid " + "where a.attrelid = '%s'::pg_catalog.oid " "and a.attnum > 0::pg_catalog.int2 " "order by a.attrelid, a.attnum", tbinfo->oid); @@ -2439,11 +2441,11 @@ getTableAttrs(TableInfo *tblinfo, int numTables) * been explicitly set or was just a default. */ appendPQExpBuffer(q, "SELECT a.attnum, a.attname, a.atttypmod, -1 as attstattarget, a.attstorage, t.typstorage, " - "a.attnotnull, a.atthasdef, false as attisdropped, null as attislocal, " - "format_type(a.atttypid,a.atttypmod) as atttypname " - "from pg_attribute a, pg_type t " - "where a.atttypid = t.oid " - "and a.attrelid = '%s'::oid " + "a.attnotnull, a.atthasdef, false as attisdropped, null as attislocal, " + "format_type(t.oid,a.atttypmod) as atttypname " + "from pg_attribute a left join pg_type t " + "on a.atttypid = t.oid " + "where a.attrelid = '%s'::oid " "and a.attnum > 0::int2 " "order by a.attrelid, a.attnum", tbinfo->oid); @@ -2451,7 +2453,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) else { /* format_type not available before 7.1 */ - appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, -1 as attstattarget, attstorage, 'p' as typstorage, " + appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, -1 as attstattarget, attstorage, attstorage as typstorage, " "attnotnull, atthasdef, false as attisdropped, null as attislocal, " "(select typname from pg_type where oid = atttypid) as atttypname " "from pg_attribute a " @@ -2471,6 +2473,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ntups = PQntuples(res); + i_attnum = PQfnumber(res, "attnum"); i_attname = PQfnumber(res, "attname"); i_atttypname = PQfnumber(res, "atttypname"); i_atttypmod = PQfnumber(res, "atttypmod"); @@ -2501,6 +2504,12 @@ getTableAttrs(TableInfo *tblinfo, int numTables) for (j = 0; j < ntups; j++) { + if (j+1 != atoi(PQgetvalue(res, j, i_attnum))) + { + write_msg(NULL, "invalid attribute numbering in table \"%s\"\n", + tbinfo->relname); + exit_nicely(); + } tbinfo->attnames[j] = strdup(PQgetvalue(res, j, i_attname)); tbinfo->atttypnames[j] = strdup(PQgetvalue(res, j, i_atttypname)); tbinfo->atttypmod[j] = atoi(PQgetvalue(res, j, i_atttypmod)); @@ -5410,7 +5419,7 @@ dumpOneTable(Archive *fout, TableInfo *tbinfo, TableInfo *g_tblinfo) /* * Dump per-column storage information. The statement is only dumped if - * the storage has been changed. + * the storage has been changed from the type's default. */ if(!tbinfo->attisdropped[j] && tbinfo->attstorage[j] != tbinfo->typstorage[j]) {