diff --git a/src/test/regress/expected/reindex_concurrently.out b/src/test/regress/expected/reindex_concurrently.out new file mode 100644 index 000000000..60a56f057 --- /dev/null +++ b/src/test/regress/expected/reindex_concurrently.out @@ -0,0 +1,87 @@ +-- +-- REINDEX CONCURRENTLY +-- +CREATE TABLE concur_reindex_tab (c1 int); +-- REINDEX +REINDEX TABLE concur_reindex_tab; -- notice +NOTICE: table "concur_reindex_tab" has no indexes +REINDEX TABLE CONCURRENTLY concur_reindex_tab; -- notice +NOTICE: table "concur_reindex_tab" has no indexes +ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index +-- Normal index with integer column +CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1); +-- Normal index with text column +CREATE INDEX concur_reindex_ind2 ON concur_reindex_tab(c2); +-- UNION INDEX index with expression +CREATE UNIQUE INDEX concur_reindex_ind3 ON concur_reindex_tab(abs(c1)); +-- Duplicates column names error +CREATE INDEX concur_reindex_ind4 ON concur_reindex_tab(c1, c1, c2); +ERROR: duplicate column name +-- Create table for check on foreign key dependence switch with indexes swapped +ALTER TABLE concur_reindex_tab ADD PRIMARY KEY USING INDEX concur_reindex_ind1; +CREATE TABLE concur_reindex_tab2 (c1 int REFERENCES concur_reindex_tab); +INSERT INTO concur_reindex_tab VALUES (1, 'a'); +INSERT INTO concur_reindex_tab VALUES (2, 'a'); +-- Check materialized views +CREATE MATERIALIZED VIEW concur_reindex_matview AS SELECT * FROM concur_reindex_tab; +REINDEX INDEX CONCURRENTLY concur_reindex_ind1; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +REINDEX TABLE CONCURRENTLY concur_reindex_matview; +-- Check views +CREATE VIEW concur_reindex_view AS SELECT * FROM concur_reindex_tab; +REINDEX TABLE CONCURRENTLY concur_reindex_view; -- Error +ERROR: "concur_reindex_view" is not a table or materialized view +-- Check that comments are preserved +CREATE TABLE testcomment (i int); +CREATE INDEX testcomment_idx1 ON testcomment(i); +COMMENT ON INDEX testcomment_idx1 IS 'test comment'; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); + obj_description +----------------- + test comment +(1 row) + +REINDEX TABLE testcomment; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); + obj_description +----------------- + test comment +(1 row) + +REINDEX TABLE CONCURRENTLY testcomment; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); + obj_description +----------------- + test comment +(1 row) + +DROP TABLE testcomment; +-- Check error +-- Cannot run inside a transaction block +BEGIN; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block +COMMIT; +REINDEX TABLE CONCURRENTLY pg_database; -- no shared relation +ERROR: concurrent index creation on system catalog tables is not supported +REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relations +ERROR: concurrent index creation on system catalog tables is not supported +REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM +ERROR: can only reindex the currently open database +-- Check the relation status, there should not be invalid indexe +\d concur_reindex_tab +Table "public.concur_reindex_tab" + Column | Type | Modifiers +--------+---------+----------- + c1 | integer | not null + c2 | text | +Indexes: + "concur_reindex_ind1" PRIMARY KEY, btree (c1) TABLESPACE pg_default + "concur_reindex_ind3" UNIQUE, btree (abs(c1)) TABLESPACE pg_default + "concur_reindex_ind2" btree (c2) TABLESPACE pg_default +Referenced by: + TABLE "concur_reindex_tab2" CONSTRAINT "concur_reindex_tab2_c1_fkey" FOREIGN KEY (c1) REFERENCES concur_reindex_tab(c1) + +DROP VIEW concur_reindex_view; +DROP MATERIALIZED VIEW concur_reindex_matview; +DROP TABLE concur_reindex_tab, concur_reindex_tab2; diff --git a/src/test/regress/expected/reindex_concurrently_parallel.out b/src/test/regress/expected/reindex_concurrently_parallel.out new file mode 100644 index 000000000..ef9f39436 --- /dev/null +++ b/src/test/regress/expected/reindex_concurrently_parallel.out @@ -0,0 +1,59 @@ +-- +-- REINDEX CONCURRENTLY PARALLEL +-- +CREATE TABLE reind_con_tab(id serial primary key, data text); +NOTICE: CREATE TABLE will create implicit sequence "reind_con_tab_id_seq" for serial column "reind_con_tab.id" +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "reind_con_tab_pkey" for table "reind_con_tab" +INSERT INTO reind_con_tab(data) VALUES ('aa'); +INSERT INTO reind_con_tab(data) VALUES ('aaa'); +INSERT INTO reind_con_tab(data) VALUES ('aaaa'); +INSERT INTO reind_con_tab(data) VALUES ('aaaaa'); +\d reind_con_tab; + Table "public.reind_con_tab" + Column | Type | Modifiers +--------+---------+------------------------------------------------------------ + id | integer | not null default nextval('reind_con_tab_id_seq'::regclass) + data | text | +Indexes: + "reind_con_tab_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default + +\parallel on +REINDEX TABLE CONCURRENTLY reind_con_tab; +SELECT data FROM reind_con_tab WHERE id =3; +\parallel off + data +------ + aaaa +(1 row) + +\parallel on +REINDEX TABLE CONCURRENTLY reind_con_tab; +UPDATE reind_con_tab SET data = 'bbbb' WHERE id = 3; +\parallel off +\parallel on +REINDEX TABLE CONCURRENTLY reind_con_tab; +INSERT INTO reind_con_tab(data) VALUES('cccc'); +\parallel off +\parallel on +REINDEX TABLE CONCURRENTLY reind_con_tab; +DELETE FROM reind_con_tab WHERE data = 'aaa'; +\parallel off +SELECT * FROM reind_con_tab; + id | data +----+------- + 1 | aa + 4 | aaaaa + 3 | bbbb + 5 | cccc +(4 rows) + +\d reind_con_tab; + Table "public.reind_con_tab" + Column | Type | Modifiers +--------+---------+------------------------------------------------------------ + id | integer | not null default nextval('reind_con_tab_id_seq'::regclass) + data | text | +Indexes: + "reind_con_tab_pkey" PRIMARY KEY, btree (id) TABLESPACE pg_default + +DROP TABLE reind_con_tab; diff --git a/src/test/regress/expected/reindex_concurrently_partition.out b/src/test/regress/expected/reindex_concurrently_partition.out new file mode 100644 index 000000000..eaa46bbac --- /dev/null +++ b/src/test/regress/expected/reindex_concurrently_partition.out @@ -0,0 +1,55 @@ +-- +-- REINDEX CONCURRENTLY PARTITION +-- +drop table if exists t1; +NOTICE: table "t1" does not exist, skipping +create table t1( + c_id varchar, + c_w_id integer, + c_date date + ) +partition by range (c_date,c_w_id) +( + PARTITION t1_1 values less than ('20170331',5), + PARTITION t1_2 values less than ('20170731',450), + PARTITION t1_3 values less than ('20170930',1062), + PARTITION t1_4 values less than ('20171231',1765), + PARTITION t1_5 values less than ('20180331',2024), + PARTITION t1_6 values less than ('20180731',2384), + PARTITION t1_7 values less than ('20180930',2786), + PARTITION t1_8 values less than (maxvalue,maxvalue) +); +insert into t1 values('gauss1',4,'20170301'); +insert into t1 values('gauss2',400,'20170625'); +insert into t1 values('gauss3',480,'20170920'); +insert into t1 values('gauss4',1065,'20170920'); +insert into t1 values('gauss5',1800,'20170920'); +insert into t1 values('gauss6',2030,'20170920'); +insert into t1 values('gauss7',2385,'20170920'); +insert into t1 values('gauss8',2789,'20191020'); +insert into t1 values('gauss9',2789,'20171020'); +create index idx_t1 on t1 using btree(c_id) LOCAL; +create index idx2_t1 on t1 using btree(c_id) LOCAL ( + PARTITION t1_1_index, + PARTITION t1_2_index, + PARTITION t1_3_index, + PARTITION t1_4_index, + PARTITION t1_5_index, + PARTITION t1_6_index, + PARTITION t1_7_index, + PARTITION t1_8_index +); +reindex index CONCURRENTLY idx_t1; +reindex index CONCURRENTLY idx2_t1 partition t1_1_index; +reindex table CONCURRENTLY t1; +reindex table CONCURRENTLY t1 partition t1_1; +drop index idx_t1; +drop index idx2_t1; +create index idx_t1 on t1 using btree(c_id); +reindex index idx_t1; +reindex index CONCURRENTLY idx_t1; --ERROR, can't reindex concurrently global index partition +ERROR: cannot reindex concurrently global partition index " public.idx_t1" +reindex table t1; +reindex table CONCURRENTLY t1; --WARNING, can't reindex concurrently global index partition +WARNING: cannot reindex concurrently global partition index " public.idx_t1", skipping +drop table t1; diff --git a/src/test/regress/expected/reindex_concurrently_partition_parallel.out b/src/test/regress/expected/reindex_concurrently_partition_parallel.out new file mode 100644 index 000000000..ec62611e4 --- /dev/null +++ b/src/test/regress/expected/reindex_concurrently_partition_parallel.out @@ -0,0 +1,51 @@ +-- +-- REINDEX CONCURRENTLY PARTITION PARALLEL +-- +drop table if exists t2; +NOTICE: table "t2" does not exist, skipping +CREATE TABLE t2 (id int, data text) partition by range(id)(partition p1 values less than(100), partition p2 values less than(200), partition p3 values less than(MAXVALUE)); +insert into t2 select generate_series(1,500),generate_series(1,500); +create index ind_id on t2(id) LOCAL; +select * from t2 where id = 4; + id | data +----+------ + 4 | 4 +(1 row) + +\parallel on +REINDEX index CONCURRENTLY ind_id; +select * from t2 where id = 3; +\parallel off + id | data +----+------ + 3 | 3 +(1 row) + +\parallel on +REINDEX index CONCURRENTLY ind_id; +delete from t2 where id = 4; +\parallel off +\parallel on +REINDEX index CONCURRENTLY ind_id; +insert into t2 values (4,3); +\parallel off +\parallel on +REINDEX index CONCURRENTLY ind_id; +update t2 set data = 4 where id = 4; +\parallel off +\parallel on +REINDEX index CONCURRENTLY ind_id; +select * from t2 where id = 4; +\parallel off + id | data +----+------ + 4 | 4 +(1 row) + +select * from t2 where id = 4; + id | data +----+------ + 4 | 4 +(1 row) + +drop table t2; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index c4633b6fe..e0ef4c3c5 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -831,8 +831,15 @@ test: comment_proc test: hw_package test: procedure_privilege_test test: cast_privileges_test + +test: reindex_concurrently +test: reindex_concurrently_parallel +test: reindex_concurrently_partition +test: reindex_concurrently_partition_parallel + #test: hw_dbms_sql1 test: hw_cipher_sm4 test: hw_cipher_aes128 test: sequence_cache_test -test: pg_buffercache_pages \ No newline at end of file +test: pg_buffercache_pages + diff --git a/src/test/regress/sql/reindex_concurrently.sql b/src/test/regress/sql/reindex_concurrently.sql new file mode 100644 index 000000000..c000a2e5c --- /dev/null +++ b/src/test/regress/sql/reindex_concurrently.sql @@ -0,0 +1,54 @@ +-- +-- REINDEX CONCURRENTLY +-- +CREATE TABLE concur_reindex_tab (c1 int); +-- REINDEX +REINDEX TABLE concur_reindex_tab; -- notice +REINDEX TABLE CONCURRENTLY concur_reindex_tab; -- notice +ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index +-- Normal index with integer column +CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1); +-- Normal index with text column +CREATE INDEX concur_reindex_ind2 ON concur_reindex_tab(c2); +-- UNION INDEX index with expression +CREATE UNIQUE INDEX concur_reindex_ind3 ON concur_reindex_tab(abs(c1)); +-- Duplicates column names error +CREATE INDEX concur_reindex_ind4 ON concur_reindex_tab(c1, c1, c2); +-- Create table for check on foreign key dependence switch with indexes swapped +ALTER TABLE concur_reindex_tab ADD PRIMARY KEY USING INDEX concur_reindex_ind1; +CREATE TABLE concur_reindex_tab2 (c1 int REFERENCES concur_reindex_tab); +INSERT INTO concur_reindex_tab VALUES (1, 'a'); +INSERT INTO concur_reindex_tab VALUES (2, 'a'); +-- Check materialized views +CREATE MATERIALIZED VIEW concur_reindex_matview AS SELECT * FROM concur_reindex_tab; +REINDEX INDEX CONCURRENTLY concur_reindex_ind1; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +REINDEX TABLE CONCURRENTLY concur_reindex_matview; +-- Check views +CREATE VIEW concur_reindex_view AS SELECT * FROM concur_reindex_tab; +REINDEX TABLE CONCURRENTLY concur_reindex_view; -- Error +-- Check that comments are preserved +CREATE TABLE testcomment (i int); +CREATE INDEX testcomment_idx1 ON testcomment(i); +COMMENT ON INDEX testcomment_idx1 IS 'test comment'; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); +REINDEX TABLE testcomment; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); +REINDEX TABLE CONCURRENTLY testcomment; +SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); +DROP TABLE testcomment; + +-- Check error +-- Cannot run inside a transaction block +BEGIN; +REINDEX TABLE CONCURRENTLY concur_reindex_tab; +COMMIT; +REINDEX TABLE CONCURRENTLY pg_database; -- no shared relation +REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relations +REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM + +-- Check the relation status, there should not be invalid indexe +\d concur_reindex_tab +DROP VIEW concur_reindex_view; +DROP MATERIALIZED VIEW concur_reindex_matview; +DROP TABLE concur_reindex_tab, concur_reindex_tab2; diff --git a/src/test/regress/sql/reindex_concurrently_parallel.sql b/src/test/regress/sql/reindex_concurrently_parallel.sql new file mode 100644 index 000000000..ff196842a --- /dev/null +++ b/src/test/regress/sql/reindex_concurrently_parallel.sql @@ -0,0 +1,33 @@ +-- +-- REINDEX CONCURRENTLY PARALLEL +-- +CREATE TABLE reind_con_tab(id serial primary key, data text); +INSERT INTO reind_con_tab(data) VALUES ('aa'); +INSERT INTO reind_con_tab(data) VALUES ('aaa'); +INSERT INTO reind_con_tab(data) VALUES ('aaaa'); +INSERT INTO reind_con_tab(data) VALUES ('aaaaa'); +\d reind_con_tab; + +\parallel on +REINDEX TABLE CONCURRENTLY reind_con_tab; +SELECT data FROM reind_con_tab WHERE id =3; +\parallel off + +\parallel on +REINDEX TABLE CONCURRENTLY reind_con_tab; +UPDATE reind_con_tab SET data = 'bbbb' WHERE id = 3; +\parallel off + +\parallel on +REINDEX TABLE CONCURRENTLY reind_con_tab; +INSERT INTO reind_con_tab(data) VALUES('cccc'); +\parallel off + +\parallel on +REINDEX TABLE CONCURRENTLY reind_con_tab; +DELETE FROM reind_con_tab WHERE data = 'aaa'; +\parallel off + +SELECT * FROM reind_con_tab; +\d reind_con_tab; +DROP TABLE reind_con_tab; \ No newline at end of file diff --git a/src/test/regress/sql/reindex_concurrently_partition.sql b/src/test/regress/sql/reindex_concurrently_partition.sql new file mode 100644 index 000000000..0dab721f8 --- /dev/null +++ b/src/test/regress/sql/reindex_concurrently_partition.sql @@ -0,0 +1,58 @@ +-- +-- REINDEX CONCURRENTLY PARTITION +-- + +drop table if exists t1; +create table t1( + c_id varchar, + c_w_id integer, + c_date date + ) +partition by range (c_date,c_w_id) +( + PARTITION t1_1 values less than ('20170331',5), + PARTITION t1_2 values less than ('20170731',450), + PARTITION t1_3 values less than ('20170930',1062), + PARTITION t1_4 values less than ('20171231',1765), + PARTITION t1_5 values less than ('20180331',2024), + PARTITION t1_6 values less than ('20180731',2384), + PARTITION t1_7 values less than ('20180930',2786), + PARTITION t1_8 values less than (maxvalue,maxvalue) +); + +insert into t1 values('gauss1',4,'20170301'); +insert into t1 values('gauss2',400,'20170625'); +insert into t1 values('gauss3',480,'20170920'); +insert into t1 values('gauss4',1065,'20170920'); +insert into t1 values('gauss5',1800,'20170920'); +insert into t1 values('gauss6',2030,'20170920'); +insert into t1 values('gauss7',2385,'20170920'); +insert into t1 values('gauss8',2789,'20191020'); +insert into t1 values('gauss9',2789,'20171020'); + +create index idx_t1 on t1 using btree(c_id) LOCAL; +create index idx2_t1 on t1 using btree(c_id) LOCAL ( + PARTITION t1_1_index, + PARTITION t1_2_index, + PARTITION t1_3_index, + PARTITION t1_4_index, + PARTITION t1_5_index, + PARTITION t1_6_index, + PARTITION t1_7_index, + PARTITION t1_8_index +); +reindex index CONCURRENTLY idx_t1; +reindex index CONCURRENTLY idx2_t1 partition t1_1_index; +reindex table CONCURRENTLY t1; +reindex table CONCURRENTLY t1 partition t1_1; + +drop index idx_t1; +drop index idx2_t1; + +create index idx_t1 on t1 using btree(c_id); +reindex index idx_t1; +reindex index CONCURRENTLY idx_t1; --ERROR, can't reindex concurrently global index partition +reindex table t1; +reindex table CONCURRENTLY t1; --WARNING, can't reindex concurrently global index partition + +drop table t1; \ No newline at end of file diff --git a/src/test/regress/sql/reindex_concurrently_partition_parallel.sql b/src/test/regress/sql/reindex_concurrently_partition_parallel.sql new file mode 100644 index 000000000..478a37074 --- /dev/null +++ b/src/test/regress/sql/reindex_concurrently_partition_parallel.sql @@ -0,0 +1,38 @@ +-- +-- REINDEX CONCURRENTLY PARTITION PARALLEL +-- +drop table if exists t2; + +CREATE TABLE t2 (id int, data text) partition by range(id)(partition p1 values less than(100), partition p2 values less than(200), partition p3 values less than(MAXVALUE)); +insert into t2 select generate_series(1,500),generate_series(1,500); +create index ind_id on t2(id) LOCAL; + +select * from t2 where id = 4; + +\parallel on +REINDEX index CONCURRENTLY ind_id; +select * from t2 where id = 3; +\parallel off + +\parallel on +REINDEX index CONCURRENTLY ind_id; +delete from t2 where id = 4; +\parallel off + +\parallel on +REINDEX index CONCURRENTLY ind_id; +insert into t2 values (4,3); +\parallel off + +\parallel on +REINDEX index CONCURRENTLY ind_id; +update t2 set data = 4 where id = 4; +\parallel off + +\parallel on +REINDEX index CONCURRENTLY ind_id; +select * from t2 where id = 4; +\parallel off + +select * from t2 where id = 4; +drop table t2;