diff options
| -rw-r--r-- | src/backend/access/transam/xact.c | 2 | ||||
| -rw-r--r-- | src/test/regress/expected/triggers.out | 28 | ||||
| -rw-r--r-- | src/test/regress/sql/triggers.sql | 25 |
3 files changed, 55 insertions, 0 deletions
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index 395650d6406..ef0fe7a5361 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -4624,6 +4624,8 @@ RollbackAndReleaseCurrentSubTransaction(void) AssertState(s->blockState == TBLOCK_SUBINPROGRESS || s->blockState == TBLOCK_INPROGRESS || s->blockState == TBLOCK_IMPLICIT_INPROGRESS || + s->blockState == TBLOCK_END || + s->blockState == TBLOCK_PREPARE || s->blockState == TBLOCK_STARTED); } diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out index 901ce8449ae..77003eeaff0 100644 --- a/src/test/regress/expected/triggers.out +++ b/src/test/regress/expected/triggers.out @@ -2467,6 +2467,34 @@ select * from parted; drop table parted; drop function parted_trigfunc(); +-- Test exception handling in a deferred constraint trigger at COMMIT. +create table deferred_trigger_test (a int); +create function deferred_trigger_func() returns trigger + language plpgsql as $$ +begin + perform 1 / 0; + return new; +exception when division_by_zero then + raise notice 'caught division_by_zero'; + return new; +end; +$$; +create constraint trigger deferred_trigger + after insert on deferred_trigger_test + deferrable initially deferred + for each row execute function deferred_trigger_func(); +begin; +insert into deferred_trigger_test values (1); +commit; +NOTICE: caught division_by_zero +select * from deferred_trigger_test; + a +--- + 1 +(1 row) + +drop table deferred_trigger_test; +drop function deferred_trigger_func(); -- -- Constraint triggers and partitioned tables create table parted_constr_ancestor (a int, b text) diff --git a/src/test/regress/sql/triggers.sql b/src/test/regress/sql/triggers.sql index d8e09e42124..e5332bfd416 100644 --- a/src/test/regress/sql/triggers.sql +++ b/src/test/regress/sql/triggers.sql @@ -1691,6 +1691,31 @@ select * from parted; drop table parted; drop function parted_trigfunc(); +-- Test exception handling in a deferred constraint trigger at COMMIT. +create table deferred_trigger_test (a int); +create function deferred_trigger_func() returns trigger + language plpgsql as $$ +begin + perform 1 / 0; + return new; +exception when division_by_zero then + raise notice 'caught division_by_zero'; + return new; +end; +$$; +create constraint trigger deferred_trigger + after insert on deferred_trigger_test + deferrable initially deferred + for each row execute function deferred_trigger_func(); + +begin; +insert into deferred_trigger_test values (1); +commit; +select * from deferred_trigger_test; + +drop table deferred_trigger_test; +drop function deferred_trigger_func(); + -- -- Constraint triggers and partitioned tables create table parted_constr_ancestor (a int, b text) |
