mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-02-23 19:39:53 +08:00
- Handle overridden attrs as per discussions 2-Apr-2001
- Dump CHECK constraints in OID order
This commit is contained in:
parent
08bf4d797b
commit
ab17fd190c
@ -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 @@
|
|||||||
* 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 @@
|
|||||||
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)
|
|||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
*/
|
*/
|
||||||
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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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;
|
|||||||
|
|
||||||
#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 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
" 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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
* 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
|
|||||||
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 */
|
||||||
|
Loading…
Reference in New Issue
Block a user