Remove ATT_TABLE for ALTER TABLE ... ATTACH/DETACH
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
This commit is contained in:
parent
75240f65e7
commit
bbba59e69a
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user