mirror of
https://github.com/postgres/postgres.git
synced 2025-06-17 17:02:08 +03:00
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
This commit is contained in:
@ -712,12 +712,6 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
|
||||
errmsg("primary key constraints are not supported on foreign tables"),
|
||||
parser_errposition(cxt->pstate,
|
||||
constraint->location)));
|
||||
if (cxt->ispartitioned)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("primary key constraints are not supported on partitioned tables"),
|
||||
parser_errposition(cxt->pstate,
|
||||
constraint->location)));
|
||||
/* FALL THRU */
|
||||
|
||||
case CONSTR_UNIQUE:
|
||||
@ -727,12 +721,6 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
|
||||
errmsg("unique constraints are not supported on foreign tables"),
|
||||
parser_errposition(cxt->pstate,
|
||||
constraint->location)));
|
||||
if (cxt->ispartitioned)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("unique constraints are not supported on partitioned tables"),
|
||||
parser_errposition(cxt->pstate,
|
||||
constraint->location)));
|
||||
if (constraint->keys == NIL)
|
||||
constraint->keys = list_make1(makeString(column->colname));
|
||||
cxt->ixconstraints = lappend(cxt->ixconstraints, constraint);
|
||||
@ -829,12 +817,6 @@ transformTableConstraint(CreateStmtContext *cxt, Constraint *constraint)
|
||||
errmsg("primary key constraints are not supported on foreign tables"),
|
||||
parser_errposition(cxt->pstate,
|
||||
constraint->location)));
|
||||
if (cxt->ispartitioned)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("primary key constraints are not supported on partitioned tables"),
|
||||
parser_errposition(cxt->pstate,
|
||||
constraint->location)));
|
||||
cxt->ixconstraints = lappend(cxt->ixconstraints, constraint);
|
||||
break;
|
||||
|
||||
@ -845,12 +827,6 @@ transformTableConstraint(CreateStmtContext *cxt, Constraint *constraint)
|
||||
errmsg("unique constraints are not supported on foreign tables"),
|
||||
parser_errposition(cxt->pstate,
|
||||
constraint->location)));
|
||||
if (cxt->ispartitioned)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||
errmsg("unique constraints are not supported on partitioned tables"),
|
||||
parser_errposition(cxt->pstate,
|
||||
constraint->location)));
|
||||
cxt->ixconstraints = lappend(cxt->ixconstraints, constraint);
|
||||
break;
|
||||
|
||||
@ -1192,7 +1168,7 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla
|
||||
/* Build CREATE INDEX statement to recreate the parent_index */
|
||||
index_stmt = generateClonedIndexStmt(cxt->relation, InvalidOid,
|
||||
parent_index,
|
||||
attmap, tupleDesc->natts);
|
||||
attmap, tupleDesc->natts, NULL);
|
||||
|
||||
/* Copy comment on index, if requested */
|
||||
if (table_like_clause->options & CREATE_TABLE_LIKE_COMMENTS)
|
||||
@ -1275,7 +1251,7 @@ transformOfType(CreateStmtContext *cxt, TypeName *ofTypename)
|
||||
*/
|
||||
IndexStmt *
|
||||
generateClonedIndexStmt(RangeVar *heapRel, Oid heapRelid, Relation source_idx,
|
||||
const AttrNumber *attmap, int attmap_length)
|
||||
const AttrNumber *attmap, int attmap_length, Oid *constraintOid)
|
||||
{
|
||||
Oid source_relid = RelationGetRelid(source_idx);
|
||||
HeapTuple ht_idxrel;
|
||||
@ -1373,6 +1349,9 @@ generateClonedIndexStmt(RangeVar *heapRel, Oid heapRelid, Relation source_idx,
|
||||
HeapTuple ht_constr;
|
||||
Form_pg_constraint conrec;
|
||||
|
||||
if (constraintOid)
|
||||
*constraintOid = constraintId;
|
||||
|
||||
ht_constr = SearchSysCache1(CONSTROID,
|
||||
ObjectIdGetDatum(constraintId));
|
||||
if (!HeapTupleIsValid(ht_constr))
|
||||
|
Reference in New Issue
Block a user