diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 6917d3f..ca90aed 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -465,6 +465,8 @@ ExecChooseHashTableSize(double ntuples, int tupwidth, bool useskew, max_pointers = (work_mem * 1024L) / sizeof(void *); /* also ensure we avoid integer overflow in nbatch and nbuckets */ max_pointers = Min(max_pointers, INT_MAX / 2); + /* ensure we don't exceed the maximum allocation size */ + max_pointers = Min(max_pointers, MaxAllocSize / sizeof(void*)); if (inner_rel_bytes > hash_table_bytes) { @@ -500,7 +502,8 @@ ExecChooseHashTableSize(double ntuples, int tupwidth, bool useskew, * Both nbuckets and nbatch must be powers of 2 to make * ExecHashGetBucketAndBatch fast. We already fixed nbatch; now inflate * nbuckets to the next larger power of 2. We also force nbuckets to not - * be real small, by starting the search at 2^10. (Note: above we made + * be real small, by starting the search at 2^10, or too large - we allocate + * them as a single chunk, so must fit in MaxAllocSize. (Note: above we made * sure that nbuckets is not more than INT_MAX / 2, so this loop cannot * overflow, nor can the final shift to recalculate nbuckets.) */