On 2017/02/08 21:20, amul sul wrote: > Regarding following code in ATExecDropNotNull function, I don't see > any special check for RANGE partitioned, is it intended to have same > restriction for LIST partitioned too, I guess not? > > /* > * If the table is a range partitioned table, check that the column is not > * in the partition key. > */ > 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++) > { > 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))); > } > }
Good catch! Seems like an oversight, attached fixes it. Thanks, Amit
>From b84ac63b6b4acd19a09e8507cf199db127c06d71 Mon Sep 17 00:00:00 2001 From: amit <amitlangot...@gmail.com> Date: Thu, 9 Feb 2017 10:31:58 +0900 Subject: [PATCH] Check partition strategy in ATExecDropNotNull We should prevent dropping the NOT NULL constraint on a column only if the column is in the *range* partition key (as the error message also says). Add a regression test while at it. Reported by: Amul Sul Patch by: Amit Langote Report: https://postgr.es/m/CAAJ_b95g5AgkpJKbLajAt8ovKub874-B9X08PiOqHvVfMO2mLw%40mail.gmail.com --- src/backend/commands/tablecmds.c | 22 +++++++++++++--------- src/test/regress/expected/alter_table.out | 3 +++ src/test/regress/sql/alter_table.sql | 3 +++ 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 37a4c4a3d6..f33aa70da6 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 d8e7b61294..e6d45fbf9c 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3330,6 +3330,9 @@ ALTER TABLE list_parted2 DROP COLUMN b; ERROR: cannot drop column named in partition key ALTER TABLE list_parted2 ALTER COLUMN b TYPE text; ERROR: cannot alter type of column named in partition key +-- cannot drop NOT NULL constraint of a range partition key column +ALTER TABLE range_parted ALTER a DROP NOT NULL; +ERROR: column "a" is in range partition key -- cleanup: avoid using CASCADE DROP TABLE list_parted, part_1; DROP TABLE list_parted2, part_2, part_5, part_5_a; diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 1f551ec53c..12edb8b3ba 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -2189,6 +2189,9 @@ ALTER TABLE part_2 INHERIT inh_test; ALTER TABLE list_parted2 DROP COLUMN b; ALTER TABLE list_parted2 ALTER COLUMN b TYPE text; +-- cannot drop NOT NULL constraint of a range partition key column +ALTER TABLE range_parted ALTER a DROP NOT NULL; + -- cleanup: avoid using CASCADE DROP TABLE list_parted, part_1; DROP TABLE list_parted2, part_2, part_5, part_5_a; -- 2.11.0
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers