diff options
author | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2014-04-04 13:12:38 +0300 |
---|---|---|
committer | Heikki Linnakangas <heikki.linnakangas@iki.fi> | 2014-04-04 13:23:52 +0300 |
commit | 1891a4b6b8ad2bcdd290380a89cbb4dc160adbb8 (patch) | |
tree | 19a53928d650fed518bd4fbe6ba4162f5ac060ff /src/backend/access/spgist/spgdoinsert.c | |
parent | d359f71ac069c88c4760739308e23cfc3e0a8d60 (diff) | |
download | postgresql-1891a4b6b8ad2bcdd290380a89cbb4dc160adbb8.tar.gz postgresql-1891a4b6b8ad2bcdd290380a89cbb4dc160adbb8.zip |
Avoid allocations in critical sections.
If a palloc in a critical section fails, it becomes a PANIC.
Diffstat (limited to 'src/backend/access/spgist/spgdoinsert.c')
-rw-r--r-- | src/backend/access/spgist/spgdoinsert.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c index 9f425ca3558..62d3d3a30ec 100644 --- a/src/backend/access/spgist/spgdoinsert.c +++ b/src/backend/access/spgist/spgdoinsert.c @@ -122,7 +122,8 @@ cmpOffsetNumbers(const void *a, const void *b) * * NB: this is used during WAL replay, so beware of trying to make it too * smart. In particular, it shouldn't use "state" except for calling - * spgFormDeadTuple(). + * spgFormDeadTuple(). This is also used in a critical section, so no + * pallocs either! */ void spgPageIndexMultiDelete(SpGistState *state, Page page, @@ -131,7 +132,7 @@ spgPageIndexMultiDelete(SpGistState *state, Page page, BlockNumber blkno, OffsetNumber offnum) { OffsetNumber firstItem; - OffsetNumber *sortednos; + OffsetNumber sortednos[MaxIndexTuplesPerPage]; SpGistDeadTuple tuple = NULL; int i; @@ -145,7 +146,6 @@ spgPageIndexMultiDelete(SpGistState *state, Page page, * replacement tuples.) However, we must not scribble on the caller's * array, so we have to make a copy. */ - sortednos = (OffsetNumber *) palloc(sizeof(OffsetNumber) * nitems); memcpy(sortednos, itemnos, sizeof(OffsetNumber) * nitems); if (nitems > 1) qsort(sortednos, nitems, sizeof(OffsetNumber), cmpOffsetNumbers); @@ -173,8 +173,6 @@ spgPageIndexMultiDelete(SpGistState *state, Page page, else if (tupstate == SPGIST_PLACEHOLDER) SpGistPageGetOpaque(page)->nPlaceholder++; } - - pfree(sortednos); } /* |