mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03:00
Improve handling of SET ACCESS METHOD for ALTER MATERIALIZED VIEW
b048326 has added support for SET ACCESS METHOD in ALTER TABLE, but it has missed a few things for materialized views: - No documentation for this clause on the ALTER MATERIALIZED VIEW page. - psql tab completion missing. - No regression tests. This commit closes the gap on all the points listed above. Author: Yugo Nagata Discussion: https://postgr.es/m/20220316133337.5dc9740abfa24c25ec9f67f5@sraoss.co.jp
This commit is contained in:
parent
ade2159bcd
commit
eb8399cf1f
@ -43,6 +43,7 @@ ALTER MATERIALIZED VIEW ALL IN TABLESPACE <replaceable class="parameter">name</r
|
|||||||
ALTER [ COLUMN ] <replaceable class="parameter">column_name</replaceable> SET COMPRESSION <replaceable class="parameter">compression_method</replaceable>
|
ALTER [ COLUMN ] <replaceable class="parameter">column_name</replaceable> SET COMPRESSION <replaceable class="parameter">compression_method</replaceable>
|
||||||
CLUSTER ON <replaceable class="parameter">index_name</replaceable>
|
CLUSTER ON <replaceable class="parameter">index_name</replaceable>
|
||||||
SET WITHOUT CLUSTER
|
SET WITHOUT CLUSTER
|
||||||
|
SET ACCESS METHOD <replaceable class="parameter">new_access_method</replaceable>
|
||||||
SET TABLESPACE <replaceable class="parameter">new_tablespace</replaceable>
|
SET TABLESPACE <replaceable class="parameter">new_tablespace</replaceable>
|
||||||
SET ( <replaceable class="parameter">storage_parameter</replaceable> [= <replaceable class="parameter">value</replaceable>] [, ... ] )
|
SET ( <replaceable class="parameter">storage_parameter</replaceable> [= <replaceable class="parameter">value</replaceable>] [, ... ] )
|
||||||
RESET ( <replaceable class="parameter">storage_parameter</replaceable> [, ... ] )
|
RESET ( <replaceable class="parameter">storage_parameter</replaceable> [, ... ] )
|
||||||
|
@ -2124,7 +2124,11 @@ psql_completion(const char *text, int start, int end)
|
|||||||
COMPLETE_WITH("TO");
|
COMPLETE_WITH("TO");
|
||||||
/* ALTER MATERIALIZED VIEW xxx SET */
|
/* ALTER MATERIALIZED VIEW xxx SET */
|
||||||
else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET"))
|
else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET"))
|
||||||
COMPLETE_WITH("(", "SCHEMA", "TABLESPACE", "WITHOUT CLUSTER");
|
COMPLETE_WITH("(", "ACCESS METHOD", "SCHEMA", "TABLESPACE", "WITHOUT CLUSTER");
|
||||||
|
/* ALTER MATERIALIZED VIEW xxx SET ACCESS METHOD */
|
||||||
|
else if (Matches("ALTER", "MATERIALIZED", "VIEW", MatchAny, "SET", "ACCESS", "METHOD"))
|
||||||
|
COMPLETE_WITH_QUERY(Query_for_list_of_table_access_methods);
|
||||||
|
|
||||||
/* ALTER POLICY <name> */
|
/* ALTER POLICY <name> */
|
||||||
else if (Matches("ALTER", "POLICY"))
|
else if (Matches("ALTER", "POLICY"))
|
||||||
COMPLETE_WITH_QUERY(Query_for_list_of_policies);
|
COMPLETE_WITH_QUERY(Query_for_list_of_policies);
|
||||||
|
@ -254,9 +254,35 @@ SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable;
|
|||||||
9 | 1
|
9 | 1
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
-- 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
|
||||||
|
WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass;
|
||||||
|
amname
|
||||||
|
--------
|
||||||
|
heap
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap2;
|
||||||
|
SELECT amname FROM pg_class c, pg_am am
|
||||||
|
WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass;
|
||||||
|
amname
|
||||||
|
--------
|
||||||
|
heap2
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heapmv;
|
||||||
|
count | count
|
||||||
|
-------+-------
|
||||||
|
9 | 1
|
||||||
|
(1 row)
|
||||||
|
|
||||||
-- No support for multiple subcommands
|
-- No support for multiple subcommands
|
||||||
ALTER TABLE heaptable SET ACCESS METHOD heap, SET ACCESS METHOD heap2;
|
ALTER TABLE heaptable SET ACCESS METHOD heap, SET ACCESS METHOD heap2;
|
||||||
ERROR: cannot have multiple SET ACCESS METHOD subcommands
|
ERROR: cannot have multiple SET ACCESS METHOD subcommands
|
||||||
|
ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap, SET ACCESS METHOD heap2;
|
||||||
|
ERROR: cannot have multiple SET ACCESS METHOD subcommands
|
||||||
|
DROP MATERIALIZED VIEW heapmv;
|
||||||
DROP TABLE heaptable;
|
DROP TABLE heaptable;
|
||||||
-- No support for partitioned tables.
|
-- No support for partitioned tables.
|
||||||
CREATE TABLE am_partitioned(x INT, y INT)
|
CREATE TABLE am_partitioned(x INT, y INT)
|
||||||
|
@ -170,8 +170,18 @@ ALTER TABLE heaptable SET ACCESS METHOD heap2;
|
|||||||
SELECT amname FROM pg_class c, pg_am am
|
SELECT amname FROM pg_class c, pg_am am
|
||||||
WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass;
|
WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass;
|
||||||
SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable;
|
SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable;
|
||||||
|
-- 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
|
||||||
|
WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass;
|
||||||
|
ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap2;
|
||||||
|
SELECT amname FROM pg_class c, pg_am am
|
||||||
|
WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass;
|
||||||
|
SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heapmv;
|
||||||
-- No support for multiple subcommands
|
-- No support for multiple subcommands
|
||||||
ALTER TABLE heaptable SET ACCESS METHOD heap, SET ACCESS METHOD heap2;
|
ALTER TABLE heaptable SET ACCESS METHOD heap, SET ACCESS METHOD heap2;
|
||||||
|
ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap, SET ACCESS METHOD heap2;
|
||||||
|
DROP MATERIALIZED VIEW heapmv;
|
||||||
DROP TABLE heaptable;
|
DROP TABLE heaptable;
|
||||||
-- No support for partitioned tables.
|
-- No support for partitioned tables.
|
||||||
CREATE TABLE am_partitioned(x INT, y INT)
|
CREATE TABLE am_partitioned(x INT, y INT)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user