Re: Patch for ALTER TABLE / TYPE - Mailing list pgsql-patches
| From | NAKANO Yoshihisa |
|---|---|
| Subject | Re: Patch for ALTER TABLE / TYPE |
| Date | |
| Msg-id | 43DD65DE.2050603@jp.fujitsu.com Whole thread Raw |
| In response to | Re: Patch for ALTER TABLE / TYPE (Tom Lane <tgl@sss.pgh.pa.us>) |
| Responses |
Re: Patch for ALTER TABLE / TYPE
|
| List | pgsql-patches |
Tom Lane wrote:
> After looking at the test case a bit, I have an alternate approach:
> constraints on the column will have DEPENDENCY_AUTO type, while
> constraints using the column will have DEPENDENCY_NORMAL type.
> Therefore, if we drop the NORMAL ones before the AUTO ones, that
> should be enough to fix it. This doesn't require much extra code,
> or any extra catalog searches, since the pg_depend record is already
> available in ATExecAlterColumnType where we need to decide whether
> to stick the item on the front or back of the list.
O.K. It seems nicer than my solution.
Please find the patch attached. I fixed the patch to decide the order
of the list by deptype of the pg_depend record.
Regards,
Nakano
*** postgresql-8.1.2-org/src/backend/commands/tablecmds.c 2005-11-23 03:23:07.000000000 +0900
--- postgresql-8.1.2/src/backend/commands/tablecmds.c 2006-01-30 09:43:13.000000000 +0900
***************
*** 4970,4979 ****
Assert(foundObject.objectSubId == 0);
if (!list_member_oid(tab->changedConstraintOids, foundObject.objectId))
{
! tab->changedConstraintOids = lappend_oid(tab->changedConstraintOids,
! foundObject.objectId);
! tab->changedConstraintDefs = lappend(tab->changedConstraintDefs,
! pg_get_constraintdef_string(foundObject.objectId));
}
break;
--- 4970,4996 ----
Assert(foundObject.objectSubId == 0);
if (!list_member_oid(tab->changedConstraintOids, foundObject.objectId))
{
! char *defstring = pg_get_constraintdef_string(foundObject.objectId);
!
! /* FOREIGN KEY constraints depend on the indexes which depend on
! * PRIMARY KEY constraints, so we need to append FOREIGN KEY
! * constraints ahead of PRIMARY KEY constraints. We decide this
! * by the dependency type.
! */
! 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;
***************
*** 5141,5149 ****
/*
* Now we can drop the existing constraints and indexes --- constraints
! * first, since some of them might depend on the indexes. It should be
! * okay to use DROP_RESTRICT here, since nothing else should be depending
! * on these objects.
*/
foreach(l, tab->changedConstraintOids)
{
--- 5158,5168 ----
/*
* Now we can drop the existing constraints and indexes --- constraints
! * first, since some of them might depend on the indexes. (FOREIGN KEY
! * constraints depend on the indexes of PRIMARY KEY constraints, but
! * these will have DEPENDENCY_NORMAL type and will be deleted before
! * PRIMARY KEY constraints.) It should be okay to use DROP_RESTRICT here,
! * since nothing else should be depending on these objects.
*/
foreach(l, tab->changedConstraintOids)
{
pgsql-patches by date: