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: