mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
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
This commit is contained in:
parent
3d0dcc5c7f
commit
a6da004715
@ -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)
|
|||||||
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);
|
existingIdx = index_get_partition(partitionTbl,
|
||||||
ScanKeyInit(&key, Anum_pg_inherits_inhparent,
|
RelationGetRelid(parentIdx));
|
||||||
BTEqualStrategyNumber, F_OIDEQ,
|
if (OidIsValid(existingIdx))
|
||||||
ObjectIdGetDatum(RelationGetRelid(parentIdx)));
|
ereport(ERROR,
|
||||||
scan = systable_beginscan(pg_inherits, InheritsParentIndexId, true,
|
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
||||||
NULL, 1, &key);
|
errmsg("cannot attach index \"%s\" as a partition of index \"%s\"",
|
||||||
while (HeapTupleIsValid(tuple = systable_getnext(scan)))
|
RelationGetRelationName(partIdx),
|
||||||
{
|
RelationGetRelationName(parentIdx)),
|
||||||
Form_pg_inherits inhForm;
|
errdetail("Another index is already attached for partition \"%s\".",
|
||||||
Oid tab;
|
RelationGetRelationName(partitionTbl))));
|
||||||
|
|
||||||
inhForm = (Form_pg_inherits) GETSTRUCT(tuple);
|
|
||||||
tab = IndexGetRelation(inhForm->inhrelid, false);
|
|
||||||
if (tab == RelationGetRelid(partitionTbl))
|
|
||||||
ereport(ERROR,
|
|
||||||
(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
|
|
||||||
errmsg("cannot attach index \"%s\" as a partition of index \"%s\"",
|
|
||||||
RelationGetRelationName(partIdx),
|
|
||||||
RelationGetRelationName(parentIdx)),
|
|
||||||
errdetail("Another index is already attached for partition \"%s\".",
|
|
||||||
RelationGetRelationName(partitionTbl))));
|
|
||||||
}
|
|
||||||
|
|
||||||
systable_endscan(scan);
|
|
||||||
table_close(pg_inherits, AccessShareLock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user