Commit a6da0047 authored by Alvaro Herrera's avatar Alvaro Herrera

Add index_get_partition convenience function

This new function simplifies some existing coding, as well as supports
future patches.

Discussion: https://postgr.es/m/201901222145.t6wws6t6vrcu@alvherre.pgsql
Reviewed-by: Amit Langote, Jesper Pedersen
parent 3d0dcc5c
...@@ -145,6 +145,42 @@ get_partition_ancestors_worker(Relation inhRel, Oid relid, List **ancestors) ...@@ -145,6 +145,42 @@ get_partition_ancestors_worker(Relation inhRel, Oid relid, List **ancestors)
get_partition_ancestors_worker(inhRel, parentOid, ancestors); get_partition_ancestors_worker(inhRel, parentOid, ancestors);
} }
/*
* index_get_partition
* Return the OID of index of the given partition that is a child
* of the given index, or InvalidOid if there isn't one.
*/
Oid
index_get_partition(Relation partition, Oid indexId)
{
List *idxlist = RelationGetIndexList(partition);
ListCell *l;
foreach(l, idxlist)
{
Oid partIdx = lfirst_oid(l);
HeapTuple tup;
Form_pg_class classForm;
bool ispartition;
tup = SearchSysCache1(RELOID, ObjectIdGetDatum(partIdx));
if (!tup)
elog(ERROR, "cache lookup failed for relation %u", partIdx);
classForm = (Form_pg_class) GETSTRUCT(tup);
ispartition = classForm->relispartition;
ReleaseSysCache(tup);
if (!ispartition)
continue;
if (get_partition_parent(lfirst_oid(l)) == indexId)
{
list_free(idxlist);
return partIdx;
}
}
return InvalidOid;
}
/* /*
* map_partition_varattnos - maps varattno of any Vars in expr from the * map_partition_varattnos - maps varattno of any Vars in expr from the
* attno's of 'from_rel' to the attno's of 'to_rel' partition, each of which * attno's of 'from_rel' to the attno's of 'to_rel' partition, each of which
......
...@@ -15649,36 +15649,18 @@ ATExecAttachPartitionIdx(List **wqueue, Relation parentIdx, RangeVar *name) ...@@ -15649,36 +15649,18 @@ ATExecAttachPartitionIdx(List **wqueue, Relation parentIdx, RangeVar *name)
static void static void
refuseDupeIndexAttach(Relation parentIdx, Relation partIdx, Relation partitionTbl) refuseDupeIndexAttach(Relation parentIdx, Relation partIdx, Relation partitionTbl)
{ {
Relation pg_inherits; Oid existingIdx;
ScanKeyData key;
HeapTuple tuple;
SysScanDesc scan;
pg_inherits = table_open(InheritsRelationId, AccessShareLock);
ScanKeyInit(&key, Anum_pg_inherits_inhparent,
BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(RelationGetRelid(parentIdx)));
scan = systable_beginscan(pg_inherits, InheritsParentIndexId, true,
NULL, 1, &key);
while (HeapTupleIsValid(tuple = systable_getnext(scan)))
{
Form_pg_inherits inhForm;
Oid tab;
inhForm = (Form_pg_inherits) GETSTRUCT(tuple); existingIdx = index_get_partition(partitionTbl,
tab = IndexGetRelation(inhForm->inhrelid, false); RelationGetRelid(parentIdx));
if (tab == RelationGetRelid(partitionTbl)) if (OidIsValid(existingIdx))
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
errmsg("cannot attach index \"%s\" as a partition of index \"%s\"", errmsg("cannot attach index \"%s\" as a partition of index \"%s\"",
RelationGetRelationName(partIdx), RelationGetRelationName(partIdx),
RelationGetRelationName(parentIdx)), RelationGetRelationName(parentIdx)),
errdetail("Another index is already attached for partition \"%s\".", errdetail("Another index is already attached for partition \"%s\".",
RelationGetRelationName(partitionTbl)))); RelationGetRelationName(partitionTbl))));
}
systable_endscan(scan);
table_close(pg_inherits, AccessShareLock);
} }
/* /*
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
extern Oid get_partition_parent(Oid relid); extern Oid get_partition_parent(Oid relid);
extern List *get_partition_ancestors(Oid relid); extern List *get_partition_ancestors(Oid relid);
extern Oid index_get_partition(Relation partition, Oid indexId);
extern List *map_partition_varattnos(List *expr, int fromrel_varno, extern List *map_partition_varattnos(List *expr, int fromrel_varno,
Relation to_rel, Relation from_rel, Relation to_rel, Relation from_rel,
bool *found_whole_row); bool *found_whole_row);
......
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