aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/executor/execGrouping.c16
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));