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:35:44 +0300 |
commit | 877b088785b178c50e7976d86c82dfafa4031792 (patch) | |
tree | 985c0b79a92c0c329cb8e798441946311dc0fa08 /src/backend/access/spgist/spgdoinsert.c | |
parent | c7b353959931ae8e95177fe0a138b8119db9b802 (diff) | |
download | postgresql-877b088785b178c50e7976d86c82dfafa4031792.tar.gz postgresql-877b088785b178c50e7976d86c82dfafa4031792.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 1f5d97694db..48f32cda241 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); } /* |