diff --git a/src/backend/executor/nodeHash.c b/src/backend/executor/nodeHash.c index 6917d3f..e72ac8b 100644 --- a/src/backend/executor/nodeHash.c +++ b/src/backend/executor/nodeHash.c @@ -475,6 +475,7 @@ ExecChooseHashTableSize(double ntuples, int tupwidth, bool useskew, lbuckets = (hash_table_bytes / tupsize) / NTUP_PER_BUCKET; lbuckets = Min(lbuckets, max_pointers); + lbuckets = Min(lbuckets, MaxAllocSize / sizeof(void*)); nbuckets = (int) lbuckets; dbatch = ceil(inner_rel_bytes / hash_table_bytes); @@ -491,6 +492,7 @@ ExecChooseHashTableSize(double ntuples, int tupwidth, bool useskew, dbuckets = ceil(ntuples / NTUP_PER_BUCKET); dbuckets = Min(dbuckets, max_pointers); + dbuckets = Min(dbuckets, MaxAllocSize / sizeof(void*)); nbuckets = (int) dbuckets; nbatch = 1; @@ -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.) */