From 4d8a5de79b829e4f1be875c668f85bbfa6d3f37a Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 1 Mar 2024 10:22:22 +0900 Subject: [PATCH v3 1/2] Add DEFAULT option to ALTER TABLE SET ACCESS METHOD --- src/backend/commands/tablecmds.c | 3 ++- src/backend/parser/gram.y | 10 ++++++++-- src/test/regress/expected/create_am.out | 21 +++++++++++++++++++++ src/test/regress/sql/create_am.sql | 11 +++++++++++ doc/src/sgml/ref/alter_table.sgml | 6 ++++-- 5 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index f798794556..3b1c2590fd 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -15212,7 +15212,8 @@ ATPrepSetAccessMethod(AlteredTableInfo *tab, Relation rel, const char *amname) Oid amoid; /* Check that the table access method exists */ - amoid = get_table_am_oid(amname, false); + amoid = get_table_am_oid(amname ? amname : default_table_access_method, + false); if (rel->rd_rel->relam == amoid) return; diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index 130f7fc7c3..c6e2f679fd 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -338,6 +338,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type alter_identity_column_option_list %type alter_identity_column_option %type set_statistics_value +%type set_access_method_name %type createdb_opt_list createdb_opt_items copy_opt_list transaction_mode_list @@ -2859,8 +2860,8 @@ alter_table_cmd: n->newowner = $3; $$ = (Node *) n; } - /* ALTER TABLE SET ACCESS METHOD */ - | SET ACCESS METHOD name + /* ALTER TABLE SET ACCESS METHOD { | DEFAULT } */ + | SET ACCESS METHOD set_access_method_name { AlterTableCmd *n = makeNode(AlterTableCmd); @@ -3076,6 +3077,11 @@ set_statistics_value: | DEFAULT { $$ = NULL; } ; +set_access_method_name: + ColId { $$ = $1; } + | DEFAULT { $$ = NULL; } + ; + PartitionBoundSpec: /* a HASH partition */ FOR VALUES WITH '(' hash_partbound ')' diff --git a/src/test/regress/expected/create_am.out b/src/test/regress/expected/create_am.out index b50293d514..e843d39ee7 100644 --- a/src/test/regress/expected/create_am.out +++ b/src/test/regress/expected/create_am.out @@ -283,6 +283,27 @@ SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable; 9 | 1 (1 row) +-- DEFAULT access method +BEGIN; +SET LOCAL default_table_access_method TO heap2; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; + amname +-------- + heap2 +(1 row) + +SET LOCAL default_table_access_method TO heap; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; + amname +-------- + heap +(1 row) + +ROLLBACK; -- ALTER MATERIALIZED VIEW SET ACCESS METHOD CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT * FROM heaptable; SELECT amname FROM pg_class c, pg_am am diff --git a/src/test/regress/sql/create_am.sql b/src/test/regress/sql/create_am.sql index 2785ffd8bb..f752bf1678 100644 --- a/src/test/regress/sql/create_am.sql +++ b/src/test/regress/sql/create_am.sql @@ -188,6 +188,17 @@ ALTER TABLE heaptable SET ACCESS METHOD heap2; SELECT amname FROM pg_class c, pg_am am WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable; +-- DEFAULT access method +BEGIN; +SET LOCAL default_table_access_method TO heap2; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; +SET LOCAL default_table_access_method TO heap; +ALTER TABLE heaptable SET ACCESS METHOD DEFAULT; +SELECT amname FROM pg_class c, pg_am am + WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; +ROLLBACK; -- ALTER MATERIALIZED VIEW SET ACCESS METHOD CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT * FROM heaptable; SELECT amname FROM pg_class c, pg_am am diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index 9670671107..96e3d77605 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -76,7 +76,7 @@ ALTER TABLE [ IF EXISTS ] name CLUSTER ON index_name SET WITHOUT CLUSTER SET WITHOUT OIDS - SET ACCESS METHOD new_access_method + SET ACCESS METHOD { new_access_method | DEFAULT } SET TABLESPACE new_tablespace SET { LOGGED | UNLOGGED } SET ( storage_parameter [= value] [, ... ] ) @@ -733,7 +733,9 @@ WITH ( MODULUS numeric_literal, REM This form changes the access method of the table by rewriting it. See - for more information. + for more information. Writing + DEFAULT changes the access method of the table + to . -- 2.43.0