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.
This commit is contained in:
parent
3276e911d1
commit
0dd0e289c7
@ -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,
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user