From: | "Hiroshi Inoue" <Inoue(at)tpf(dot)co(dot)jp> |
---|---|
To: | "pgsql-hackers" <pgsql-hackers(at)postgreSQL(dot)org> |
Subject: | SELECT FOR UPDATE breaks unique constraint |
Date: | 2000-06-26 00:25:02 |
Message-ID: | 000a01bfdf04$f841fa80$2801007e@tpf.co.jp |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi all,
The following phenomenon has just been reported by
Mikage Sawartari in Japan.
mikage=# CREATE TABLE test (id INTEGER);
CREATE
mikage=# CREATE UNIQUE INDEX test_id_ub ON test (id);
CREATE
mikage=# INSERT INTO test VALUES (1);
INSERT 18828 1
mikage=# INSERT INTO test VALUES (1);
ERROR: Cannot insert a duplicate key into unique index test_id_ub
mikage=# begin;
BEGIN
mikage=# SELECT * FROM test FOR UPDATE;
id
----
1
(1 row)
mikage=# INSERT INTO test VALUES (1);
INSERT 18831 1
mikage=# commit;
COMMIT
mikage=# SELECT * FROM test;
id
----
1
1
(2 rows)
HeapTupleSatisfiesDirty() seems to neglect the check about HEAP_MARKED_
FOR_UPDATE in a place. After applying the following patch,unique constraint
works well in my environment,
Comments ?
Index: utils/time/tqual.c
===================================================================
RCS file: /home/cvs/pgcurrent/src/backend/utils/time/tqual.c,v
retrieving revision 1.5
diff -c -r1.5 tqual.c
*** utils/time/tqual.c 2000/01/26 09:59:05 1.5
--- utils/time/tqual.c 2000/06/26 00:13:01
***************
*** 441,447 ****
--- 441,451 ----
}
if (TransactionIdIsCurrentTransactionId(tuple->t_xmax))
+ {
+ if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
+ return true;
return false;
+ }
if (!TransactionIdDidCommit(tuple->t_xmax))
{
Regards.
Hiroshi Inoue
Inoue(at)tpf(dot)co(dot)jp
From | Date | Subject | |
---|---|---|---|
Next Message | Peter Eisentraut | 2000-06-26 01:41:12 | .exe extension on Windows |
Previous Message | Oliver Elphick | 2000-06-25 22:26:16 | TRUNCATE violates Referential Integrity |