Commit ab17fd19 authored by Philip Warner's avatar Philip Warner

- Handle overridden attrs as per discussions 2-Apr-2001

- Dump CHECK constraints in OID order
parent 08bf4d79
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.54 2001/03/22 04:00:11 momjian Exp $ * $Header: /cvsroot/pgsql/src/bin/pg_dump/common.c,v 1.55 2001/04/03 08:52:59 pjw Exp $
* *
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2 * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
* *
...@@ -21,6 +21,10 @@ ...@@ -21,6 +21,10 @@
* string to return - formatted type, or base type. If the base type * string to return - formatted type, or base type. If the base type
* is returned then fmtId is called on the string. * is returned then fmtId is called on the string.
* *
* Modifications 4-Apr-2001 - pjw@rhyme.com.au
* - Changed flagInhAttrs to check all parent tables for overridden settings
* and set flags accordingly.
*
* BEWARE: Since fmtId uses a static buffer, using 'useBaseTypeName' on more * BEWARE: Since fmtId uses a static buffer, using 'useBaseTypeName' on more
* than one call in a line will cause problems. * than one call in a line will cause problems.
* *
...@@ -39,7 +43,8 @@ ...@@ -39,7 +43,8 @@
static char **findParentsByOid(TableInfo *tbinfo, int numTables, static char **findParentsByOid(TableInfo *tbinfo, int numTables,
InhInfo *inhinfo, int numInherits, InhInfo *inhinfo, int numInherits,
const char *oid, const char *oid,
int *numParents); int *numParents,
int (**parentIndices)[]);
static int findTableByOid(TableInfo *tbinfo, int numTables, const char *oid); static int findTableByOid(TableInfo *tbinfo, int numTables, const char *oid);
static void flagInhAttrs(TableInfo *tbinfo, int numTables, static void flagInhAttrs(TableInfo *tbinfo, int numTables,
InhInfo *inhinfo, int numInherits); InhInfo *inhinfo, int numInherits);
...@@ -122,7 +127,7 @@ findOprByOid(OprInfo *oprinfo, int numOprs, const char *oid) ...@@ -122,7 +127,7 @@ findOprByOid(OprInfo *oprinfo, int numOprs, const char *oid)
/* /*
* findParentsByOid * findParentsByOid
* given the oid of a class, return the names of its parent classes * given the oid of a class, return the names of its parent classes
* and assign the number of parents to the last argument. * and assign the number of parents, and parent indices to the last arguments.
* *
* *
* returns NULL if none * returns NULL if none
...@@ -131,7 +136,7 @@ findOprByOid(OprInfo *oprinfo, int numOprs, const char *oid) ...@@ -131,7 +136,7 @@ findOprByOid(OprInfo *oprinfo, int numOprs, const char *oid)
static char ** static char **
findParentsByOid(TableInfo *tblinfo, int numTables, findParentsByOid(TableInfo *tblinfo, int numTables,
InhInfo *inhinfo, int numInherits, const char *oid, InhInfo *inhinfo, int numInherits, const char *oid,
int *numParentsPtr) int *numParentsPtr, int (**parentIndices)[])
{ {
int i, int i,
j; j;
...@@ -152,6 +157,7 @@ findParentsByOid(TableInfo *tblinfo, int numTables, ...@@ -152,6 +157,7 @@ findParentsByOid(TableInfo *tblinfo, int numTables,
if (numParents > 0) if (numParents > 0)
{ {
result = (char **) malloc(sizeof(char *) * numParents); result = (char **) malloc(sizeof(char *) * numParents);
(*parentIndices) = malloc(sizeof(int) * numParents);
j = 0; j = 0;
for (i = 0; i < numInherits; i++) for (i = 0; i < numInherits; i++)
{ {
...@@ -169,13 +175,17 @@ findParentsByOid(TableInfo *tblinfo, int numTables, ...@@ -169,13 +175,17 @@ findParentsByOid(TableInfo *tblinfo, int numTables,
oid); oid);
exit(2); exit(2);
} }
(**parentIndices)[j] = parentInd;
result[j++] = tblinfo[parentInd].relname; result[j++] = tblinfo[parentInd].relname;
} }
} }
return result; return result;
} }
else else
{
(*parentIndices) = NULL;
return NULL; return NULL;
}
} }
/* /*
...@@ -415,6 +425,14 @@ flagInhAttrs(TableInfo *tblinfo, int numTables, ...@@ -415,6 +425,14 @@ flagInhAttrs(TableInfo *tblinfo, int numTables,
j, j,
k; k;
int parentInd; int parentInd;
int inhAttrInd;
int (*parentIndices)[];
bool foundAttr; /* Attr was found in a parent */
bool foundNotNull; /* Attr was NOT NULL in a parent */
bool defaultsMatch; /* All non-empty defaults match */
bool defaultsFound; /* Found a default in a parent */
char *attrDef;
char *inhDef;
/* /*
* we go backwards because the tables in tblinfo are in OID order, * we go backwards because the tables in tblinfo are in OID order,
...@@ -423,27 +441,97 @@ flagInhAttrs(TableInfo *tblinfo, int numTables, ...@@ -423,27 +441,97 @@ flagInhAttrs(TableInfo *tblinfo, int numTables,
*/ */
for (i = numTables - 1; i >= 0; i--) for (i = numTables - 1; i >= 0; i--)
{ {
/* Sequences can never have parents, and attr info is undefined */
if (tblinfo[i].sequence)
continue;
/* Get all the parents and their indexes. */
tblinfo[i].parentRels = findParentsByOid(tblinfo, numTables, tblinfo[i].parentRels = findParentsByOid(tblinfo, numTables,
inhinfo, numInherits, inhinfo, numInherits,
tblinfo[i].oid, tblinfo[i].oid,
&tblinfo[i].numParents); &tblinfo[i].numParents,
for (k = 0; k < tblinfo[i].numParents; k++) &parentIndices);
/*
* 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 attr with the same name, then only dump it if:
*
* - it is NOT NULL and zero parents are NOT NULL
* OR
* - 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.
*/
for (j = 0; j < tblinfo[i].numatts; j++)
{ {
parentInd = findTableByName(tblinfo, numTables, foundAttr = false;
tblinfo[i].parentRels[k]); foundNotNull = false;
if (parentInd < 0) defaultsMatch = true;
defaultsFound = false;
attrDef = tblinfo[i].adef_expr[j];
for (k = 0; k < tblinfo[i].numParents; k++)
{ {
/* shouldn't happen unless findParentsByOid is broken */ parentInd = (*parentIndices)[k];
fprintf(stderr, "failed sanity check, table %s not found by flagInhAttrs\n",
tblinfo[i].parentRels[k]); if (parentInd < 0)
exit(2); {
} /* shouldn't happen unless findParentsByOid is broken */
for (j = 0; j < tblinfo[i].numatts; j++) fprintf(stderr, "failed sanity check, table %s not found by flagInhAttrs\n",
tblinfo[i].parentRels[k]);
exit(2);
};
inhAttrInd = strInArray(tblinfo[i].attnames[j],
tblinfo[parentInd].attnames,
tblinfo[parentInd].numatts);
if (inhAttrInd != -1)
{
foundAttr = true;
foundNotNull |= tblinfo[parentInd].notnull[inhAttrInd];
if (attrDef != NULL) /* It we have a default, check parent */
{
inhDef = tblinfo[parentInd].adef_expr[inhAttrInd];
if (inhDef != NULL)
{
defaultsFound = true;
defaultsMatch &= (strcmp(attrDef, inhDef) == 0);
};
};
};
};
/*
* Based on the scan of the parents, decide if we
* can rely on the inherited attr
*/
if (foundAttr) /* Attr was inherited */
{ {
if (strInArray(tblinfo[i].attnames[j], /* Set inherited flag by default */
tblinfo[parentInd].attnames, tblinfo[i].inhAttrs[j] = 1;
tblinfo[parentInd].numatts) != -1) tblinfo[i].inhAttrDef[j] = 1;
tblinfo[i].inhAttrs[j] = 1; tblinfo[i].inhNotNull[j] = 1;
/* Clear it if attr had a default, but parents did not, or mismatch */
if ( (attrDef != NULL) && (!defaultsFound || !defaultsMatch) )
{
tblinfo[i].inhAttrs[j] = 0;
tblinfo[i].inhAttrDef[j] = 0;
}
/* Clear it if NOT NULL and none of the parents were NOT NULL */
if (tblinfo[i].notnull[j] && !foundNotNull)
{
tblinfo[i].inhAttrs[j] = 0;
tblinfo[i].inhNotNull[j] = 0;
}
} }
} }
} }
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.28 2001/04/01 05:42:51 pjw Exp $ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_backup_archiver.h,v 1.29 2001/04/03 08:52:59 pjw Exp $
* *
* Modifications - 28-Jun-2000 - pjw@rhyme.com.au * Modifications - 28-Jun-2000 - pjw@rhyme.com.au
* - Initial version. * - Initial version.
...@@ -68,7 +68,7 @@ typedef z_stream *z_streamp; ...@@ -68,7 +68,7 @@ typedef z_stream *z_streamp;
#define K_VERS_MAJOR 1 #define K_VERS_MAJOR 1
#define K_VERS_MINOR 5 #define K_VERS_MINOR 5
#define K_VERS_REV 0 #define K_VERS_REV 1
/* Data block types */ /* Data block types */
#define BLK_DATA 1 #define BLK_DATA 1
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.198 2001/04/01 05:42:51 pjw Exp $ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.199 2001/04/03 08:52:59 pjw Exp $
* *
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb * Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
* *
...@@ -1603,6 +1603,10 @@ clearTableInfo(TableInfo *tblinfo, int numTables) ...@@ -1603,6 +1603,10 @@ clearTableInfo(TableInfo *tblinfo, int numTables)
free((int *) tblinfo[i].atttypmod); free((int *) tblinfo[i].atttypmod);
if (tblinfo[i].inhAttrs) if (tblinfo[i].inhAttrs)
free((int *) tblinfo[i].inhAttrs); free((int *) tblinfo[i].inhAttrs);
if (tblinfo[i].inhAttrDef)
free((int *) tblinfo[i].inhAttrDef);
if (tblinfo[i].inhNotNull)
free((int *) tblinfo[i].inhNotNull);
if (tblinfo[i].attnames) if (tblinfo[i].attnames)
free(tblinfo[i].attnames); free(tblinfo[i].attnames);
if (tblinfo[i].atttypedefns) if (tblinfo[i].atttypedefns)
...@@ -2138,7 +2142,8 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs) ...@@ -2138,7 +2142,8 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
" where i.inhrelid = pg_relcheck.rcrelid " " where i.inhrelid = pg_relcheck.rcrelid "
" and c.rcname = pg_relcheck.rcname " " and c.rcname = pg_relcheck.rcname "
" and c.rcsrc = pg_relcheck.rcsrc " " and c.rcsrc = pg_relcheck.rcsrc "
" and c.rcrelid = i.inhparent) ", " and c.rcrelid = i.inhparent) "
" Order By oid ",
tblinfo[i].oid); tblinfo[i].oid);
res2 = PQexec(g_conn, query->data); res2 = PQexec(g_conn, query->data);
if (!res2 || if (!res2 ||
...@@ -2656,6 +2661,8 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2656,6 +2661,8 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
tblinfo[i].typnames = (char **) malloc(ntups * sizeof(char *)); tblinfo[i].typnames = (char **) malloc(ntups * sizeof(char *));
tblinfo[i].atttypmod = (int *) malloc(ntups * sizeof(int)); tblinfo[i].atttypmod = (int *) malloc(ntups * sizeof(int));
tblinfo[i].inhAttrs = (int *) malloc(ntups * sizeof(int)); tblinfo[i].inhAttrs = (int *) malloc(ntups * sizeof(int));
tblinfo[i].inhAttrDef = (int *) malloc(ntups * sizeof(int));
tblinfo[i].inhNotNull = (int *) malloc(ntups * sizeof(int));
tblinfo[i].notnull = (bool *) malloc(ntups * sizeof(bool)); tblinfo[i].notnull = (bool *) malloc(ntups * sizeof(bool));
tblinfo[i].adef_expr = (char **) malloc(ntups * sizeof(char *)); tblinfo[i].adef_expr = (char **) malloc(ntups * sizeof(char *));
tblinfo[i].parentRels = NULL; tblinfo[i].parentRels = NULL;
...@@ -2678,6 +2685,9 @@ getTableAttrs(TableInfo *tblinfo, int numTables) ...@@ -2678,6 +2685,9 @@ getTableAttrs(TableInfo *tblinfo, int numTables)
tblinfo[i].atttypmod[j] = atoi(PQgetvalue(res, j, i_atttypmod)); tblinfo[i].atttypmod[j] = atoi(PQgetvalue(res, j, i_atttypmod));
tblinfo[i].inhAttrs[j] = 0; /* this flag is set in tblinfo[i].inhAttrs[j] = 0; /* this flag is set in
* flagInhAttrs() */ * flagInhAttrs() */
tblinfo[i].inhAttrDef[j] = 0;
tblinfo[i].inhNotNull[j] = 0;
tblinfo[i].notnull[j] = (PQgetvalue(res, j, i_attnotnull)[0] == 't') ? true : false; tblinfo[i].notnull[j] = (PQgetvalue(res, j, i_attnotnull)[0] == 't') ? true : false;
if (PQgetvalue(res, j, i_atthasdef)[0] == 't') if (PQgetvalue(res, j, i_atthasdef)[0] == 't')
{ {
...@@ -3829,12 +3839,12 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables, ...@@ -3829,12 +3839,12 @@ dumpTables(Archive *fout, TableInfo *tblinfo, int numTables,
tblinfo[i].atttypedefns[j]); tblinfo[i].atttypedefns[j]);
/* Default value */ /* Default value */
if (tblinfo[i].adef_expr[j] != NULL) if (tblinfo[i].adef_expr[j] != NULL && tblinfo[i].inhAttrDef[j] == 0)
appendPQExpBuffer(q, " DEFAULT %s", appendPQExpBuffer(q, " DEFAULT %s",
tblinfo[i].adef_expr[j]); tblinfo[i].adef_expr[j]);
/* Not Null constraint */ /* Not Null constraint */
if (tblinfo[i].notnull[j]) if (tblinfo[i].notnull[j] && tblinfo[i].inhNotNull[j] == 0)
appendPQExpBuffer(q, " NOT NULL"); appendPQExpBuffer(q, " NOT NULL");
actual_atts++; actual_atts++;
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2001, 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.60 2001/03/23 04:49:56 momjian Exp $ * $Id: pg_dump.h,v 1.61 2001/04/03 08:52:59 pjw Exp $
* *
* Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2 * Modifications - 6/12/96 - dave@bensoft.com - version 1.13.dhb.2
* *
...@@ -93,6 +93,8 @@ typedef struct _tableInfo ...@@ -93,6 +93,8 @@ typedef struct _tableInfo
int *inhAttrs; /* an array of flags, one for each int *inhAttrs; /* an array of flags, one for each
* attribute if the value is 1, then this * attribute if the value is 1, then this
* attribute is an inherited attribute */ * attribute is an inherited attribute */
int *inhAttrDef; /* Flags indicating if attrdef is inherited */
int *inhNotNull; /* Flags indicating if NOT NULL in inherited */
char **attnames; /* the attribute names */ char **attnames; /* the attribute names */
char **attoids; /* oids of the various attributes */ char **attoids; /* oids of the various attributes */
char **atttypedefns; /* formatted column type definitions */ char **atttypedefns; /* formatted column type definitions */
......
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