Commit ba8e20a6 authored by Bruce Momjian's avatar Bruce Momjian

> Alvaro Herrera <alvherre@atentus.com> writes:

> > I'm looking at pg_dump/common.c:flagInhAttrs() and suspect that it can
> > be more or less rewritten completely, and probably should to get rigth
> > all the cases mentioned in the past attisinherited discussion.  Is this
> > desirable for 7.3?  It can probably be hacked around and the rewrite
> > kept for 7.4, but I think it will be much simpler after the rewrite.
>
> If it's a bug then it's fair game to fix in 7.3.  But keep in mind that
> pg_dump has to behave at least somewhat sanely when called against older
> servers ... will your rewrite behave reasonably if the server does not
> offer attinhcount values?

Nah.  I don't think it's worth it: I had forgotten that older versions
should be supported.  I just left the code as is and added a
version-specific test.

This patch allows pg_dump to dump correctly local definition of columns.
In particular,

CREATE TABLE p1 (f1 int, f2 int);
CREATE TABLE p2 (f1 int);
CREATE TABLE c () INHERITS (p1, p2);
ALTER TABLE ONLY p1 DROP COLUMN f1;
CREATE TABLE p3 (f1 int);
CREATE TABLE c2 (f1 int) INHERITS (p3);

Will be dumped as
CREATE TABLE p1 (f2 int);
CREATE TABLE p2 (f1 int);
CREATE TABLE c (f1 int) INHERITS (p1, p2);
CREATE TABLE c2 (f1 int) INHERITS (p3);

(Previous version will dump
CREATE TABLE c () INHERITS (p1, p2)
CREATE TABLE c2 () INHERITS (p3) )

