]> granicus.if.org Git - postgresql/commitdiff
doc: Reword restriction on partition keys in unique indexes
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 12 Mar 2018 16:28:52 +0000 (13:28 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 12 Mar 2018 16:32:28 +0000 (13:32 -0300)
New wording from David G. Johnston, who noticed the unreadable original
also.  Include his suggested test case as well.

Fix a typo I noticed elsewhere while doing this.

Discussion: https://postgr.es/m/CAKFQuwY4Ld7ecxL_KAmaxwt0FUu5VcPPN2L4dh+3BeYbrdBa5g@mail.gmail.com

doc/src/sgml/ref/create_table.sgml
src/test/regress/expected/alter_table.out
src/test/regress/expected/indexing.out
src/test/regress/sql/alter_table.sql
src/test/regress/sql/indexing.sql

index 9e8e9d8f1cd01e802e175c2cf645ed2d38154e96..14a43b45e9acfc10ac75febe2c9d35bbb6c5fb3c 100644 (file)
@@ -791,11 +791,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
      </para>
 
      <para>
-      When used on partitioned tables, unique constraints must include all the
-      columns of the partition key.
-      If any partitions are in turn partitioned, all columns of each partition
-      key are considered at each level below the <literal>UNIQUE</literal>
-      constraint.
+      When establishing a unique constraint for a multi-level partition
+      hierarchy, all the columns in the partition key of the target
+      partitioned table, as well as those of all its descendant partitioned
+      tables, must be included in the constraint definition.
      </para>
     </listitem>
    </varlistentry>
index ccd2c38dbc9876c2c4bc214450b2b2d234cc90f6..04838dfad1668c15f5f593e6fa040334fff04f55 100644 (file)
@@ -3646,7 +3646,7 @@ ALTER TABLE list_parted2 ATTACH PARTITION list_parted2 FOR VALUES IN (0);
 ERROR:  circular inheritance not allowed
 DETAIL:  "list_parted2" is already a child of "list_parted2".
 -- If a partitioned table being created or an existing table being attached
--- as a paritition does not have a constraint that would allow validation scan
+-- as a partition does not have a constraint that would allow validation scan
 -- to be skipped, but an individual partition does, then the partition's
 -- validation scan is skipped.
 CREATE TABLE quuux (a int, b text) PARTITION BY LIST (a);
index 375f55b3378f264480944d89d4b0ef1121cfa3d8..3fa47cba968b18ca56590c8a0c90512943ba3652 100644 (file)
@@ -885,6 +885,14 @@ for values from (0) to (1000) partition by range (b); -- fail
 ERROR:  insufficient columns in PRIMARY KEY constraint definition
 DETAIL:  PRIMARY KEY constraint on table "idxpart2" lacks column "b" which is part of the partition key.
 drop table idxpart;
+-- Ditto for the ATTACH PARTITION case
+create table idxpart (a int primary key, b int) partition by range (a);
+create table idxpart1 (a int not null, b int, primary key (a, b))
+  partition by range (a, b);
+alter table idxpart attach partition idxpart1 for values from (1) to (1000);
+ERROR:  insufficient columns in PRIMARY KEY constraint definition
+DETAIL:  PRIMARY KEY constraint on table "idxpart1" lacks column "b" which is part of the partition key.
+DROP TABLE idxpart, idxpart1;
 -- Multi-layer partitioning works correctly in this case:
 create table idxpart (a int, b int, primary key (a, b)) partition by range (a);
 create table idxpart2 partition of idxpart for values from (0) to (1000) partition by range (b);
index b73f523e8ab9652ef32a5664db0c8a2a43805c50..66f5e50d97c80ec1bdd6c2bc57895d353c2cebf9 100644 (file)
@@ -2348,7 +2348,7 @@ ALTER TABLE part_5 ATTACH PARTITION list_parted2 FOR VALUES IN ('b');
 ALTER TABLE list_parted2 ATTACH PARTITION list_parted2 FOR VALUES IN (0);
 
 -- If a partitioned table being created or an existing table being attached
--- as a paritition does not have a constraint that would allow validation scan
+-- as a partition does not have a constraint that would allow validation scan
 -- to be skipped, but an individual partition does, then the partition's
 -- validation scan is skipped.
 CREATE TABLE quuux (a int, b text) PARTITION BY LIST (a);
index f3d0387f34f628eed349854e2a4c4c3d7385de62..902d8c59ca9d960ebb0da188f4830fadc0b896d8 100644 (file)
@@ -450,6 +450,13 @@ create table idxpart2 partition of idxpart
 for values from (0) to (1000) partition by range (b); -- fail
 drop table idxpart;
 
+-- Ditto for the ATTACH PARTITION case
+create table idxpart (a int primary key, b int) partition by range (a);
+create table idxpart1 (a int not null, b int, primary key (a, b))
+  partition by range (a, b);
+alter table idxpart attach partition idxpart1 for values from (1) to (1000);
+DROP TABLE idxpart, idxpart1;
+
 -- Multi-layer partitioning works correctly in this case:
 create table idxpart (a int, b int, primary key (a, b)) partition by range (a);
 create table idxpart2 partition of idxpart for values from (0) to (1000) partition by range (b);