unique, partitioned index fails to distinguish index key from INCLUDEd columns

Started by Justin Pryzbyabout 7 years ago4 messageshackers
Jump to latest
#1Justin Pryzby
pryzby@telsasoft.com

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.
/messages/by-id/CAJGNTeO=BguEyG8wxMpU_Vgvg3nGGzy71zUQ0RpzEn_mb0bSWA@mail.gmail.com

Justin

#2Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Justin Pryzby (#1)
Re: unique, partitioned index fails to distinguish index key from INCLUDEd columns

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

#3Justin Pryzby
pryzby@telsasoft.com
In reply to: Alvaro Herrera (#2)
Re: unique, partitioned index fails to distinguish index key from INCLUDEd columns

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

#4Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Justin Pryzby (#3)
Re: unique, partitioned index fails to distinguish index key from INCLUDEd columns

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: /messages/by-id/20190109065109.GA4285@telsasoft.com

--
�lvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services