Commit c3be085a authored by Tom Lane's avatar Tom Lane

Modify pg_dump to assume that a check constraint is inherited if its

name matches the name of any parent-table constraint, without looking
at the constraint text.  This is a not-very-bulletproof workaround for
the problem exhibited by Berend Tober last month.  We really ought to
record constraint inheritance status in pg_constraint, but it's looking
like that may not get done for 8.1 --- and even if it does, we will
need this kluge for dumping from older servers.
parent fc722403
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/bin/pg_dump/common.c,v 1.85 2004/12/31 22:03:07 pgsql Exp $ * $PostgreSQL: pgsql/src/bin/pg_dump/common.c,v 1.86 2005/06/27 02:17:47 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -347,8 +347,14 @@ flagInhAttrs(TableInfo *tblinfo, int numTables, ...@@ -347,8 +347,14 @@ flagInhAttrs(TableInfo *tblinfo, int numTables,
/* /*
* Check for inherited CHECK constraints. We assume a constraint * Check for inherited CHECK constraints. We assume a constraint
* is inherited if its expression matches the parent and the name * is inherited if its name matches the name of any constraint in
* is the same, *or* both names start with '$'. * the parent. Originally this code tried to compare the expression
* texts, but that can fail if the parent and child tables are in
* different schemas, because reverse-listing of function calls may
* produce different text (schema-qualified or not) depending on
* search path. We really need a more bulletproof way of detecting
* inherited constraints --- pg_constraint should record this
* explicitly!
*/ */
for (j = 0; j < tbinfo->ncheck; j++) for (j = 0; j < tbinfo->ncheck; j++)
{ {
...@@ -363,14 +369,9 @@ flagInhAttrs(TableInfo *tblinfo, int numTables, ...@@ -363,14 +369,9 @@ flagInhAttrs(TableInfo *tblinfo, int numTables,
parent = parents[k]; parent = parents[k];
for (l = 0; l < parent->ncheck; l++) for (l = 0; l < parent->ncheck; l++)
{ {
ConstraintInfo *pconstr; ConstraintInfo *pconstr = &(parent->checkexprs[l]);
pconstr = &(parent->checkexprs[l]); if (strcmp(pconstr->dobj.name, constr->dobj.name) == 0)
if (strcmp(pconstr->condef, constr->condef) != 0)
continue;
if (strcmp(pconstr->dobj.name, constr->dobj.name) == 0 ||
(pconstr->dobj.name[0] == '$' &&
constr->dobj.name[0] == '$'))
{ {
constr->coninherited = true; constr->coninherited = true;
break; break;
......
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