Commit 24097167 authored by Tom Lane's avatar Tom Lane

Remove undocumented restriction against duplicate partition key columns.

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 701fd0bb),
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
parent 90371a24
...@@ -13628,21 +13628,6 @@ transformPartitionSpec(Relation rel, PartitionSpec *partspec, char *strategy) ...@@ -13628,21 +13628,6 @@ transformPartitionSpec(Relation rel, PartitionSpec *partspec, char *strategy)
foreach(l, partspec->partParams) foreach(l, partspec->partParams)
{ {
PartitionElem *pelem = castNode(PartitionElem, lfirst(l)); 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) if (pelem->expr)
{ {
......
...@@ -288,11 +288,6 @@ CREATE TABLE partitioned ( ...@@ -288,11 +288,6 @@ CREATE TABLE partitioned (
ERROR: exclusion constraints are not supported on partitioned tables ERROR: exclusion constraints are not supported on partitioned tables
LINE 3: EXCLUDE USING gist (a WITH &&) 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 -- prevent using prohibited expressions in the key
CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE;
CREATE TABLE partitioned ( CREATE TABLE partitioned (
......
...@@ -303,11 +303,6 @@ CREATE TABLE partitioned ( ...@@ -303,11 +303,6 @@ CREATE TABLE partitioned (
EXCLUDE USING gist (a WITH &&) EXCLUDE USING gist (a WITH &&)
) PARTITION BY RANGE (a); ) 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 -- prevent using prohibited expressions in the key
CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE; CREATE FUNCTION retset (a int) RETURNS SETOF int AS $$ SELECT 1; $$ LANGUAGE SQL IMMUTABLE;
CREATE TABLE partitioned ( CREATE TABLE partitioned (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment