From 3a4a78d46fc74bb3e9b7ac9aefc689d250e1ecf4 Mon Sep 17 00:00:00 2001 From: Soumyadeep Chakraborty Date: Tue, 17 May 2022 15:22:48 -0700 Subject: [PATCH v2 2/2] Make ATSETAM recurse by default ATSETAM now recurses to partition children by default. To prevent recursion, and have the new am apply to future children only, users must specify the ONLY clause. --- src/backend/commands/tablecmds.c | 2 ++ src/test/regress/expected/create_am.out | 13 ++++++++++++- src/test/regress/sql/create_am.sql | 5 ++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 5febd834d5b..c5bbb71c66d 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -4711,6 +4711,8 @@ ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("cannot have multiple SET ACCESS METHOD subcommands"))); + if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + ATSimpleRecursion(wqueue, rel, cmd, recurse, lockmode, context); ATPrepSetAccessMethod(tab, rel, cmd->name); pass = AT_PASS_MISC; /* does not matter; no work in Phase 2 */ break; diff --git a/src/test/regress/expected/create_am.out b/src/test/regress/expected/create_am.out index a48199df9a2..e99de1ac912 100644 --- a/src/test/regress/expected/create_am.out +++ b/src/test/regress/expected/create_am.out @@ -284,7 +284,7 @@ CREATE TABLE am_partitioned(x INT, y INT) CREATE TABLE am_partitioned_1 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 0); CREATE TABLE am_partitioned_2 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 1); ALTER TABLE am_partitioned_1 SET ACCESS METHOD heap2; -ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +ALTER TABLE ONLY am_partitioned SET ACCESS METHOD heap2; CREATE TABLE am_partitioned_3 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 2); SELECT relname, amname FROM pg_class c, pg_am am WHERE c.relam = am.oid AND c.relname LIKE 'am_partitioned%' ORDER BY 1; @@ -296,6 +296,17 @@ SELECT relname, amname FROM pg_class c, pg_am am am_partitioned_3 | heap2 (4 rows) +ALTER TABLE am_partitioned SET ACCESS METHOD heap; +SELECT relname, amname FROM pg_class c, pg_am am +WHERE c.relam = am.oid AND c.relname LIKE 'am_partitioned%' ORDER BY 1; + relname | amname +------------------+-------- + am_partitioned | heap + am_partitioned_1 | heap + am_partitioned_2 | heap + am_partitioned_3 | heap +(4 rows) + DROP TABLE am_partitioned; -- Second, create objects in the new AM by changing the default AM BEGIN; diff --git a/src/test/regress/sql/create_am.sql b/src/test/regress/sql/create_am.sql index 8f3db03bba2..f4e22684782 100644 --- a/src/test/regress/sql/create_am.sql +++ b/src/test/regress/sql/create_am.sql @@ -184,10 +184,13 @@ CREATE TABLE am_partitioned(x INT, y INT) CREATE TABLE am_partitioned_1 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 0); CREATE TABLE am_partitioned_2 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 1); ALTER TABLE am_partitioned_1 SET ACCESS METHOD heap2; -ALTER TABLE am_partitioned SET ACCESS METHOD heap2; +ALTER TABLE ONLY am_partitioned SET ACCESS METHOD heap2; CREATE TABLE am_partitioned_3 PARTITION OF am_partitioned FOR VALUES WITH (MODULUS 3,REMAINDER 2); SELECT relname, amname FROM pg_class c, pg_am am WHERE c.relam = am.oid AND c.relname LIKE 'am_partitioned%' ORDER BY 1; +ALTER TABLE am_partitioned SET ACCESS METHOD heap; +SELECT relname, amname FROM pg_class c, pg_am am +WHERE c.relam = am.oid AND c.relname LIKE 'am_partitioned%' ORDER BY 1; DROP TABLE am_partitioned; -- Second, create objects in the new AM by changing the default AM -- 2.25.1