]> granicus.if.org Git - postgresql/commitdiff
Fix assorted syscache lookup sloppiness in partition-related code.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Nov 2017 00:22:08 +0000 (19:22 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 28 Nov 2017 00:22:08 +0000 (19:22 -0500)
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

src/backend/catalog/heap.c
src/backend/commands/tablecmds.c

index 9e14880b998d7510a3db4f4150f6ba4e03789a92..4319fc6b8c835cf65ef8bfa6a2066b392f9970a4 100644 (file)
@@ -1772,6 +1772,8 @@ heap_drop_with_catalog(Oid relid)
         * shared-cache-inval notice that will make them update their index lists.
         */
        tuple = SearchSysCache1(RELOID, ObjectIdGetDatum(relid));
+       if (!HeapTupleIsValid(tuple))
+               elog(ERROR, "cache lookup failed for relation %u", relid);
        if (((Form_pg_class) GETSTRUCT(tuple))->relispartition)
        {
                parentOid = get_partition_parent(relid);
@@ -3131,9 +3133,6 @@ StorePartitionKey(Relation rel,
 
        Assert(rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
 
-       tuple = SearchSysCache1(PARTRELID,
-                                                       ObjectIdGetDatum(RelationGetRelid(rel)));
-
        /* Copy the partition attribute numbers, opclass OIDs into arrays */
        partattrs_vec = buildint2vector(partattrs, partnatts);
        partopclass_vec = buildoidvector(partopclass, partnatts);
index d19846d0057d96f7a8aa07d6e6b2535ff7fbac0a..d979ce266d1c7ab32a53a32a6a7810e522c9e31e 100644 (file)
@@ -14111,6 +14111,9 @@ ATExecDetachPartition(Relation rel, RangeVar *name)
        classRel = heap_open(RelationRelationId, RowExclusiveLock);
        tuple = SearchSysCacheCopy1(RELOID,
                                                                ObjectIdGetDatum(RelationGetRelid(partRel)));
+       if (!HeapTupleIsValid(tuple))
+               elog(ERROR, "cache lookup failed for relation %u",
+                        RelationGetRelid(partRel));
        Assert(((Form_pg_class) GETSTRUCT(tuple))->relispartition);
 
        (void) SysCacheGetAttr(RELOID, tuple, Anum_pg_class_relpartbound,