diff options
Diffstat (limited to 'src/test')
-rw-r--r-- | src/test/regress/expected/alter_table.out | 7 | ||||
-rw-r--r-- | src/test/regress/expected/create_table.out | 8 | ||||
-rw-r--r-- | src/test/regress/expected/indexing.out | 73 | ||||
-rw-r--r-- | src/test/regress/sql/alter_table.sql | 5 | ||||
-rw-r--r-- | src/test/regress/sql/create_table.sql | 6 | ||||
-rw-r--r-- | src/test/regress/sql/indexing.sql | 57 |
6 files changed, 116 insertions, 40 deletions
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 05351cb1a43..cd814ff321c 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -3834,16 +3834,11 @@ Referenced by: TABLE "ataddindex" CONSTRAINT "ataddindex_ref_id_fkey" FOREIGN KEY (ref_id) REFERENCES ataddindex(id) DROP TABLE ataddindex; --- unsupported constraint types for partitioned tables +-- cannot drop column that is part of the partition key CREATE TABLE partitioned ( a int, b int ) PARTITION BY RANGE (a, (a+b+1)); -ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); -ERROR: exclusion constraints are not supported on partitioned tables -LINE 1: ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); - ^ --- cannot drop column that is part of the partition key ALTER TABLE partitioned DROP COLUMN a; ERROR: cannot drop column "a" because it is part of the partition key of relation "partitioned" ALTER TABLE partitioned ALTER COLUMN a TYPE char(5); diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 1c3ef2b05a8..2a0902ece24 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -153,14 +153,6 @@ CREATE TABLE partitioned ( a2 int ) PARTITION BY LIST (a1, a2); -- fail ERROR: cannot use "list" partition strategy with more than one column --- unsupported constraint type for partitioned tables -CREATE TABLE partitioned ( - a int, - EXCLUDE USING gist (a WITH &&) -) PARTITION BY RANGE (a); -ERROR: exclusion constraints are not supported on partitioned tables -LINE 3: EXCLUDE USING gist (a WITH &&) - ^ -- prevent using prohibited expressions in the key CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; CREATE TABLE partitioned ( diff --git a/src/test/regress/expected/indexing.out b/src/test/regress/expected/indexing.out index 3e5645c2ab6..2be8ffa7ec4 100644 --- a/src/test/regress/expected/indexing.out +++ b/src/test/regress/expected/indexing.out @@ -986,11 +986,32 @@ DETAIL: PRIMARY KEY constraint on table "idxpart" lacks column "a" which is par -- OK if you use them in some other order create table idxpart (a int, b int, c text, primary key (a, b, c)) partition by range (b, c, a); drop table idxpart; --- not other types of index-based constraints -create table idxpart (a int, exclude (a with = )) partition by range (a); -ERROR: exclusion constraints are not supported on partitioned tables -LINE 1: create table idxpart (a int, exclude (a with = )) partition ... - ^ +-- OK to add an exclusion constraint if partitioning by its equal column +create table idxpart (a int4range, exclude USING GIST (a with = )) partition by range (a); +drop table idxpart; +-- OK more than one equal column +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with =)) partition by range (a, b); +drop table idxpart; +-- OK with more than one equal column: constraint is a proper superset of partition key +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with =)) partition by range (a); +drop table idxpart; +-- Not OK more than one equal column: partition keys are a proper superset of constraint +create table idxpart (a int4range, b int4range, exclude USING GIST (a with = )) partition by range (a, b); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: EXCLUDE constraint on table "idxpart" lacks column "b" which is part of the partition key. +-- Not OK with just -|- +create table idxpart (a int4range, exclude USING GIST (a with -|- )) partition by range (a); +ERROR: cannot match partition key to index on column "a" using non-equal operator "-|-" +-- OK with equals and &&, and equals is the partition key +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with &&)) partition by range (a); +drop table idxpart; +-- Not OK with equals and &&, and equals is not the partition key +create table idxpart (a int4range, b int4range, c int4range, exclude USING GIST (b with =, c with &&)) partition by range (a); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: EXCLUDE constraint on table "idxpart" lacks column "a" which is part of the partition key. +-- OK more than one equal column and a && column +create table idxpart (a int4range, b int4range, c int4range, exclude USING GIST (a with =, b with =, c with &&)) partition by range (a, b); +drop table idxpart; -- no expressions in partition key for PK/UNIQUE create table idxpart (a int primary key, b int) partition by range ((b + a)); ERROR: unsupported PRIMARY KEY constraint with partition key definition @@ -1047,12 +1068,42 @@ Indexes: Number of partitions: 0 drop table idxpart; --- Exclusion constraints cannot be added -create table idxpart (a int, b int) partition by range (a); -alter table idxpart add exclude (a with =); -ERROR: exclusion constraints are not supported on partitioned tables -LINE 1: alter table idxpart add exclude (a with =); - ^ +-- Exclusion constraints can be added if partitioning by their equal column +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =); +drop table idxpart; +-- OK more than one equal column +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =, b with =); +drop table idxpart; +-- OK with more than one equal column: constraint is a proper superset of partition key +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =, b with =); +drop table idxpart; +-- Not OK more than one equal column: partition keys are a proper superset of constraint +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: EXCLUDE constraint on table "idxpart" lacks column "b" which is part of the partition key. +drop table idxpart; +-- Not OK with just -|- +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with -|-); +ERROR: cannot match partition key to index on column "a" using non-equal operator "-|-" +drop table idxpart; +-- OK with equals and &&, and equals is the partition key +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =, b with &&); +drop table idxpart; +-- Not OK with equals and &&, and equals is not the partition key +create table idxpart (a int4range, b int4range, c int4range) partition by range (a); +alter table idxpart add exclude USING GIST (b with =, c with &&); +ERROR: unique constraint on partitioned table must include all partitioning columns +DETAIL: EXCLUDE constraint on table "idxpart" lacks column "a" which is part of the partition key. +drop table idxpart; +-- OK more than one equal column and a && column +create table idxpart (a int4range, b int4range, c int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =, b with =, c with &&); drop table idxpart; -- When (sub)partitions are created, they also contain the constraint create table idxpart (a int, b int, primary key (a, b)) partition by range (a, b); diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 58ea20ac3dc..ff8c4984191 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -2342,14 +2342,11 @@ ALTER TABLE ataddindex \d ataddindex DROP TABLE ataddindex; --- unsupported constraint types for partitioned tables +-- cannot drop column that is part of the partition key CREATE TABLE partitioned ( a int, b int ) PARTITION BY RANGE (a, (a+b+1)); -ALTER TABLE partitioned ADD EXCLUDE USING gist (a WITH &&); - --- cannot drop column that is part of the partition key ALTER TABLE partitioned DROP COLUMN a; ALTER TABLE partitioned ALTER COLUMN a TYPE char(5); ALTER TABLE partitioned DROP COLUMN b; diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index 93ccf77d4a1..82ada476618 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -106,12 +106,6 @@ CREATE TABLE partitioned ( a2 int ) PARTITION BY LIST (a1, a2); -- fail --- unsupported constraint type for partitioned tables -CREATE TABLE partitioned ( - a int, - EXCLUDE USING gist (a WITH &&) -) PARTITION BY RANGE (a); - -- prevent using prohibited expressions in the key CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; CREATE TABLE partitioned ( diff --git a/src/test/regress/sql/indexing.sql b/src/test/regress/sql/indexing.sql index d6e5a06d95a..b69c41832ca 100644 --- a/src/test/regress/sql/indexing.sql +++ b/src/test/regress/sql/indexing.sql @@ -483,8 +483,27 @@ create table idxpart (a int, b int primary key) partition by range (b, a); create table idxpart (a int, b int, c text, primary key (a, b, c)) partition by range (b, c, a); drop table idxpart; --- not other types of index-based constraints -create table idxpart (a int, exclude (a with = )) partition by range (a); +-- OK to add an exclusion constraint if partitioning by its equal column +create table idxpart (a int4range, exclude USING GIST (a with = )) partition by range (a); +drop table idxpart; +-- OK more than one equal column +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with =)) partition by range (a, b); +drop table idxpart; +-- OK with more than one equal column: constraint is a proper superset of partition key +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with =)) partition by range (a); +drop table idxpart; +-- Not OK more than one equal column: partition keys are a proper superset of constraint +create table idxpart (a int4range, b int4range, exclude USING GIST (a with = )) partition by range (a, b); +-- Not OK with just -|- +create table idxpart (a int4range, exclude USING GIST (a with -|- )) partition by range (a); +-- OK with equals and &&, and equals is the partition key +create table idxpart (a int4range, b int4range, exclude USING GIST (a with =, b with &&)) partition by range (a); +drop table idxpart; +-- Not OK with equals and &&, and equals is not the partition key +create table idxpart (a int4range, b int4range, c int4range, exclude USING GIST (b with =, c with &&)) partition by range (a); +-- OK more than one equal column and a && column +create table idxpart (a int4range, b int4range, c int4range, exclude USING GIST (a with =, b with =, c with &&)) partition by range (a, b); +drop table idxpart; -- no expressions in partition key for PK/UNIQUE create table idxpart (a int primary key, b int) partition by range ((b + a)); @@ -506,9 +525,37 @@ alter table idxpart add unique (b, a); -- this works \d idxpart drop table idxpart; --- Exclusion constraints cannot be added -create table idxpart (a int, b int) partition by range (a); -alter table idxpart add exclude (a with =); +-- Exclusion constraints can be added if partitioning by their equal column +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =); +drop table idxpart; +-- OK more than one equal column +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =, b with =); +drop table idxpart; +-- OK with more than one equal column: constraint is a proper superset of partition key +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =, b with =); +drop table idxpart; +-- Not OK more than one equal column: partition keys are a proper superset of constraint +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =); +drop table idxpart; +-- Not OK with just -|- +create table idxpart (a int4range, b int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with -|-); +drop table idxpart; +-- OK with equals and &&, and equals is the partition key +create table idxpart (a int4range, b int4range) partition by range (a); +alter table idxpart add exclude USING GIST (a with =, b with &&); +drop table idxpart; +-- Not OK with equals and &&, and equals is not the partition key +create table idxpart (a int4range, b int4range, c int4range) partition by range (a); +alter table idxpart add exclude USING GIST (b with =, c with &&); +drop table idxpart; +-- OK more than one equal column and a && column +create table idxpart (a int4range, b int4range, c int4range) partition by range (a, b); +alter table idxpart add exclude USING GIST (a with =, b with =, c with &&); drop table idxpart; -- When (sub)partitions are created, they also contain the constraint |