The following bug has been logged on the website: Bug reference: 6632 Logged by: Ignas Mikalajunas Email address: ig...@pow.lt PostgreSQL version: 9.1.3 Operating system: Ubuntu 11.11 Description:
The snippet that reproduces the bug: drop schema public cascade; create schema public; -- Setup BEGIN; CREATE TABLE apps ( id bigserial NOT NULL, "type" varchar(32), primary key (id) ); CREATE TABLE content_items ( id bigserial NOT NULL, "type" varchar(32), app_id integer, wall_post_id integer, foreign key (app_id) references apps on delete cascade, foreign key (wall_post_id) references content_items on delete set null, primary key (id) ); CREATE OR REPLACE FUNCTION content_item_deleted_trigger() RETURNS trigger AS $$ BEGIN DELETE FROM content_items WHERE content_items.id = OLD.wall_post_id; RETURN OLD; END $$ LANGUAGE plpgsql; -- the problem is in this trigger, if I make it an "AFTER" it works as it should CREATE TRIGGER content_item_deleted_trigger BEFORE DELETE ON content_items FOR EACH ROW WHEN (OLD.wall_post_id is not null) EXECUTE PROCEDURE content_item_deleted_trigger(); COMMIT; -- End of schema setup BEGIN; INSERT INTO apps (type) VALUES ('basecamp'); INSERT INTO content_items (type, app_id, wall_post_id) VALUES ('wall_post', NULL, NULL); INSERT INTO content_items (type, app_id, wall_post_id) VALUES ('basecamp_post', 1, 1); COMMIT; -- End of setup BEGIN; DELETE FROM apps WHERE apps.id = 1; COMMIT; -- This select still sees 1 item that refers to an app that does not exist anymore BEGIN; SELECT count(*) from content_items; SELECT count(*) from apps; ROLLBACK; I think being able to generate rows that do not pass constraints on a table is a bug. -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs