aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2017-11-28 14:11:16 -0500
committerRobert Haas <rhaas@postgresql.org>2017-11-28 14:11:16 -0500
commit2d7950f2222c97bd9d9f4d4edc1b59e6660c3621 (patch)
tree744c28cb6c31db60f2fb82ed32095f58daf432f3
parent62546b4357f2aec46bb896fdbddfc0904a2d7920 (diff)
downloadpostgresql-2d7950f2222c97bd9d9f4d4edc1b59e6660c3621.tar.gz
postgresql-2d7950f2222c97bd9d9f4d4edc1b59e6660c3621.zip
If a range-partitioned table has no default partition, reject null keys.
Commit 4e5fe9ad19e14af360de7970caa8b150436c9dec introduced this problem. Also add a test so it doesn't get broken again. Report by Rushabh Lathia. Fix by Amit Langote. Reviewed by Rushabh Lathia and Amul Sul. Tweaked by me. Discussion: http://postgr.es/m/CAGPqQf0Y1iJyk4QJBdMf=pS9i6Q0JUMM_h5-qkR3OMJ-e04PyA@mail.gmail.com
-rw-r--r--src/backend/catalog/partition.c5
-rw-r--r--src/test/regress/expected/insert.out4
-rw-r--r--src/test/regress/sql/insert.sql3
3 files changed, 9 insertions, 3 deletions
diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c
index e032c11ed4d..d62230554e5 100644
--- a/src/backend/catalog/partition.c
+++ b/src/backend/catalog/partition.c
@@ -2553,11 +2553,10 @@ get_partition_for_tuple(Relation relation, Datum *values, bool *isnull)
*/
for (i = 0; i < key->partnatts; i++)
{
- if (isnull[i] &&
- partition_bound_has_default(partdesc->boundinfo))
+ if (isnull[i])
{
range_partkey_has_null = true;
- part_index = partdesc->boundinfo->default_index;
+ break;
}
}
diff --git a/src/test/regress/expected/insert.out b/src/test/regress/expected/insert.out
index 7481bebd83f..b7b37dbc399 100644
--- a/src/test/regress/expected/insert.out
+++ b/src/test/regress/expected/insert.out
@@ -659,6 +659,10 @@ create table mcrparted2 partition of mcrparted for values from (10, 6, minvalue)
create table mcrparted3 partition of mcrparted for values from (11, 1, 1) to (20, 10, 10);
create table mcrparted4 partition of mcrparted for values from (21, minvalue, minvalue) to (30, 20, maxvalue);
create table mcrparted5 partition of mcrparted for values from (30, 21, 20) to (maxvalue, maxvalue, maxvalue);
+-- null not allowed in range partition
+insert into mcrparted values (null, null, null);
+ERROR: no partition of relation "mcrparted" found for row
+DETAIL: Partition key of the failing row contains (a, abs(b), c) = (null, null, null).
-- routed to mcrparted0
insert into mcrparted values (0, 1, 1);
insert into mcrparted0 values (0, 1, 1);
diff --git a/src/test/regress/sql/insert.sql b/src/test/regress/sql/insert.sql
index f22ab41ae30..310b818076c 100644
--- a/src/test/regress/sql/insert.sql
+++ b/src/test/regress/sql/insert.sql
@@ -421,6 +421,9 @@ create table mcrparted3 partition of mcrparted for values from (11, 1, 1) to (20
create table mcrparted4 partition of mcrparted for values from (21, minvalue, minvalue) to (30, 20, maxvalue);
create table mcrparted5 partition of mcrparted for values from (30, 21, 20) to (maxvalue, maxvalue, maxvalue);
+-- null not allowed in range partition
+insert into mcrparted values (null, null, null);
+
-- routed to mcrparted0
insert into mcrparted values (0, 1, 1);
insert into mcrparted0 values (0, 1, 1);