Hi !
My system is  i686/Linux Mandrake 7.0/Postgresql v-7.0.2.
I found a bug in the sql command ALTER TABLE ADD CONSTRAINT..., when I tried to add a 
composite foreign key constraint 
(a FK with more than one attribute). The problem is in the file identified by 
$Header: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/command.c,v 1.71 
2000/04/12 17:14:57 momjian Exp $ 
in the code lines #1139 to #1150, when the function AlterTableAddConstraint() tries to 
construct the vector of the triggerīs tgargs.
>From the position 4 and forward, it must collect the pairs of fk_attrs and pk_attrs 
>(interleaved), but the current code put first all 
fk_attrs and then all the pk_attrs, leading to an error.
I fixed the bug and tested the update and now it works well. I send you a "diff -c 
command.c command.fixed.c" (with the diff : 
GNU diffutils version 2.7) and the output is:

*** command.c           Sun May  6 21:13:06 2001
--- command.fixed.c     Mon Jul  9 19:58:21 2001
***************
*** 19,24 ****
--- 19,25 ----
   *      manipulating code in the commands/ directory, should go
   *      someplace closer to the lib/catalog code.
   *
+  *
   *-------------------------------------------------------------------------
   */
  #include "postgres.h"
***************
*** 1138,1152 ****
                                {
                                        Ident      *fk_at = lfirst(list);
  
!                                       trig.tgargs[count++] = fk_at->name;
                                }
                                foreach(list, fkconstraint->pk_attrs)
                                {
                                        Ident      *pk_at = lfirst(list);
  
!                                       trig.tgargs[count++] = pk_at->name;
                                }
!                               trig.tgnargs = count;
  
                                scan = heap_beginscan(rel, false, SnapshotNow, 0, 
NULL);
                                AssertState(scan != NULL);
--- 1139,1156 ----
                                {
                                        Ident      *fk_at = lfirst(list);
  
!                                       trig.tgargs[count] = fk_at->name;
!                                       count+=2;
                                }
+                               count = 5;
                                foreach(list, fkconstraint->pk_attrs)
                                {
                                        Ident      *pk_at = lfirst(list);
  
!                                       trig.tgargs[count] = pk_at->name;
!                                       count+=2;
                                }
!                               trig.tgnargs = (count-1);
  
                                scan = heap_beginscan(rel, false, SnapshotNow, 0, 
NULL);
                                AssertState(scan != NULL);
***************
*** 1220,1223 ****
        LockRelation(rel, lockstmt->mode);
  
        heap_close(rel, NoLock);        /* close rel, keep lock */
! }
--- 1224,1227 ----
        LockRelation(rel, lockstmt->mode);
  
        heap_close(rel, NoLock);        /* close rel, keep lock */
! } 


I wish it would help you. If itīs necessary, drop me a line.  Regards
                                              Jose Luis Ozzano.

(P.D.: I attached this same messaje, edited in LINUX, because yo may have trouble 
reading it)

Hi !
My system is  i686/Linux Mandrake 7.0/Postgresql v-7.0.2.
I found a bug in the sql command ALTER TABLE ADD CONSTRAINT..., when I tried to add a composite 
foreign key constraint (a FK with more than one attribute). The problem is in the file identified by 
$Header: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/command.c,v 1.71 2000/04/12 17:14:57 momjian Exp $ 
in the code lines #1139 to #1150, when the function AlterTableAddConstraint() tries to construct the 
vector of the triggerīs tgargs. From the position 4 and forward, it must collect the pairs of fk_attrs 
and pk_attrs (interleaved), but the current code put first all fk_attrs and then all the pk_attrs, 
leading to an error. I fixed the bug and tested the update and now it works well. I send you a 
"diff -c command.c command.fixed.c" (with the diff : GNU diffutils version 2.7) and the output is:

*** command.c		Sun May  6 21:13:06 2001
--- command.fixed.c	Mon Jul  9 19:58:21 2001
***************
*** 19,24 ****
--- 19,25 ----
   *	  manipulating code in the commands/ directory, should go
   *	  someplace closer to the lib/catalog code.
   *
+  *
   *-------------------------------------------------------------------------
   */
  #include "postgres.h"
***************
*** 1138,1152 ****
  				{
  					Ident	   *fk_at = lfirst(list);
  
! 					trig.tgargs[count++] = fk_at->name;
  				}
  				foreach(list, fkconstraint->pk_attrs)
  				{
  					Ident	   *pk_at = lfirst(list);
  
! 					trig.tgargs[count++] = pk_at->name;
  				}
! 				trig.tgnargs = count;
  
  				scan = heap_beginscan(rel, false, SnapshotNow, 0, NULL);
  				AssertState(scan != NULL);
--- 1139,1156 ----
  				{
  					Ident	   *fk_at = lfirst(list);
  
! 					trig.tgargs[count] = fk_at->name;
! 					count+=2;
  				}
+ 				count = 5;
  				foreach(list, fkconstraint->pk_attrs)
  				{
  					Ident	   *pk_at = lfirst(list);
  
! 					trig.tgargs[count] = pk_at->name;
! 					count+=2;
  				}
! 				trig.tgnargs = (count-1);
  
  				scan = heap_beginscan(rel, false, SnapshotNow, 0, NULL);
  				AssertState(scan != NULL);
***************
*** 1220,1223 ****
  	LockRelation(rel, lockstmt->mode);
  
  	heap_close(rel, NoLock);	/* close rel, keep lock */
! }
--- 1224,1227 ----
  	LockRelation(rel, lockstmt->mode);
  
  	heap_close(rel, NoLock);	/* close rel, keep lock */
! } 


I wish it would help you. If itīs necessary, drop me a line.  Regards
                                               Jose Luis Ozzano.



---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://www.postgresql.org/search.mpl

Reply via email to