From: | jozzano <jozzano(at)exa(dot)unicen(dot)edu(dot)ar> |
---|---|
To: | pgsql-hackers(at)postgresql(dot)org |
Subject: | BUG (fixed) in CREATE TABLE ADD CONSTRAINT...(v-7.0.2) |
Date: | 2001-07-20 09:27:19 |
Message-ID: | 28113844.995621240017.JavaMail.webmail@mail.exa.unicen.edu.ar |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
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 triggers 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 its 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)
Attachment | Content-Type | Size |
---|---|---|
A:bug to attach | text/x-chdr | 2.4 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | (::) Bob Ippolito | 2001-07-20 10:27:28 | problem with creating/dropping tables and plpgsql ? |
Previous Message | jozzano | 2001-07-20 09:23:16 | BUG (fixed) in CREATE TABLE ADD CONSTRAINT...(v-7.0.2) |