Re: pgsql: Allow UNIQUE indexes on partitioned tables

From: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: pgsql: Allow UNIQUE indexes on partitioned tables
Date: 2018-02-19 22:16:48
Message-ID: CAKFQuwY4Ld7ecxL_KAmaxwt0FUu5VcPPN2L4dh+3BeYbrdBa5g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers pgsql-hackers

I found the following change to be confusing.

/doc/src/sgml/ref/alter_table.sgml
+ <para>
+ Additional restrictions apply when unique indexes are applied to
+ partitioned tables; see <xref linkend="sql-createtable" />.
+ </para>

That paragraph appears in the section covering "ALTER TABLE name ADD
table_constraint_using_index"

However, the code says:

/src/backend/commands/tablecmds.c
+ /*
+ * Doing this on partitioned tables is not a simple feature to
implement,
+ * so let's punt for now.
+ */
+ if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
+ ereport(ERROR,
+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+ errmsg("ALTER TABLE / ADD CONSTRAINT USING INDEX is not
supported on partitioned tables")));

I was expecting the doc for ADD CONSTRAINT USING INDEX to note the
limitation explicitly - in lieu of the above paragraph.

Also, I cannot reason out what the following limitation means:

/doc/src/sgml/ref/create_table.sgml
+ If any partitions are in turn partitioned, all columns of each
partition
+ key are considered at each level below the <literal>UNIQUE</literal>
+ constraint.

As an aside, adding a link to "Data Definiton/Table Partitioning" from at
least CREATE TABLE ... PARTITION BY; and swapping "PARTITION BY" and
"PARTITION OF" in the Parameters section of that page - one must partition
by a table before one can partition it (and also the synopsis lists them in
the BY before OF order), would be helpful.

David J.

On Mon, Feb 19, 2018 at 1:40 PM, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
wrote:

> Allow UNIQUE indexes on partitioned tables
>
> If we restrict unique constraints on partitioned tables so that they
> must always include the partition key, then our standard approach to
> unique indexes already works --- each unique key is forced to exist
> within a single partition, so enforcing the unique restriction in each
> index individually is enough to have it enforced globally. Therefore we
> can implement unique indexes on partitions by simply removing a few
> restrictions (and adding others.)
>
> Discussion: https://postgr.es/m/20171222212921.hi6hg6pem2w2t36z@alvherre.
> pgsql
> Discussion: https://postgr.es/m/20171229230607.3iib6b62fn3uaf47@alvherre.
> pgsql
> Reviewed-by: Simon Riggs, Jesper Pedersen, Peter Eisentraut, Jaime
> Casanova, Amit Langote
>
> Branch
> ------
> master
>
> Details
> -------
> https://git.postgresql.org/pg/commitdiff/eb7ed3f3063401496e4aa4bd68fa33
> f0be31a72f
>
> Modified Files
> --------------
> doc/src/sgml/ddl.sgml | 9 +-
> doc/src/sgml/ref/alter_table.sgml | 15 +-
> doc/src/sgml/ref/create_index.sgml | 5 +
> doc/src/sgml/ref/create_table.sgml | 18 +-
> src/backend/bootstrap/bootparse.y | 2 +
> src/backend/catalog/index.c | 50 ++++-
> src/backend/catalog/pg_constraint.c | 76 +++++++
> src/backend/catalog/toasting.c | 4 +-
> src/backend/commands/indexcmds.c | 125 +++++++++--
> src/backend/commands/tablecmds.c | 71 ++++++-
> src/backend/parser/analyze.c | 7 +
> src/backend/parser/parse_utilcmd.c | 31 +--
> src/backend/tcop/utility.c | 1 +
> src/bin/pg_dump/t/002_pg_dump.pl | 65 ++++++
> src/include/catalog/index.h | 5 +-
> src/include/catalog/pg_constraint_fn.h | 4 +-
> src/include/commands/defrem.h | 1 +
> src/include/parser/parse_utilcmd.h | 3 +-
> src/test/regress/expected/alter_table.out | 8 -
> src/test/regress/expected/create_index.out | 6 +
> src/test/regress/expected/create_table.out | 12 --
> src/test/regress/expected/indexing.out | 294
> +++++++++++++++++++++++++-
> src/test/regress/expected/insert_conflict.out | 2 +-
> src/test/regress/sql/alter_table.sql | 2 -
> src/test/regress/sql/create_index.sql | 6 +
> src/test/regress/sql/create_table.sql | 8 -
> src/test/regress/sql/indexing.sql | 172 ++++++++++++++-
> 27 files changed, 907 insertions(+), 95 deletions(-)
>
>

In response to

Responses

Browse pgsql-committers by date

  From Date Subject
Next Message Alvaro Herrera 2018-02-20 01:26:41 pgsql: Fix crash in pg_replication_slot_advance
Previous Message Tom Lane 2018-02-19 21:00:41 pgsql: Fix misbehavior of CTE-used-in-a-subplan during EPQ rechecks.

Browse pgsql-hackers by date

  From Date Subject
Next Message Oleg Bartunov 2018-02-19 22:28:43 Re: [PROPOSAL] Nepali Snowball dictionary
Previous Message Claudio Freire 2018-02-19 21:50:40 Re: [HACKERS] Vacuum: allow usage of more than 1GB of work mem