aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2015-03-12 15:29:58 +0100
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2015-03-12 15:34:32 +0100
commit26d2c5dc8dc24febee8c3dd472407d7bbdcc245d (patch)
tree048fad670bd2095e3d9c4a32935a2d0d6edb04c1 /src
parentf4abd0241de20d5d6a79b84992b9e88603d44134 (diff)
downloadpostgresql-26d2c5dc8dc24febee8c3dd472407d7bbdcc245d.tar.gz
postgresql-26d2c5dc8dc24febee8c3dd472407d7bbdcc245d.zip
Fix memory leaks in GIN index vacuum.
Per bug #12850 by Walter Nordmann. Backpatch to 9.4 where the leak was introduced.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/gin/ginvacuum.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/src/backend/access/gin/ginvacuum.c b/src/backend/access/gin/ginvacuum.c
index 9e76df36129..eba572b0d8a 100644
--- a/src/backend/access/gin/ginvacuum.c
+++ b/src/backend/access/gin/ginvacuum.c
@@ -432,27 +432,32 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3
else if (GinGetNPosting(itup) > 0)
{
int nitems;
- ItemPointer uncompressed;
+ ItemPointer items_orig;
+ bool free_items_orig;
+ ItemPointer items;
- /*
- * Vacuum posting list with proper function for compressed and
- * uncompressed format.
- */
+ /* Get list of item pointers from the tuple. */
if (GinItupIsCompressed(itup))
- uncompressed = ginPostingListDecode((GinPostingList *) GinGetPosting(itup), &nitems);
+ {
+ items_orig = ginPostingListDecode((GinPostingList *) GinGetPosting(itup), &nitems);
+ free_items_orig = true;
+ }
else
{
- uncompressed = (ItemPointer) GinGetPosting(itup);
+ items_orig = (ItemPointer) GinGetPosting(itup);
nitems = GinGetNPosting(itup);
+ free_items_orig = false;
}
- uncompressed = ginVacuumItemPointers(gvs, uncompressed, nitems,
- &nitems);
- if (uncompressed)
+ /* Remove any items from the list that need to be vacuumed. */
+ items = ginVacuumItemPointers(gvs, items_orig, nitems, &nitems);
+
+ if (free_items_orig)
+ pfree(items_orig);
+
+ /* If any item pointers were removed, recreate the tuple. */
+ if (items)
{
- /*
- * Some ItemPointers were deleted, recreate tuple.
- */
OffsetNumber attnum;
Datum key;
GinNullCategory category;
@@ -461,7 +466,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3
if (nitems > 0)
{
- plist = ginCompressPostingList(uncompressed, nitems, GinMaxItemSize, NULL);
+ plist = ginCompressPostingList(items, nitems, GinMaxItemSize, NULL);
plistsize = SizeOfGinPostingList(plist);
}
else
@@ -500,6 +505,7 @@ ginVacuumEntryPage(GinVacuumState *gvs, Buffer buffer, BlockNumber *roots, uint3
RelationGetRelationName(gvs->index));
pfree(itup);
+ pfree(items);
}
}
}