diff options
Diffstat (limited to 'src/backend/access/gin/ginbulk.c')
-rw-r--r-- | src/backend/access/gin/ginbulk.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/backend/access/gin/ginbulk.c b/src/backend/access/gin/ginbulk.c index e40e5be36bc..5a8546998d5 100644 --- a/src/backend/access/gin/ginbulk.c +++ b/src/backend/access/gin/ginbulk.c @@ -14,6 +14,8 @@ #include "postgres.h" +#include <limits.h> + #include "access/gin_private.h" #include "utils/datum.h" #include "utils/memutils.h" @@ -36,10 +38,16 @@ ginCombineData(RBNode *existing, const RBNode *newdata, void *arg) */ if (eo->count >= eo->maxcount) { + if (eo->maxcount > INT_MAX) + ereport(ERROR, + (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), + errmsg("posting list is too long"), + errhint("Reduce maintenance_work_mem"))); + accum->allocatedMemory -= GetMemoryChunkSpace(eo->list); eo->maxcount *= 2; eo->list = (ItemPointerData *) - repalloc(eo->list, sizeof(ItemPointerData) * eo->maxcount); + repalloc_huge(eo->list, sizeof(ItemPointerData) * eo->maxcount); accum->allocatedMemory += GetMemoryChunkSpace(eo->list); } |