diff --git a/src/backend/executor/execGrouping.c b/src/backend/executor/execGrouping.c index bfb8cbb303c..17098efa670 100644 --- a/src/backend/executor/execGrouping.c +++ b/src/backend/executor/execGrouping.c @@ -19,6 +19,7 @@ #include "postgres.h" #include "executor/executor.h" +#include "miscadmin.h" #include "parser/parse_oper.h" #include "utils/lsyscache.h" #include "utils/memutils.h" @@ -276,7 +277,7 @@ TupleHashTable BuildTupleHashTable(int numCols, AttrNumber *keyColIdx, FmgrInfo *eqfunctions, FmgrInfo *hashfunctions, - int nbuckets, Size entrysize, + long nbuckets, Size entrysize, MemoryContext tablecxt, MemoryContext tempcxt) { TupleHashTable hashtable; @@ -285,6 +286,9 @@ BuildTupleHashTable(int numCols, AttrNumber *keyColIdx, Assert(nbuckets > 0); 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)); @@ -306,7 +310,7 @@ BuildTupleHashTable(int numCols, AttrNumber *keyColIdx, hash_ctl.hash = TupleHashTableHash; hash_ctl.match = TupleHashTableMatch; hash_ctl.hcxt = tablecxt; - hashtable->hashtab = hash_create("TupleHashTable", (long) nbuckets, + hashtable->hashtab = hash_create("TupleHashTable", nbuckets, &hash_ctl, HASH_ELEM | HASH_FUNCTION | HASH_COMPARE | HASH_CONTEXT); diff --git a/src/backend/executor/nodeSubplan.c b/src/backend/executor/nodeSubplan.c index 4fcb66bbb03..0e12bb5afbd 100644 --- a/src/backend/executor/nodeSubplan.c +++ b/src/backend/executor/nodeSubplan.c @@ -432,7 +432,7 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext) int ncols = list_length(subplan->paramIds); ExprContext *innerecontext = node->innerecontext; MemoryContext oldcontext; - int nbuckets; + long nbuckets; TupleTableSlot *slot; Assert(subplan->subLinkType == ANY_SUBLINK); @@ -458,7 +458,7 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext) node->havehashrows = false; node->havenullrows = false; - nbuckets = (int) ceil(planstate->plan->plan_rows); + nbuckets = (long) Min(planstate->plan->plan_rows, (double) LONG_MAX); if (nbuckets < 1) nbuckets = 1; diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 1d651dd4081..bdd499bea66 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -131,7 +131,7 @@ extern void execTuplesHashPrepare(int numCols, extern TupleHashTable BuildTupleHashTable(int numCols, AttrNumber *keyColIdx, FmgrInfo *eqfunctions, FmgrInfo *hashfunctions, - int nbuckets, Size entrysize, + long nbuckets, Size entrysize, MemoryContext tablecxt, MemoryContext tempcxt); extern TupleHashEntry LookupTupleHashEntry(TupleHashTable hashtable,