mirror of
https://github.com/postgres/postgres.git
synced 2025-07-28 23:42:10 +03:00
Propagate ALTER TABLE ... SET STORAGE to indexes
When creating a new index, the attstorage setting of the table column is copied to regular (non-expression) index columns. But a later ALTER TABLE ... SET STORAGE is not propagated to indexes, thus creating an inconsistent and undumpable state. Discussion: https://www.postgresql.org/message-id/flat/9765d72b-37c0-06f5-e349-2a580aafd989%402ndquadrant.com
This commit is contained in:
@ -2164,6 +2164,26 @@ where oid = 'test_storage'::regclass;
|
||||
t
|
||||
(1 row)
|
||||
|
||||
-- test that SET STORAGE propagates to index correctly
|
||||
create index test_storage_idx on test_storage (b, a);
|
||||
alter table test_storage alter column a set storage external;
|
||||
\d+ test_storage
|
||||
Table "public.test_storage"
|
||||
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
|
||||
--------+---------+-----------+----------+---------+----------+--------------+-------------
|
||||
a | text | | | | external | |
|
||||
b | integer | | | 0 | plain | |
|
||||
Indexes:
|
||||
"test_storage_idx" btree (b, a)
|
||||
|
||||
\d+ test_storage_idx
|
||||
Index "public.test_storage_idx"
|
||||
Column | Type | Key? | Definition | Storage | Stats target
|
||||
--------+---------+------+------------+----------+--------------
|
||||
b | integer | yes | b | plain |
|
||||
a | text | yes | a | external |
|
||||
btree, for table "public.test_storage"
|
||||
|
||||
-- ALTER COLUMN TYPE with a check constraint and a child table (bug #13779)
|
||||
CREATE TABLE test_inh_check (a float check (a > 10.2), b float);
|
||||
CREATE TABLE test_inh_check_child() INHERITS(test_inh_check);
|
||||
|
@ -98,7 +98,7 @@ CREATE TABLE no_index_cleanup (i INT PRIMARY KEY, t TEXT);
|
||||
CREATE INDEX no_index_cleanup_idx ON no_index_cleanup(t);
|
||||
ALTER TABLE no_index_cleanup ALTER COLUMN t SET STORAGE EXTERNAL;
|
||||
INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(1,30),
|
||||
repeat('1234567890',300));
|
||||
repeat('1234567890',269));
|
||||
-- index cleanup option is ignored if VACUUM FULL
|
||||
VACUUM (INDEX_CLEANUP TRUE, FULL TRUE) no_index_cleanup;
|
||||
VACUUM (FULL TRUE) no_index_cleanup;
|
||||
@ -112,7 +112,7 @@ ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = true);
|
||||
VACUUM no_index_cleanup;
|
||||
-- Parameter is set for both the parent table and its toast relation.
|
||||
INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(31,60),
|
||||
repeat('1234567890',300));
|
||||
repeat('1234567890',269));
|
||||
DELETE FROM no_index_cleanup WHERE i < 45;
|
||||
-- Only toast index is cleaned up.
|
||||
ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = false,
|
||||
|
@ -1463,6 +1463,12 @@ select reltoastrelid <> 0 as has_toast_table
|
||||
from pg_class
|
||||
where oid = 'test_storage'::regclass;
|
||||
|
||||
-- test that SET STORAGE propagates to index correctly
|
||||
create index test_storage_idx on test_storage (b, a);
|
||||
alter table test_storage alter column a set storage external;
|
||||
\d+ test_storage
|
||||
\d+ test_storage_idx
|
||||
|
||||
-- ALTER COLUMN TYPE with a check constraint and a child table (bug #13779)
|
||||
CREATE TABLE test_inh_check (a float check (a > 10.2), b float);
|
||||
CREATE TABLE test_inh_check_child() INHERITS(test_inh_check);
|
||||
|
@ -81,7 +81,7 @@ CREATE TABLE no_index_cleanup (i INT PRIMARY KEY, t TEXT);
|
||||
CREATE INDEX no_index_cleanup_idx ON no_index_cleanup(t);
|
||||
ALTER TABLE no_index_cleanup ALTER COLUMN t SET STORAGE EXTERNAL;
|
||||
INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(1,30),
|
||||
repeat('1234567890',300));
|
||||
repeat('1234567890',269));
|
||||
-- index cleanup option is ignored if VACUUM FULL
|
||||
VACUUM (INDEX_CLEANUP TRUE, FULL TRUE) no_index_cleanup;
|
||||
VACUUM (FULL TRUE) no_index_cleanup;
|
||||
@ -95,7 +95,7 @@ ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = true);
|
||||
VACUUM no_index_cleanup;
|
||||
-- Parameter is set for both the parent table and its toast relation.
|
||||
INSERT INTO no_index_cleanup(i, t) VALUES (generate_series(31,60),
|
||||
repeat('1234567890',300));
|
||||
repeat('1234567890',269));
|
||||
DELETE FROM no_index_cleanup WHERE i < 45;
|
||||
-- Only toast index is cleaned up.
|
||||
ALTER TABLE no_index_cleanup SET (vacuum_index_cleanup = false,
|
||||
|
Reference in New Issue
Block a user