diff options
| author | Robert Haas | 2017-03-03 03:37:41 +0000 |
|---|---|---|
| committer | Robert Haas | 2017-03-03 03:39:52 +0000 |
| commit | 5a73e17317e91912b2755f7960d5bf31d374cf31 (patch) | |
| tree | 9df368817ebdf24e6eca7a2a47dbccdbc67808b0 /src/test | |
| parent | be6ed6451c693d9121d357996cbc21b06058b9c1 (diff) | |
Improve error reporting for tuple-routing failures.
Currently, the whole row is shown without column names. Instead,
adopt a style similar to _bt_check_unique() in ExecFindPartition()
and show the failing key: (key1, ...) = (val1, ...).
Amit Langote, per a complaint from Simon Riggs. Reviewed by me;
I also adjusted the grammar in one of the comments.
Discussion: http://postgr.es/m/9f9dc7ae-14f0-4a25-5485-964d9bfc19bd@lab.ntt.co.jp
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/insert.out | 38 | ||||
| -rw-r--r-- | src/test/regress/sql/insert.sql | 30 |
2 files changed, 64 insertions, 4 deletions
diff --git a/src/test/regress/expected/insert.out b/src/test/regress/expected/insert.out index 81af3ef497..397238332b 100644 --- a/src/test/regress/expected/insert.out +++ b/src/test/regress/expected/insert.out @@ -234,14 +234,14 @@ insert into part_ee_ff2 values ('ff', 11); -- fail insert into range_parted values ('a', 0); ERROR: no partition of relation "range_parted" found for row -DETAIL: Failing row contains (a, 0). +DETAIL: Partition key of the failing row contains (a, (b + 0)) = (a, 0). -- ok insert into range_parted values ('a', 1); insert into range_parted values ('a', 10); -- fail insert into range_parted values ('a', 20); ERROR: no partition of relation "range_parted" found for row -DETAIL: Failing row contains (a, 20). +DETAIL: Partition key of the failing row contains (a, (b + 0)) = (a, 20). -- ok insert into range_parted values ('b', 1); insert into range_parted values ('b', 10); @@ -265,10 +265,10 @@ insert into list_parted (a) values ('aA'); -- fail (partition of part_ee_ff not found in both cases) insert into list_parted values ('EE', 0); ERROR: no partition of relation "part_ee_ff" found for row -DETAIL: Failing row contains (EE, 0). +DETAIL: Partition key of the failing row contains (b) = (0). insert into part_ee_ff values ('EE', 0); ERROR: no partition of relation "part_ee_ff" found for row -DETAIL: Failing row contains (EE, 0). +DETAIL: Partition key of the failing row contains (b) = (0). -- ok insert into list_parted values ('EE', 1); insert into part_ee_ff values ('EE', 10); @@ -351,6 +351,10 @@ select tableoid::regclass, * from p; p11 | 1 | 2 (1 row) +-- check that proper message is shown after failure to route through p1 +insert into p (a, b) values (1, 5); +ERROR: no partition of relation "p1" found for row +DETAIL: Partition key of the failing row contains ((b + 0)) = (5). truncate p; alter table p add constraint check_b check (b = 3); -- check that correct input row is shown when constraint check_b fails on p11 @@ -386,5 +390,31 @@ with ins (a, b, c) as p4 | 1 | 30 | 39 (5 rows) +-- check that message shown after failure to find a partition shows the +-- appropriate key description (or none) in various situations +create table key_desc (a int, b int) partition by list ((a+0)); +create table key_desc_1 partition of key_desc for values in (1) partition by range (b); +create user someone_else; +grant select (a) on key_desc_1 to someone_else; +grant insert on key_desc to someone_else; +set role someone_else; +-- no key description is shown +insert into key_desc values (1, 1); +ERROR: no partition of relation "key_desc_1" found for row +reset role; +grant select (b) on key_desc_1 to someone_else; +set role someone_else; +-- key description (b)=(1) is now shown +insert into key_desc values (1, 1); +ERROR: no partition of relation "key_desc_1" found for row +DETAIL: Partition key of the failing row contains (b) = (1). +-- key description is not shown if key contains expression +insert into key_desc values (2, 1); +ERROR: no partition of relation "key_desc" found for row +reset role; +revoke all on key_desc from someone_else; +revoke all on key_desc_1 from someone_else; +drop role someone_else; +drop table key_desc, key_desc_1; -- cleanup drop table p, p1, p11, p12, p2, p3, p4; diff --git a/src/test/regress/sql/insert.sql b/src/test/regress/sql/insert.sql index 454e1ce2e7..4f19df5c25 100644 --- a/src/test/regress/sql/insert.sql +++ b/src/test/regress/sql/insert.sql @@ -215,6 +215,9 @@ alter table p attach partition p1 for values from (1, 2) to (1, 10); insert into p values (1, 2); select tableoid::regclass, * from p; +-- check that proper message is shown after failure to route through p1 +insert into p (a, b) values (1, 5); + truncate p; alter table p add constraint check_b check (b = 3); -- check that correct input row is shown when constraint check_b fails on p11 @@ -240,5 +243,32 @@ with ins (a, b, c) as (insert into p (b, a) select s.a, 1 from generate_series(2, 39) s(a) returning tableoid::regclass, *) select a, b, min(c), max(c) from ins group by a, b order by 1; +-- check that message shown after failure to find a partition shows the +-- appropriate key description (or none) in various situations +create table key_desc (a int, b int) partition by list ((a+0)); +create table key_desc_1 partition of key_desc for values in (1) partition by range (b); + +create user someone_else; +grant select (a) on key_desc_1 to someone_else; +grant insert on key_desc to someone_else; + +set role someone_else; +-- no key description is shown +insert into key_desc values (1, 1); + +reset role; +grant select (b) on key_desc_1 to someone_else; +set role someone_else; +-- key description (b)=(1) is now shown +insert into key_desc values (1, 1); + +-- key description is not shown if key contains expression +insert into key_desc values (2, 1); +reset role; +revoke all on key_desc from someone_else; +revoke all on key_desc_1 from someone_else; +drop role someone_else; +drop table key_desc, key_desc_1; + -- cleanup drop table p, p1, p11, p12, p2, p3, p4; |
