Commit 050098b1 authored by Alvaro Herrera's avatar Alvaro Herrera

Fix use-after-free introduced in 55ed3def

Evidenced by failure under RELCACHE_FORCE_RELEASE (buildfarm member
prion).

Author: Amit Langote
Discussion: https://postgr.es/m/CA+HiwqGV=k_Eh4jBiQw66ivvdG+EUkrEYeHTYL1SvDj_YOYV0g@mail.gmail.com
parent f2f0082e
...@@ -1059,13 +1059,11 @@ DefineIndex(Oid relationId, ...@@ -1059,13 +1059,11 @@ DefineIndex(Oid relationId,
memcpy(part_oids, partdesc->oids, sizeof(Oid) * nparts); memcpy(part_oids, partdesc->oids, sizeof(Oid) * nparts);
parentDesc = CreateTupleDescCopy(RelationGetDescr(rel)); parentDesc = RelationGetDescr(rel);
opfamOids = palloc(sizeof(Oid) * numberOfKeyAttributes); opfamOids = palloc(sizeof(Oid) * numberOfKeyAttributes);
for (i = 0; i < numberOfKeyAttributes; i++) for (i = 0; i < numberOfKeyAttributes; i++)
opfamOids[i] = get_opclass_family(classObjectId[i]); opfamOids[i] = get_opclass_family(classObjectId[i]);
table_close(rel, NoLock);
/* /*
* For each partition, scan all existing indexes; if one matches * For each partition, scan all existing indexes; if one matches
* our index definition and is not already attached to some other * our index definition and is not already attached to some other
...@@ -1265,13 +1263,12 @@ DefineIndex(Oid relationId, ...@@ -1265,13 +1263,12 @@ DefineIndex(Oid relationId,
heap_freetuple(newtup); heap_freetuple(newtup);
} }
} }
else
table_close(rel, NoLock);
/* /*
* Indexes on partitioned tables are not themselves built, so we're * Indexes on partitioned tables are not themselves built, so we're
* done here. * done here.
*/ */
table_close(rel, NoLock);
if (!OidIsValid(parentIndexId)) if (!OidIsValid(parentIndexId))
pgstat_progress_end_command(); pgstat_progress_end_command();
return address; return address;
......
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