diff options
-rw-r--r-- | src/backend/executor/execGrouping.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c index 756adf5fd18..567c3e9b696 100644 --- a/src/backend/executor/execGrouping.c +++ b/src/backend/executor/execGrouping.c @@ -14,7 +14,10 @@ */ #include "postgres.h" +#include <limits.h> + #include "executor/executor.h" +#include "miscadmin.h" #include "parser/parse_oper.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -280,9 +283,20 @@ BuildTupleHashTable(int numCols, AttrNumber *keyColIdx, TupleHashTable hashtable; HASHCTL hash_ctl; - Assert(nbuckets > 0); + /* + * Many callers pass "long" values for nbuckets, which means that we can + * receive a bogus value on 64-bit machines. It seems unwise to change + * this function's signature in released branches, so instead assume that + * a negative input means long->int overflow occurred. + */ + if (nbuckets <= 0) + nbuckets = INT_MAX; + Assert(entrysize >= sizeof(TupleHashEntryData)); + /* Limit initial table size request to not more than work_mem */ + nbuckets = Min(nbuckets, (long) ((work_mem * 1024L) / entrysize)); + hashtable = (TupleHashTable) MemoryContextAlloc(tablecxt, sizeof(TupleHashTableData)); |