Alvaro Herrera
parent d015dcbe
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.70 2002/09/04 20:31:34 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.71 2002/10/09 16:20:25 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -284,16 +284,18 @@ flagInhAttrs(TableInfo *tblinfo, int numTables, ...@@ -284,16 +284,18 @@ flagInhAttrs(TableInfo *tblinfo, int numTables,
if (numParents == 0) if (numParents == 0)
continue; /* nothing to see here, move along */ continue; /* nothing to see here, move along */
/* /*----------------------------------------------------------------
* For each attr, check the parent info: if no parent has an attr * For each attr, check the parent info: if no parent has an attr
* with the same name, then it's not inherited. If there *is* an * with the same name, then it's not inherited. If there *is* an
* attr with the same name, then only dump it if: * attr with the same name, then only dump it if:
* *
* - it is NOT NULL and zero parents are NOT NULL OR - it has a * - it is NOT NULL and zero parents are NOT NULL
* default value AND the default value does not match all parent * OR
* default values, or no parents specify a default. * - it has a default value AND the default value does not match
* all parent default values, or no parents specify a default.
* *
* See discussion on -hackers around 2-Apr-2001. * See discussion on -hackers around 2-Apr-2001.
*----------------------------------------------------------------
*/ */
for (j = 0; j < tblinfo[i].numatts; j++) for (j = 0; j < tblinfo[i].numatts; j++)
{ {
...@@ -359,6 +361,12 @@ flagInhAttrs(TableInfo *tblinfo, int numTables, ...@@ -359,6 +361,12 @@ flagInhAttrs(TableInfo *tblinfo, int numTables,
tblinfo[i].inhAttrs[j] = false; tblinfo[i].inhAttrs[j] = false;
tblinfo[i].inhNotNull[j] = false; tblinfo[i].inhNotNull[j] = false;
} }
/* Clear it if attr has local definition */
if (g_fout->remoteVersion >= 70300 && tblinfo[i].attislocal[j])
{
tblinfo[i].inhAttrs[j] = false;
}
} }
} }
} }
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.301 2002/09/24 23:14:25 tgl Exp $ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.302 2002/10/09 16:20:25 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -2356,6 +2356,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2356,6 +2356,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
int i_attnotnull; int i_attnotnull;
int i_atthasdef; int i_atthasdef;
int i_attisdropped; int i_attisdropped;
int i_attislocal;
PGresult *res; PGresult *res;
int ntups; int ntups;
bool hasdefaults; bool hasdefaults;
...@@ -2397,7 +2398,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2397,7 +2398,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
if (g_fout->remoteVersion >= 70300) if (g_fout->remoteVersion >= 70300)
{ {
appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, attstattarget, " appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, attstattarget, "
"attnotnull, atthasdef, attisdropped, " "attnotnull, atthasdef, attisdropped, attislocal, "
"pg_catalog.format_type(atttypid,atttypmod) as atttypname " "pg_catalog.format_type(atttypid,atttypmod) as atttypname "
"from pg_catalog.pg_attribute a " "from pg_catalog.pg_attribute a "
"where attrelid = '%s'::pg_catalog.oid " "where attrelid = '%s'::pg_catalog.oid "
...@@ -2413,7 +2414,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2413,7 +2414,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
* been explicitly set or was just a default. * been explicitly set or was just a default.
*/ */
appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, -1 as attstattarget, " appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, -1 as attstattarget, "
"attnotnull, atthasdef, false as attisdropped, " "attnotnull, atthasdef, false as attisdropped, null as attislocal, "
"format_type(atttypid,atttypmod) as atttypname " "format_type(atttypid,atttypmod) as atttypname "
"from pg_attribute a " "from pg_attribute a "
"where attrelid = '%s'::oid " "where attrelid = '%s'::oid "
...@@ -2425,7 +2426,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2425,7 +2426,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
{ {
/* format_type not available before 7.1 */ /* format_type not available before 7.1 */
appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, -1 as attstattarget, " appendPQExpBuffer(q, "SELECT attnum, attname, atttypmod, -1 as attstattarget, "
"attnotnull, atthasdef, false as attisdropped, " "attnotnull, atthasdef, false as attisdropped, null as attislocal, "
"(select typname from pg_type where oid = atttypid) as atttypname " "(select typname from pg_type where oid = atttypid) as atttypname "
"from pg_attribute a " "from pg_attribute a "
"where attrelid = '%s'::oid " "where attrelid = '%s'::oid "
...@@ -2451,6 +2452,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2451,6 +2452,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
i_attnotnull = PQfnumber(res, "attnotnull"); i_attnotnull = PQfnumber(res, "attnotnull");
i_atthasdef = PQfnumber(res, "atthasdef"); i_atthasdef = PQfnumber(res, "atthasdef");
i_attisdropped = PQfnumber(res, "attisdropped"); i_attisdropped = PQfnumber(res, "attisdropped");
i_attislocal = PQfnumber(res, "attislocal");
tbinfo->numatts = ntups; tbinfo->numatts = ntups;
tbinfo->attnames = (char **) malloc(ntups * sizeof(char *)); tbinfo->attnames = (char **) malloc(ntups * sizeof(char *));
...@@ -2458,6 +2460,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2458,6 +2460,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
tbinfo->atttypmod = (int *) malloc(ntups * sizeof(int)); tbinfo->atttypmod = (int *) malloc(ntups * sizeof(int));
tbinfo->attstattarget = (int *) malloc(ntups * sizeof(int)); tbinfo->attstattarget = (int *) malloc(ntups * sizeof(int));
tbinfo->attisdropped = (bool *) malloc(ntups * sizeof(bool)); tbinfo->attisdropped = (bool *) malloc(ntups * sizeof(bool));
tbinfo->attislocal = (bool *) malloc(ntups * sizeof(bool));
tbinfo->attisserial = (bool *) malloc(ntups * sizeof(bool)); tbinfo->attisserial = (bool *) malloc(ntups * sizeof(bool));
tbinfo->notnull = (bool *) malloc(ntups * sizeof(bool)); tbinfo->notnull = (bool *) malloc(ntups * sizeof(bool));
tbinfo->adef_expr = (char **) malloc(ntups * sizeof(char *)); tbinfo->adef_expr = (char **) malloc(ntups * sizeof(char *));
...@@ -2473,6 +2476,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2473,6 +2476,7 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
tbinfo->atttypmod[j] = atoi(PQgetvalue(res, j, i_atttypmod)); tbinfo->atttypmod[j] = atoi(PQgetvalue(res, j, i_atttypmod));
tbinfo->attstattarget[j] = atoi(PQgetvalue(res, j, i_attstattarget)); tbinfo->attstattarget[j] = atoi(PQgetvalue(res, j, i_attstattarget));
tbinfo->attisdropped[j] = (PQgetvalue(res, j, i_attisdropped)[0] == 't'); tbinfo->attisdropped[j] = (PQgetvalue(res, j, i_attisdropped)[0] == 't');
tbinfo->attislocal[j] = (PQgetvalue(res, j, i_attislocal)[0] == 't');
tbinfo->attisserial[j] = false; /* fix below */ tbinfo->attisserial[j] = false; /* fix below */
tbinfo->notnull[j] = (PQgetvalue(res, j, i_attnotnull)[0] == 't'); tbinfo->notnull[j] = (PQgetvalue(res, j, i_attnotnull)[0] == 't');
tbinfo->adef_expr[j] = NULL; /* fix below */ tbinfo->adef_expr[j] = NULL; /* fix below */
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: pg_dump.h,v 1.99 2002/09/04 20:31:35 momjian Exp $ * $Id: pg_dump.h,v 1.100 2002/10/09 16:20:25 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -129,6 +129,7 @@ typedef struct _tableInfo ...@@ -129,6 +129,7 @@ typedef struct _tableInfo
int *atttypmod; /* type-specific type modifiers */ int *atttypmod; /* type-specific type modifiers */
int *attstattarget; /* attribute statistics targets */ int *attstattarget; /* attribute statistics targets */
bool *attisdropped; /* true if attr is dropped; don't dump it */ bool *attisdropped; /* true if attr is dropped; don't dump it */
bool *attislocal; /* true if attr has local definition */
bool *attisserial; /* true if attr is serial or bigserial */ bool *attisserial; /* true if attr is serial or bigserial */
/* /*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment