From 84903a65f3bb2eb7b9c1a7fa96fc73766b142686 Mon Sep 17 00:00:00 2001 From: Alvaro Herrera Date: Mon, 23 Oct 2017 12:42:34 +0200 Subject: [PATCH v2 5/7] add regression test --- src/test/regress/expected/indexing.out | 204 +++++++++++++++++++++++++++++++++ src/test/regress/parallel_schedule | 2 +- src/test/regress/serial_schedule | 1 + src/test/regress/sql/indexing.sql | 81 +++++++++++++ 4 files changed, 287 insertions(+), 1 deletion(-) create mode 100644 src/test/regress/expected/indexing.out create mode 100644 src/test/regress/sql/indexing.sql diff --git a/src/test/regress/expected/indexing.out b/src/test/regress/expected/indexing.out new file mode 100644 index 0000000000..a0615fa3e6 --- /dev/null +++ b/src/test/regress/expected/indexing.out @@ -0,0 +1,204 @@ +-- Creating an index on a partitioned table makes the partitions +-- automatically get the index +create table idxpart (a int, b int, c text) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (10); +create table idxpart2 partition of idxpart for values from (10) to (100) + partition by range (b); +create table idxpart21 partition of idxpart2 for values from (0) to (100); +create index on idxpart (a); +select relname, relkind, indparentidx::regclass + from pg_class left join pg_index on (indexrelid = oid) + where relname like 'idxpart%' order by relname; + relname | relkind | indparentidx +-----------------+---------+---------------- + idxpart | p | + idxpart1 | r | + idxpart1_a_idx | i | idxpart_a_idx + idxpart2 | p | + idxpart21 | r | + idxpart21_a_idx | i | idxpart2_a_idx + idxpart2_a_idx | I | idxpart_a_idx + idxpart_a_idx | I | - +(8 rows) + +drop table idxpart; +-- Some unsupported cases +create table idxpart (a int, b int, c text) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (10); +create unique index on idxpart (a); +ERROR: cannot create unique index on partitioned table "idxpart" +create index concurrently on idxpart (a); +ERROR: cannot create index on partitioned table "idxpart" concurrently +drop table idxpart; +-- If a table without index is attached as partition to a table with +-- an index, the index is automatically created +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +create table idxpart1 (like idxpart); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | + +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | +Partition of: idxpart FOR VALUES FROM (0) TO (10) +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_b_c_idx" btree (b, c) + +drop table idxpart; +-- Opposite case: the attached table already has the indexes, so duplicate +-- copies should not be created +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +create table idxpart1 (like idxpart including indexes); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_b_c_idx" btree (b, c) + +select relname, relkind, indparentidx::regclass + from pg_class left join pg_index on (indexrelid = oid) + where relname like 'idxpart%' order by relname; + relname | relkind | indparentidx +------------------+---------+-------------- + idxpart | p | + idxpart1 | r | + idxpart1_a_idx | i | - + idxpart1_b_c_idx | i | - + idxparti | I | - + idxparti2 | I | - +(6 rows) + +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | text | | | +Partition of: idxpart FOR VALUES FROM (0) TO (10) +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_b_c_idx" btree (b, c) + +select relname, relkind, indparentidx::regclass + from pg_class left join pg_index on (indexrelid = oid) + where relname like 'idxpart%' order by relname; + relname | relkind | indparentidx +------------------+---------+-------------- + idxpart | p | + idxpart1 | r | + idxpart1_a_idx | i | idxparti + idxpart1_b_c_idx | i | idxparti2 + idxparti | I | - + idxparti2 | I | - +(6 rows) + +drop table idxpart; +-- Make sure the partition columns are mapped correctly +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (c, b); +create table idxpart1 (c text, a int, b int); +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + c | text | | | + a | integer | | | + b | integer | | | +Partition of: idxpart FOR VALUES FROM (0) TO (10) +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_c_b_idx" btree (c, b) + +drop table idxpart; +-- Make sure things work if either table has dropped columns +create table idxpart (a int, b int, c int, d int) partition by range (a); +alter table idxpart drop column c; +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, d); +create table idxpart1 (like idxpart); +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + d | integer | | | +Partition of: idxpart FOR VALUES FROM (0) TO (10) +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_b_d_idx" btree (b, d) + +select attrelid::regclass, attname, attnum from pg_attribute + where attrelid in ('idxpart'::regclass, 'idxpart1'::regclass) and attnum > 0 + order by attrelid::regclass, attnum; + attrelid | attname | attnum +----------+------------------------------+-------- + idxpart | a | 1 + idxpart | b | 2 + idxpart | ........pg.dropped.3........ | 3 + idxpart | d | 4 + idxpart1 | a | 1 + idxpart1 | b | 2 + idxpart1 | d | 3 +(7 rows) + +drop table idxpart; +create table idxpart (a int, b int, c int) partition by range (a); +create table idxpart1 (zz int, like idxpart, aa int); +alter table idxpart1 drop column zz, drop column aa; +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 + Table "public.idxpart1" + Column | Type | Collation | Nullable | Default +--------+---------+-----------+----------+--------- + a | integer | | | + b | integer | | | + c | integer | | | +Partition of: idxpart FOR VALUES FROM (0) TO (10) +Indexes: + "idxpart1_a_idx" btree (a) + "idxpart1_b_c_idx" btree (b, c) + +select attrelid::regclass, attname, attnum from pg_attribute + where attrelid in ('idxpart'::regclass, 'idxpart1'::regclass) and attnum > 0 + order by attrelid::regclass, attnum; + attrelid | attname | attnum +----------+------------------------------+-------- + idxpart | a | 1 + idxpart | b | 2 + idxpart | c | 3 + idxpart1 | ........pg.dropped.1........ | 1 + idxpart1 | a | 2 + idxpart1 | b | 3 + idxpart1 | c | 4 + idxpart1 | ........pg.dropped.5........ | 5 +(8 rows) + +drop table idxpart; diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index aa5e6af621..591e7da337 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -116,7 +116,7 @@ test: plancache limit plpgsql copy2 temp domain rangefuncs prepare without_oid c # ---------- # Another group of parallel tests # ---------- -test: identity partition_join reloptions +test: identity partition_join reloptions indexing # event triggers cannot run concurrently with any test that runs DDL test: event_trigger diff --git a/src/test/regress/serial_schedule b/src/test/regress/serial_schedule index 3866314a92..d5b5ec8472 100644 --- a/src/test/regress/serial_schedule +++ b/src/test/regress/serial_schedule @@ -181,5 +181,6 @@ test: xml test: identity test: partition_join test: reloptions +test: indexing test: event_trigger test: stats diff --git a/src/test/regress/sql/indexing.sql b/src/test/regress/sql/indexing.sql new file mode 100644 index 0000000000..944b850099 --- /dev/null +++ b/src/test/regress/sql/indexing.sql @@ -0,0 +1,81 @@ +-- Creating an index on a partitioned table makes the partitions +-- automatically get the index +create table idxpart (a int, b int, c text) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (10); +create table idxpart2 partition of idxpart for values from (10) to (100) + partition by range (b); +create table idxpart21 partition of idxpart2 for values from (0) to (100); +create index on idxpart (a); +select relname, relkind, indparentidx::regclass + from pg_class left join pg_index on (indexrelid = oid) + where relname like 'idxpart%' order by relname; +drop table idxpart; + +-- Some unsupported cases +create table idxpart (a int, b int, c text) partition by range (a); +create table idxpart1 partition of idxpart for values from (0) to (10); +create unique index on idxpart (a); +create index concurrently on idxpart (a); +drop table idxpart; + +-- If a table without index is attached as partition to a table with +-- an index, the index is automatically created +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +create table idxpart1 (like idxpart); +\d idxpart1 +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 +drop table idxpart; + +-- Opposite case: the attached table already has the indexes, so duplicate +-- copies should not be created +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +create table idxpart1 (like idxpart including indexes); +\d idxpart1 +select relname, relkind, indparentidx::regclass + from pg_class left join pg_index on (indexrelid = oid) + where relname like 'idxpart%' order by relname; +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 +select relname, relkind, indparentidx::regclass + from pg_class left join pg_index on (indexrelid = oid) + where relname like 'idxpart%' order by relname; +drop table idxpart; + +-- Make sure the partition columns are mapped correctly +create table idxpart (a int, b int, c text) partition by range (a); +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (c, b); +create table idxpart1 (c text, a int, b int); +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 +drop table idxpart; + +-- Make sure things work if either table has dropped columns +create table idxpart (a int, b int, c int, d int) partition by range (a); +alter table idxpart drop column c; +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, d); +create table idxpart1 (like idxpart); +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 +select attrelid::regclass, attname, attnum from pg_attribute + where attrelid in ('idxpart'::regclass, 'idxpart1'::regclass) and attnum > 0 + order by attrelid::regclass, attnum; +drop table idxpart; + +create table idxpart (a int, b int, c int) partition by range (a); +create table idxpart1 (zz int, like idxpart, aa int); +alter table idxpart1 drop column zz, drop column aa; +create index idxparti on idxpart (a); +create index idxparti2 on idxpart (b, c); +alter table idxpart attach partition idxpart1 for values from (0) to (10); +\d idxpart1 +select attrelid::regclass, attname, attnum from pg_attribute + where attrelid in ('idxpart'::regclass, 'idxpart1'::regclass) and attnum > 0 + order by attrelid::regclass, attnum; +drop table idxpart; -- 2.11.0