aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/catalog/partition.c10
-rw-r--r--src/test/regress/expected/insert.out7
-rw-r--r--src/test/regress/sql/insert.sql6
3 files changed, 20 insertions, 3 deletions
diff --git a/src/backend/catalog/partition.c b/src/backend/catalog/partition.c
index b434c384c97..f9fd1366e26 100644
--- a/src/backend/catalog/partition.c
+++ b/src/backend/catalog/partition.c
@@ -1729,10 +1729,14 @@ get_partition_for_tuple(PartitionDispatch *pd,
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;
- else
+ else if (!isnull[0])
{
/* Else bsearch in partdesc->boundinfo */
bool equal = false;
diff --git a/src/test/regress/expected/insert.out b/src/test/regress/expected/insert.out
index 116854e1420..7fafa982126 100644
--- a/src/test/regress/expected/insert.out
+++ b/src/test/regress/expected/insert.out
@@ -365,6 +365,13 @@ DETAIL: Failing row contains (1, 2).
insert into mlparted1 (a, b) values (2, 3);
ERROR: new row for relation "mlparted11" violates partition constraint
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
alter table mlparted drop constraint check_b;
create table mlparted12 partition of mlparted1 for values from (5) to (10);
diff --git a/src/test/regress/sql/insert.sql b/src/test/regress/sql/insert.sql
index c56c3c22f8e..f9c00705a22 100644
--- a/src/test/regress/sql/insert.sql
+++ b/src/test/regress/sql/insert.sql
@@ -226,6 +226,12 @@ insert into mlparted values (1, 2);
-- selected by tuple-routing
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
alter table mlparted drop constraint check_b;
create table mlparted12 partition of mlparted1 for values from (5) to (10);