From e28b1156122f4d48d6f6f7a7f26381ee7af65a91 Mon Sep 17 00:00:00 2001 From: Robert Haas Date: Tue, 14 Feb 2017 12:12:34 -0500 Subject: [PATCH] Don't disallow dropping NOT NULL for a list partition key. Range partitioning doesn't support nulls in the partitioning columns, but list partitioning does. Amit Langote, per a complaint from Amul Sul --- src/backend/commands/tablecmds.c | 22 +++++++++++++--------- src/test/regress/expected/alter_table.out | 4 ++++ src/test/regress/sql/alter_table.sql | 5 +++++ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 37a4c4a3d6a..f33aa70da69 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -5593,18 +5593,22 @@ ATExecDropNotNull(Relation rel, const char *colName, LOCKMODE lockmode) if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) { PartitionKey key = RelationGetPartitionKey(rel); - int partnatts = get_partition_natts(key), - i; - for (i = 0; i < partnatts; i++) + if (get_partition_strategy(key) == PARTITION_STRATEGY_RANGE) { - AttrNumber partattnum = get_partition_col_attnum(key, i); + int partnatts = get_partition_natts(key), + i; - if (partattnum == attnum) - ereport(ERROR, - (errcode(ERRCODE_INVALID_TABLE_DEFINITION), - errmsg("column \"%s\" is in range partition key", - colName))); + for (i = 0; i < partnatts; i++) + { + AttrNumber partattnum = get_partition_col_attnum(key, i); + + if (partattnum == attnum) + ereport(ERROR, + (errcode(ERRCODE_INVALID_TABLE_DEFINITION), + errmsg("column \"%s\" is in range partition key", + colName))); + } } } diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index d8e7b612940..b0e80a7788f 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3029,6 +3029,10 @@ ERROR: cannot alter type of column referenced in partition key expression -- cannot drop NOT NULL on columns in the range partition key ALTER TABLE partitioned ALTER COLUMN a DROP NOT NULL; ERROR: column "a" is in range partition key +-- it's fine however to drop one on the list partition key column +CREATE TABLE list_partitioned (a int not null) partition by list (a); +ALTER TABLE list_partitioned ALTER a DROP NOT NULL; +DROP TABLE list_partitioned; -- partitioned table cannot participate in regular inheritance CREATE TABLE foo ( a int, diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 1f551ec53c4..75137693597 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -1917,6 +1917,11 @@ ALTER TABLE partitioned ALTER COLUMN b TYPE char(5); -- cannot drop NOT NULL on columns in the range partition key ALTER TABLE partitioned ALTER COLUMN a DROP NOT NULL; +-- it's fine however to drop one on the list partition key column +CREATE TABLE list_partitioned (a int not null) partition by list (a); +ALTER TABLE list_partitioned ALTER a DROP NOT NULL; +DROP TABLE list_partitioned; + -- partitioned table cannot participate in regular inheritance CREATE TABLE foo ( a int, -- 2.30.2