mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
> 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
This commit is contained in:
parent
d015dcbe4e
commit
ba8e20a6dd
@ -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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
{
|
{
|
||||||
/* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
* 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
|
|||||||
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 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user