]> granicus.if.org Git - postgresql/commitdiff
Remove undocumented restriction against duplicate partition key columns.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 19 Jul 2018 19:41:46 +0000 (15:41 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 19 Jul 2018 19:41:46 +0000 (15:41 -0400)
transformPartitionSpec rejected duplicate simple partition columns
(e.g., "PARTITION BY RANGE (x,x)") but paid no attention to expression
columns, resulting in inconsistent behavior.  Worse, cases like
"PARTITION BY RANGE (x,(x))") were accepted but would then result in
dump/reload failures, since the expression (x) would get simplified
to a plain column later.

There seems no better reason for this restriction than there was for
the one against duplicate included index columns (cf commit 701fd0bbc),
so let's just remove it.

Back-patch to v10 where this code was added.

Report and patch by Yugo Nagata.

Discussion: https://postgr.es/m/20180712165939.36b12aff.nagata@sraoss.co.jp

src/backend/commands/tablecmds.c
src/test/regress/expected/create_table.out
src/test/regress/sql/create_table.sql

index 4d3fc3098c92a6b595a2e39d264a8de78bf92f64..eb2d33dd86dcd0137bb65f9071273c9ad123e8b2 100644 (file)
@@ -13628,21 +13628,6 @@ transformPartitionSpec(Relation rel, PartitionSpec *partspec, char *strategy)
        foreach(l, partspec->partParams)
        {
                PartitionElem *pelem = castNode(PartitionElem, lfirst(l));
-               ListCell   *lc;
-
-               /* Check for PARTITION BY ... (foo, foo) */
-               foreach(lc, newspec->partParams)
-               {
-                       PartitionElem *pparam = castNode(PartitionElem, lfirst(lc));
-
-                       if (pelem->name && pparam->name &&
-                               strcmp(pelem->name, pparam->name) == 0)
-                               ereport(ERROR,
-                                               (errcode(ERRCODE_DUPLICATE_COLUMN),
-                                                errmsg("column \"%s\" appears more than once in partition key",
-                                                               pelem->name),
-                                                parser_errposition(pstate, pelem->location)));
-               }
 
                if (pelem->expr)
                {
index 8fdbca13458690746de1e3183f54680f91dc96a4..8927b21ba2cc2404d20e036b1a989b2b2ca4d04a 100644 (file)
@@ -288,11 +288,6 @@ CREATE TABLE partitioned (
 ERROR:  exclusion constraints are not supported on partitioned tables
 LINE 3:  EXCLUDE USING gist (a WITH &&)
          ^
--- prevent column from being used twice in the partition key
-CREATE TABLE partitioned (
-       a int
-) PARTITION BY RANGE (a, a);
-ERROR:  column "a" appears more than once in partition key
 -- prevent using prohibited expressions in the key
 CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE;
 CREATE TABLE partitioned (
index 78944950fef52ad7af65f178ff5238c520c7da85..81fa7658b0dd38730f179a877f7eb35cdd28ca51 100644 (file)
@@ -303,11 +303,6 @@ CREATE TABLE partitioned (
        EXCLUDE USING gist (a WITH &&)
 ) PARTITION BY RANGE (a);
 
--- prevent column from being used twice in the partition key
-CREATE TABLE partitioned (
-       a int
-) PARTITION BY RANGE (a, 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 (