Commit 7ecb7143 authored by Robert Haas's avatar Robert Haas

Fix improper NULL handling in list partitioning code.

The previous logic was wrong when the value was NULL but there was
no partition for NULL.

Amit Langote, reviewed by Jeevan Ladhe

Discussion: http://postgr.es/m/d64f8498-70eb-3c88-b56d-c54fd3b0500f@lab.ntt.co.jp
parent 8355a011
...@@ -1729,10 +1729,14 @@ get_partition_for_tuple(PartitionDispatch *pd, ...@@ -1729,10 +1729,14 @@ get_partition_for_tuple(PartitionDispatch *pd,
errmsg("range partition key of row contains null"))); errmsg("range partition key of row contains null")));
} }
if (partdesc->boundinfo->has_null && isnull[0]) /*
/* Tuple maps to the null-accepting list partition */ * A null partition key is only acceptable if null-accepting list
* partition exists.
*/
cur_index = -1;
if (isnull[0] && partdesc->boundinfo->has_null)
cur_index = partdesc->boundinfo->null_index; cur_index = partdesc->boundinfo->null_index;
else else if (!isnull[0])
{ {
/* Else bsearch in partdesc->boundinfo */ /* Else bsearch in partdesc->boundinfo */
bool equal = false; bool equal = false;
......
...@@ -365,6 +365,13 @@ DETAIL: Failing row contains (1, 2). ...@@ -365,6 +365,13 @@ DETAIL: Failing row contains (1, 2).
insert into mlparted1 (a, b) values (2, 3); insert into mlparted1 (a, b) values (2, 3);
ERROR: new row for relation "mlparted11" violates partition constraint ERROR: new row for relation "mlparted11" violates partition constraint
DETAIL: Failing row contains (3, 2). DETAIL: Failing row contains (3, 2).
-- check routing error through a list partitioned table when the key is null
create table lparted_nonullpart (a int, b char) partition by list (b);
create table lparted_nonullpart_a partition of lparted_nonullpart for values in ('a');
insert into lparted_nonullpart values (1);
ERROR: no partition of relation "lparted_nonullpart" found for row
DETAIL: Partition key of the failing row contains (b) = (null).
drop table lparted_nonullpart;
-- check that RETURNING works correctly with tuple-routing -- check that RETURNING works correctly with tuple-routing
alter table mlparted drop constraint check_b; alter table mlparted drop constraint check_b;
create table mlparted12 partition of mlparted1 for values from (5) to (10); create table mlparted12 partition of mlparted1 for values from (5) to (10);
......
...@@ -226,6 +226,12 @@ insert into mlparted values (1, 2); ...@@ -226,6 +226,12 @@ insert into mlparted values (1, 2);
-- selected by tuple-routing -- selected by tuple-routing
insert into mlparted1 (a, b) values (2, 3); insert into mlparted1 (a, b) values (2, 3);
-- check routing error through a list partitioned table when the key is null
create table lparted_nonullpart (a int, b char) partition by list (b);
create table lparted_nonullpart_a partition of lparted_nonullpart for values in ('a');
insert into lparted_nonullpart values (1);
drop table lparted_nonullpart;
-- check that RETURNING works correctly with tuple-routing -- check that RETURNING works correctly with tuple-routing
alter table mlparted drop constraint check_b; alter table mlparted drop constraint check_b;
create table mlparted12 partition of mlparted1 for values from (5) to (10); create table mlparted12 partition of mlparted1 for values from (5) to (10);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment