From bbba59e69a56e1622e270f5e47b402c3a904cefc Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Tue, 24 Sep 2024 08:59:08 +0900 Subject: [PATCH] Remove ATT_TABLE for ALTER TABLE ... ATTACH/DETACH MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Attempting these commands for a non-partitioned table would result in a failure when creating the relation in transformPartitionCmd(). This gives the possibility to throw an error earlier with a much better error message, thanks to d69a3f4d70b7. The extra test cases are from me. Note that FINALIZE uses a different subcommand and it had no coverage for its failure path with non-partitioned tables. Author: Álvaro Herrera, Michael Paquier Reviewed-by: Nathan Bossart Discussion: https://postgr.es/m/202409190803.tnis52adt2n5@alvherre.pgsql --- src/backend/commands/tablecmds.c | 8 +++----- src/test/regress/expected/alter_table.out | 12 ++++++++++-- src/test/regress/sql/alter_table.sql | 2 ++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 2d703aa22e..d27e6cf345 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -5107,19 +5107,17 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, break; case AT_AttachPartition: ATSimplePermissions(cmd->subtype, rel, - ATT_TABLE | ATT_PARTITIONED_TABLE | ATT_PARTITIONED_INDEX); + ATT_PARTITIONED_TABLE | ATT_PARTITIONED_INDEX); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_DetachPartition: - ATSimplePermissions(cmd->subtype, rel, - ATT_TABLE | ATT_PARTITIONED_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_PARTITIONED_TABLE); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; case AT_DetachPartitionFinalize: - ATSimplePermissions(cmd->subtype, rel, - ATT_TABLE | ATT_PARTITIONED_TABLE); + ATSimplePermissions(cmd->subtype, rel, ATT_PARTITIONED_TABLE); /* No command-specific prep needed */ pass = AT_PASS_MISC; break; diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 79cf82b5ae..3b3b0738d7 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3911,7 +3911,8 @@ CREATE TABLE unparted ( ); CREATE TABLE fail_part (like unparted); ALTER TABLE unparted ATTACH PARTITION fail_part FOR VALUES IN ('a'); -ERROR: table "unparted" is not partitioned +ERROR: ALTER action ATTACH PARTITION cannot be performed on relation "unparted" +DETAIL: This operation is not supported for tables. DROP TABLE unparted, fail_part; -- check that partition bound is compatible CREATE TABLE list_parted ( @@ -4281,7 +4282,14 @@ DROP TABLE fail_part; -- check that the table is partitioned at all CREATE TABLE regular_table (a int); ALTER TABLE regular_table DETACH PARTITION any_name; -ERROR: table "regular_table" is not partitioned +ERROR: ALTER action DETACH PARTITION cannot be performed on relation "regular_table" +DETAIL: This operation is not supported for tables. +ALTER TABLE regular_table DETACH PARTITION any_name CONCURRENTLY; +ERROR: ALTER action DETACH PARTITION cannot be performed on relation "regular_table" +DETAIL: This operation is not supported for tables. +ALTER TABLE regular_table DETACH PARTITION any_name FINALIZE; +ERROR: ALTER action DETACH PARTITION ... FINALIZE cannot be performed on relation "regular_table" +DETAIL: This operation is not supported for tables. DROP TABLE regular_table; -- check that the partition being detached exists at all ALTER TABLE list_parted2 DETACH PARTITION part_4; diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 28cabc49e9..453799abed 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -2742,6 +2742,8 @@ DROP TABLE fail_part; -- check that the table is partitioned at all CREATE TABLE regular_table (a int); ALTER TABLE regular_table DETACH PARTITION any_name; +ALTER TABLE regular_table DETACH PARTITION any_name CONCURRENTLY; +ALTER TABLE regular_table DETACH PARTITION any_name FINALIZE; DROP TABLE regular_table; -- check that the partition being detached exists at all