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:

Previous
From: David Fetter
Date:
Subject: Re: [BUGS] BUG #2221: Bad delimiters allowed in COPY ... TO
Next
From: Neil Conway
Date:
Subject: Re: [BUGS] BUG #2221: Bad delimiters allowed in COPY ...