@@ -777,7 +777,11 @@ begin
777777 end if;
778778
779779 if TG_OP = 'UPDATE' then
780- raise NOTICE 'OLD: %, NEW: %', OLD, NEW;
780+ if strpos(argstr, 'instead_of_when') > 0 then
781+ raise NOTICE 'instead_of_when fired';
782+ else
783+ raise NOTICE 'OLD: %, NEW: %', OLD, NEW;
784+ end if;
781785 UPDATE main_table SET a = NEW.a, b = NEW.b WHERE a = OLD.a AND b = OLD.b;
782786 if NOT FOUND then RETURN NULL; end if;
783787 RETURN NEW;
@@ -842,10 +846,6 @@ CREATE TRIGGER invalid_trig INSTEAD OF DELETE ON main_table
842846FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_del');
843847ERROR: "main_table" is a table
844848DETAIL: Tables cannot have INSTEAD OF triggers.
845- -- Don't support WHEN clauses with INSTEAD OF triggers
846- CREATE TRIGGER invalid_trig INSTEAD OF UPDATE ON main_view
847- FOR EACH ROW WHEN (OLD.a <> NEW.a) EXECUTE PROCEDURE view_trigger('instead_of_upd');
848- ERROR: INSTEAD OF triggers cannot have WHEN conditions
849849-- Don't support column-level INSTEAD OF triggers
850850CREATE TRIGGER invalid_trig INSTEAD OF UPDATE OF a ON main_view
851851FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_upd');
@@ -861,6 +861,9 @@ CREATE TRIGGER instead_of_update_trig INSTEAD OF UPDATE ON main_view
861861FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_upd');
862862CREATE TRIGGER instead_of_delete_trig INSTEAD OF DELETE ON main_view
863863FOR EACH ROW EXECUTE PROCEDURE view_trigger('instead_of_del');
864+ CREATE TRIGGER when_different_update INSTEAD OF UPDATE ON main_view
865+ FOR EACH ROW WHEN (OLD.a IS DISTINCT FROM NEW.a)
866+ EXECUTE PROCEDURE view_trigger('instead_of_when');
864867-- Valid BEFORE statement VIEW triggers
865868CREATE TRIGGER before_ins_stmt_trig BEFORE INSERT ON main_view
866869FOR EACH STATEMENT EXECUTE PROCEDURE view_trigger('before_view_ins_stmt');
@@ -957,18 +960,47 @@ UPDATE 1
957960UPDATE main_view SET b = 0 WHERE false;
958961NOTICE: main_view BEFORE UPDATE STATEMENT (before_view_upd_stmt)
959962NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
963+ UPDATE 0
964+ -- INSTEAD OF ... WHEN trigger fires.
965+ UPDATE main_view SET a = 23 WHERE a = 21 RETURNING *;
966+ NOTICE: main_view BEFORE UPDATE STATEMENT (before_view_upd_stmt)
967+ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd)
968+ NOTICE: OLD: (21,10), NEW: (23,10)
969+ NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT
970+ NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW
971+ NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW
972+ NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
973+ NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
974+ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_when)
975+ NOTICE: instead_of_when fired
976+ NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT
977+ NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
978+ NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
979+ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_upd)
980+ NOTICE: OLD: (21,32), NEW: (23,32)
981+ NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT
982+ NOTICE: trigger_func(after_upd_a_b_row) called: action = UPDATE, when = AFTER, level = ROW
983+ NOTICE: trigger_func(after_upd_b_row) called: action = UPDATE, when = AFTER, level = ROW
984+ NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
985+ NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
986+ NOTICE: main_view INSTEAD OF UPDATE ROW (instead_of_when)
987+ NOTICE: instead_of_when fired
988+ NOTICE: trigger_func(before_upd_a_stmt) called: action = UPDATE, when = BEFORE, level = STATEMENT
989+ NOTICE: trigger_func(after_upd_b_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
990+ NOTICE: trigger_func(after_upd_stmt) called: action = UPDATE, when = AFTER, level = STATEMENT
991+ NOTICE: main_view AFTER UPDATE STATEMENT (after_view_upd_stmt)
992+ a | b
993+ ---+---
994+ (0 rows)
995+
960996UPDATE 0
961997-- Delete from view using trigger
962998DELETE FROM main_view WHERE a IN (20,21);
963999NOTICE: main_view BEFORE DELETE STATEMENT (before_view_del_stmt)
9641000NOTICE: main_view INSTEAD OF DELETE ROW (instead_of_del)
965- NOTICE: OLD: (21,10)
966- NOTICE: main_view INSTEAD OF DELETE ROW (instead_of_del)
9671001NOTICE: OLD: (20,31)
968- NOTICE: main_view INSTEAD OF DELETE ROW (instead_of_del)
969- NOTICE: OLD: (21,32)
9701002NOTICE: main_view AFTER DELETE STATEMENT (after_view_del_stmt)
971- DELETE 3
1003+ DELETE 1
9721004DELETE FROM main_view WHERE a = 31 RETURNING a, b;
9731005NOTICE: main_view BEFORE DELETE STATEMENT (before_view_del_stmt)
9741006NOTICE: main_view INSTEAD OF DELETE ROW (instead_of_del)
@@ -998,6 +1030,7 @@ Triggers:
9981030 instead_of_delete_trig INSTEAD OF DELETE ON main_view FOR EACH ROW EXECUTE FUNCTION view_trigger('instead_of_del')
9991031 instead_of_insert_trig INSTEAD OF INSERT ON main_view FOR EACH ROW EXECUTE FUNCTION view_trigger('instead_of_ins')
10001032 instead_of_update_trig INSTEAD OF UPDATE ON main_view FOR EACH ROW EXECUTE FUNCTION view_trigger('instead_of_upd')
1033+ when_different_update INSTEAD OF UPDATE ON main_view FOR EACH ROW WHEN (old.a IS DISTINCT FROM new.a) EXECUTE FUNCTION view_trigger('instead_of_when')
10011034
10021035-- Test dropping view triggers
10031036DROP TRIGGER instead_of_insert_trig ON main_view;
@@ -1020,6 +1053,7 @@ Triggers:
10201053 before_ins_stmt_trig BEFORE INSERT ON main_view FOR EACH STATEMENT EXECUTE FUNCTION view_trigger('before_view_ins_stmt')
10211054 before_upd_stmt_trig BEFORE UPDATE ON main_view FOR EACH STATEMENT EXECUTE FUNCTION view_trigger('before_view_upd_stmt')
10221055 instead_of_update_trig INSTEAD OF UPDATE ON main_view FOR EACH ROW EXECUTE FUNCTION view_trigger('instead_of_upd')
1056+ when_different_update INSTEAD OF UPDATE ON main_view FOR EACH ROW WHEN (old.a IS DISTINCT FROM new.a) EXECUTE FUNCTION view_trigger('instead_of_when')
10231057
10241058DROP VIEW main_view;
10251059--
0 commit comments