Thread: unique, partitioned index fails to distinguish index key fromINCLUDEd columns
unique, partitioned index fails to distinguish index key fromINCLUDEd columns
From
Justin Pryzby
Date:
eb7ed3f3063401496e4aa4bd68fa33f0be31a72f Allow UNIQUE indexes on partitioned tables 8224de4f42ccf98e08db07b43d52fed72f962ebb Indexes with INCLUDE columns and their support in B-tree postgres=# CREATE TABLE t(i int,j int) PARTITION BY LIST (i); postgres=# CREATE TABLE t1 PARTITION OF t FOR VALUES IN (1); postgres=# CREATE TABLE t2 PARTITION OF t FOR VALUES IN (2); -- Correctly errors postgres=# CREATE UNIQUE INDEX ON t(j); ERROR: insufficient columns in UNIQUE constraint definition DETAIL: UNIQUE constraint on table "t" lacks column "i" which is part of the partition key. -- Fails to error postgres=# CREATE UNIQUE INDEX ON t(j) INCLUDE(i); -- Fail to enforce uniqueness across partitions due to failure to enforce inclusion of partition key in index KEY postgres=# INSERT INTO t VALUES(1,1); postgres=# INSERT INTO t VALUES(2,1); postgres=# SELECT * FROM t; i | j ---+--- 1 | 1 2 | 1 (2 rows) I found this thread appears to have been close to discovering the issue ~9 months ago. https://www.postgresql.org/message-id/flat/CAJGNTeO%3DBguEyG8wxMpU_Vgvg3nGGzy71zUQ0RpzEn_mb0bSWA%40mail.gmail.com Justin
Re: unique, partitioned index fails to distinguish index key fromINCLUDEd columns
From
Alvaro Herrera
Date:
On 2019-Jan-09, Justin Pryzby wrote: > -- Fails to error > postgres=# CREATE UNIQUE INDEX ON t(j) INCLUDE(i); > > -- Fail to enforce uniqueness across partitions due to failure to enforce inclusion of partition key in index KEY > postgres=# INSERT INTO t VALUES(1,1); > postgres=# INSERT INTO t VALUES(2,1); Doh. Fix pushed. Commit 8224de4f42cc should have changed one appearance of ii_NumIndexAttrs to ii_NumIndexKeyAttrs, but because of the nature of concurrent development, nobody noticed. Thanks for reporting. -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Re: unique, partitioned index fails to distinguish index key fromINCLUDEd columns
From
Justin Pryzby
Date:
On Mon, Jan 14, 2019 at 07:31:07PM -0300, Alvaro Herrera wrote: > On 2019-Jan-09, Justin Pryzby wrote: > > > -- Fails to error > > postgres=# CREATE UNIQUE INDEX ON t(j) INCLUDE(i); > > > > -- Fail to enforce uniqueness across partitions due to failure to enforce inclusion of partition key in index KEY > > postgres=# INSERT INTO t VALUES(1,1); > > postgres=# INSERT INTO t VALUES(2,1); > > Doh. Fix pushed. Commit 8224de4f42cc should have changed one > appearance of ii_NumIndexAttrs to ii_NumIndexKeyAttrs, but because of > the nature of concurrent development, nobody noticed. I figured as much - I thought to test this while trying to fall asleep, without knowing they were developed in parallel. Should backpatch to v11 ? 0ad41cf537ea5f076273fcffa4c83a184bd9910f Thanks, Justin
Re: unique, partitioned index fails to distinguish index key fromINCLUDEd columns
From
Alvaro Herrera
Date:
On 2019-Jan-14, Justin Pryzby wrote: > On Mon, Jan 14, 2019 at 07:31:07PM -0300, Alvaro Herrera wrote: > > Doh. Fix pushed. Commit 8224de4f42cc should have changed one > > appearance of ii_NumIndexAttrs to ii_NumIndexKeyAttrs, but because of > > the nature of concurrent development, nobody noticed. > > I figured as much - I thought to test this while trying to fall asleep, > without knowing they were developed in parallel. :-) > Should backpatch to v11 ? > 0ad41cf537ea5f076273fcffa4c83a184bd9910f Yep, already done (src/tools/git_changelog in master): Author: Alvaro Herrera <alvherre@alvh.no-ip.org> Branch: master [0ad41cf53] 2019-01-14 19:28:10 -0300 Branch: REL_11_STABLE [74aa7e046] 2019-01-14 19:25:19 -0300 Fix unique INCLUDE indexes on partitioned tables We were considering the INCLUDE columns as part of the key, allowing unicity-violating rows to be inserted in different partitions. Concurrent development conflict in eb7ed3f30634 and 8224de4f42cc. Reported-by: Justin Pryzby Discussion: https://postgr.es/m/20190109065109.GA4285@telsasoft.com -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services