Fix assorted syscache lookup sloppiness in partition-related code.
heap_drop_with_catalog and ATExecDetachPartition neglected to check for SearchSysCache failures, as noted in bugs #14927 and #14928 from Pan Bian. Such failures are pretty unlikely, since we should already have some sort of lock on the rel at these points, but it's neither a good idea nor per project style to omit a check for failure. Also, StorePartitionKey contained a syscache lookup that it never did anything with, including never releasing the result. Presumably the reason why we don't see refcount-leak complaints is that the lookup always fails; but in any case it's pretty useless, so remove it. All of these errors were evidently introduced by the relation partitioning feature. Back-patch to v10 where that came in. Amit Langote and Tom Lane Discussion: https://postgr.es/m/20171127090105.1463.3962@wrigleys.postgresql.org Discussion: https://postgr.es/m/20171127091341.1468.72696@wrigleys.postgresql.org
This commit is contained in:
parent
9a785ad573
commit
cb03fa33ae
@ -1772,6 +1772,8 @@ heap_drop_with_catalog(Oid relid)
|
|||||||
* shared-cache-inval notice that will make them update their index lists.
|
* shared-cache-inval notice that will make them update their index lists.
|
||||||
*/
|
*/
|
||||||
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
|
tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
|
||||||
|
if (!HeapTupleIsValid(tuple))
|
||||||
|
elog(ERROR, "cache lookup failed for relation %u", relid);
|
||||||
if (((Form_pg_class) GETSTRUCT(tuple))->relispartition)
|
if (((Form_pg_class) GETSTRUCT(tuple))->relispartition)
|
||||||
{
|
{
|
||||||
parentOid = get_partition_parent(relid);
|
parentOid = get_partition_parent(relid);
|
||||||
@ -3131,9 +3133,6 @@ StorePartitionKey(Relation rel,
|
|||||||
|
|
||||||
Assert(rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
|
Assert(rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
|
||||||
|
|
||||||
tuple = SearchSysCache1(PARTRELID,
|
|
||||||
ObjectIdGetDatum(RelationGetRelid(rel)));
|
|
||||||
|
|
||||||
/* Copy the partition attribute numbers, opclass OIDs into arrays */
|
/* Copy the partition attribute numbers, opclass OIDs into arrays */
|
||||||
partattrs_vec = buildint2vector(partattrs, partnatts);
|
partattrs_vec = buildint2vector(partattrs, partnatts);
|
||||||
partopclass_vec = buildoidvector(partopclass, partnatts);
|
partopclass_vec = buildoidvector(partopclass, partnatts);
|
||||||
|
@ -14111,6 +14111,9 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
|
|||||||
classRel = heap_open(RelationRelationId, RowExclusiveLock);
|
classRel = heap_open(RelationRelationId, RowExclusiveLock);
|
||||||
tuple = SearchSysCacheCopy1(RELOID,
|
tuple = SearchSysCacheCopy1(RELOID,
|
||||||
ObjectIdGetDatum(RelationGetRelid(partRel)));
|
ObjectIdGetDatum(RelationGetRelid(partRel)));
|
||||||
|
if (!HeapTupleIsValid(tuple))
|
||||||
|
elog(ERROR, "cache lookup failed for relation %u",
|
||||||
|
RelationGetRelid(partRel));
|
||||||
Assert(((Form_pg_class) GETSTRUCT(tuple))->relispartition);
|
Assert(((Form_pg_class) GETSTRUCT(tuple))->relispartition);
|
||||||
|
|
||||||
(void) SysCacheGetAttr(RELOID, tuple, Anum_pg_class_relpartbound,
|
(void) SysCacheGetAttr(RELOID, tuple, Anum_pg_class_relpartbound,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user