I am sending the review of this patch
I found the following
v Use <optional> tage in documentation
v Don’t modified existing test case add new one instead
v Comment in pg_constraint.c is extended make it short
v Error message can be more guider if it tells about general rule
v Wrong result in concurrency case
Step to produce the result
1. build with with --enable-cassert and with -DCATCACHE_FORCE_RELEASE=1
2. Run these commands as setup:
CREATE TABLE my_table1 (id integer, name text);
CREATE TABLE my_table2 (id integer);
3. CREATE FUNCTION my_deleteproc1() RETURNS trigger AS $$
begin
DELETE FROM my_table2 WHERE id=OLD.id;
RETURN NULL;
end;$$ LANGUAGE plpgsql;
4. INSERT INTO my_table1 VALUES(323, 'Alex');
INSERT INTO my_table1 VALUES(23, 'Teddy');
INSERT INTO my_table1 VALUES(38, 'Bob');
INSERT INTO my_table2 VALUES(323);
INSERT INTO my_table2 VALUES(23);
INSERT INTO my_table2 VALUES(38);
5. CREATE OR REPLACE TRIGGER my_regular_trigger AFTER DELETE ON my_table1
FOR EACH ROW
EXECUTE PROCEDURE my_deleteproc1();
6. Attach a debugger to your session set a breakpoint at ExecARDeleteTriggers
7. Run this in your session
DELETE FROM my_table1 WHERE id=323;
8. start another session and run:
CREATE OR REPLACE TRIGGER my_regular_trigger AFTER INSERT ON my_table1
9. exite the debugger to release the first session
and the result
postgres=# SELECT * FROM my_table1;
id | name
----+-------
23 | Teddy
38 | Bob
(2 rows)
postgres=# SELECT * FROM my_table2;
id
-----
323
23
38
(3 rows)
Id number 323 should not be there in my_table2;
Regards
Surafel
pgsql-hackers by date:
Соглашаюсь с условиями обработки персональных данных