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