]> granicus.if.org Git - postgresql/commitdiff
If a range-partitioned table has no default partition, reject null keys.
authorRobert Haas <rhaas@postgresql.org>
Tue, 28 Nov 2017 19:11:16 +0000 (14:11 -0500)
committerRobert Haas <rhaas@postgresql.org>
Tue, 28 Nov 2017 19:11:16 +0000 (14:11 -0500)
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

src/backend/catalog/partition.c
src/test/regress/expected/insert.out
src/test/regress/sql/insert.sql

index e032c11ed4d8a239942a15772506b56c88e3ac4f..d62230554e5cea8549ae2f3f3b0d9cd0a2cca926 100644 (file)
@@ -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;
                                        }
                                }
 
index 7481bebd83f9613443dadcf1f1cdad1623ed4a9e..b7b37dbc39961757f1448aacf2d27529cd3cd9d0 100644 (file)
@@ -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);
index f22ab41ae300d55e2768bb161c2150e2f2184171..310b818076c491043b62a94e30727cbafe25e35b 100644 (file)
@@ -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);