BUG (fixed) in CREATE TABLE ADD CONSTRAINT...(v-7.0.2)

Поиск
Список
Период
Сортировка
От jozzano
Тема BUG (fixed) in CREATE TABLE ADD CONSTRAINT...(v-7.0.2)
Дата
Msg-id 22811077.995620996783.JavaMail.webmail@mail.exa.unicen.edu.ar
обсуждение исходный текст
Список 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
trigger�stgargs. 
From the position 4 and forward, it must collect the pairs of fk_attrs and pk_attrs (interleaved), but the current code
putfirst 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/catalogcode.  * 
+  *  *-------------------------------------------------------------------------  */ #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
LuisOzzano. 

(P.D.: I attached the messaje in a file edited in LINUX. Maybe you have problems to read the original text)

В списке pgsql-hackers по дате отправления:

Предыдущее
От: "Eduardo Stern"
Дата:
Сообщение: Re: Large queries - again...
Следующее
От: Justin Koivisto
Дата:
Сообщение: Re: All computers in the world MUST sync with ATOMIC clock before 12:00 AM 21 July 2001!!!