Commit 0dd0e289 authored by Tom Lane's avatar Tom Lane

Fix ALTER COLUMN TYPE bug: it sometimes tried to drop UNIQUE or PRIMARY KEY

constraints before FOREIGN KEY constraints that depended on them.  Originally
reported by Neil Conway on 29-Jun-2005.  Patch by Nakano Yoshihisa.
parent 3276e911
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.176 2005/11/22 18:17:09 momjian Exp $ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.177 2006/01/30 16:18:58 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -4967,12 +4967,38 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, ...@@ -4967,12 +4967,38 @@ ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel,
case OCLASS_CONSTRAINT: case OCLASS_CONSTRAINT:
Assert(foundObject.objectSubId == 0); Assert(foundObject.objectSubId == 0);
if (!list_member_oid(tab->changedConstraintOids, foundObject.objectId)) if (!list_member_oid(tab->changedConstraintOids,
foundObject.objectId))
{ {
tab->changedConstraintOids = lappend_oid(tab->changedConstraintOids, char *defstring = pg_get_constraintdef_string(foundObject.objectId);
foundObject.objectId);
tab->changedConstraintDefs = lappend(tab->changedConstraintDefs, /*
pg_get_constraintdef_string(foundObject.objectId)); * Put NORMAL dependencies at the front of the list and
* AUTO dependencies at the back. This makes sure that
* foreign-key constraints depending on this column will
* be dropped before unique or primary-key constraints of
* the column; which we must have because the FK
* constraints depend on the indexes belonging to the
* unique constraints.
*/
if (foundDep->deptype == DEPENDENCY_NORMAL)
{
tab->changedConstraintOids =
lcons_oid(foundObject.objectId,
tab->changedConstraintOids);
tab->changedConstraintDefs =
lcons(defstring,
tab->changedConstraintDefs);
}
else
{
tab->changedConstraintOids =
lappend_oid(tab->changedConstraintOids,
foundObject.objectId);
tab->changedConstraintDefs =
lappend(tab->changedConstraintDefs,
defstring);
}
} }
break; break;
...@@ -5140,9 +5166,11 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab) ...@@ -5140,9 +5166,11 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab)
/* /*
* Now we can drop the existing constraints and indexes --- constraints * Now we can drop the existing constraints and indexes --- constraints
* first, since some of them might depend on the indexes. It should be * first, since some of them might depend on the indexes. In fact, we
* okay to use DROP_RESTRICT here, since nothing else should be depending * have to delete FOREIGN KEY constraints before UNIQUE constraints,
* on these objects. * but we already ordered the constraint list to ensure that would happen.
* It should be okay to use DROP_RESTRICT here, since nothing else should
* be depending on these objects.
*/ */
foreach(l, tab->changedConstraintOids) foreach(l, tab->changedConstraintOids)
{ {
......
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