diff options
| author | Robert Haas | 2017-04-10 16:20:08 +0000 |
|---|---|---|
| committer | Robert Haas | 2017-04-10 16:20:08 +0000 |
| commit | c0a8ae7be392aa09dd7e148ff662013e8e148893 (patch) | |
| tree | c2c280cf4d22b8f4a056247fbce70db8d14f224b /src/test | |
| parent | 244f1c89070c1a661623bf1eaddf1307f8f598a3 (diff) | |
Fix reporting of violations in ExecConstraints, again.
We decided in f1b4c771ea74f42447dccaed42ffcdcccf3aa694 to pass the
original slot to ExecConstraints(), but that breaks when there are
BEFORE ROW triggers involved. So we need to do reverse-map the tuples
back to the original descriptor instead, as Amit originally proposed.
Amit Langote, reviewed by Ashutosh Bapat. One overlooked comment
fixed by me.
Discussion: http://postgr.es/m/b3a17254-6849-e542-2353-bde4e880b6a4@lab.ntt.co.jp
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/insert.out | 21 | ||||
| -rw-r--r-- | src/test/regress/sql/insert.sql | 21 |
2 files changed, 37 insertions, 5 deletions
diff --git a/src/test/regress/expected/insert.out b/src/test/regress/expected/insert.out index 7fafa982126..6f34b1c6406 100644 --- a/src/test/regress/expected/insert.out +++ b/src/test/regress/expected/insert.out @@ -354,11 +354,26 @@ ERROR: no partition of relation "mlparted1" found for row DETAIL: Partition key of the failing row contains ((b + 0)) = (5). truncate mlparted; alter table mlparted add constraint check_b check (b = 3); --- check that correct input row is shown when constraint check_b fails on mlparted11 --- after "(1, 2)" is routed to it +-- have a BR trigger modify the row such that the check_b is violated +create function mlparted11_trig_fn() +returns trigger AS +$$ +begin + NEW.b := 4; + return NEW; +end; +$$ +language plpgsql; +create trigger mlparted11_trig before insert ON mlparted11 + for each row execute procedure mlparted11_trig_fn(); +-- check that the correct row is shown when constraint check_b fails after +-- "(1, 2)" is routed to mlparted11 (actually "(1, 4)" would be shown due +-- to the BR trigger mlparted11_trig_fn) insert into mlparted values (1, 2); ERROR: new row for relation "mlparted11" violates check constraint "check_b" -DETAIL: Failing row contains (1, 2). +DETAIL: Failing row contains (1, 4). +drop trigger mlparted11_trig on mlparted11; +drop function mlparted11_trig_fn(); -- check that inserting into an internal partition successfully results in -- checking its partition constraint before inserting into the leaf partition -- selected by tuple-routing diff --git a/src/test/regress/sql/insert.sql b/src/test/regress/sql/insert.sql index f9c00705a22..020854c960e 100644 --- a/src/test/regress/sql/insert.sql +++ b/src/test/regress/sql/insert.sql @@ -217,9 +217,26 @@ insert into mlparted (a, b) values (1, 5); truncate mlparted; alter table mlparted add constraint check_b check (b = 3); --- check that correct input row is shown when constraint check_b fails on mlparted11 --- after "(1, 2)" is routed to it + +-- have a BR trigger modify the row such that the check_b is violated +create function mlparted11_trig_fn() +returns trigger AS +$$ +begin + NEW.b := 4; + return NEW; +end; +$$ +language plpgsql; +create trigger mlparted11_trig before insert ON mlparted11 + for each row execute procedure mlparted11_trig_fn(); + +-- check that the correct row is shown when constraint check_b fails after +-- "(1, 2)" is routed to mlparted11 (actually "(1, 4)" would be shown due +-- to the BR trigger mlparted11_trig_fn) insert into mlparted values (1, 2); +drop trigger mlparted11_trig on mlparted11; +drop function mlparted11_trig_fn(); -- check that inserting into an internal partition successfully results in -- checking its partition constraint before inserting into the leaf partition |
