mirror of
https://github.com/postgres/postgres.git
synced 2025-10-16 17:07:43 +03:00
Eliminate duplicative hashtempcxt in nodeSubplan.c.
Instead of building a separate memory context that's used just for running hash functions, make the hash functions run in the per-tuple context of the node's innerecontext. This saves a little space at runtime, and it avoids needing to reset two contexts instead of one inside buildSubPlanHash's main loop. This largely reverts commit133924e13
. That's safe to do now becausebf6c614a2
decoupled the evaluation context used by TupleHashTableMatch from that used for hash function evaluation, so that there's no longer a risk of resetting the innerecontext too soon. Per discussion of bug #19040, although this is not directly a fix for that. Author: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Haiyang Li <mohen.lhy@alibaba-inc.com> Reviewed-by: Fei Changhong <feichanghong@qq.com> Discussion: https://postgr.es/m/19040-c9b6073ef814f48c@postgresql.org
This commit is contained in:
@@ -191,8 +191,8 @@ ExecHashSubPlan(SubPlanState *node,
|
||||
*/
|
||||
ExecClearTuple(slot);
|
||||
|
||||
/* Also must reset the hashtempcxt after each hashtable lookup. */
|
||||
MemoryContextReset(node->hashtempcxt);
|
||||
/* Also must reset the innerecontext after each hashtable lookup. */
|
||||
ResetExprContext(node->innerecontext);
|
||||
|
||||
return BoolGetDatum(result);
|
||||
}
|
||||
@@ -529,7 +529,7 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
|
||||
0,
|
||||
node->planstate->state->es_query_cxt,
|
||||
node->hashtablecxt,
|
||||
node->hashtempcxt,
|
||||
innerecontext->ecxt_per_tuple_memory,
|
||||
false);
|
||||
|
||||
if (!subplan->unknownEqFalse)
|
||||
@@ -558,7 +558,7 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
|
||||
0,
|
||||
node->planstate->state->es_query_cxt,
|
||||
node->hashtablecxt,
|
||||
node->hashtempcxt,
|
||||
innerecontext->ecxt_per_tuple_memory,
|
||||
false);
|
||||
}
|
||||
else
|
||||
@@ -620,12 +620,9 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
|
||||
|
||||
/*
|
||||
* Reset innerecontext after each inner tuple to free any memory used
|
||||
* during ExecProject.
|
||||
* during ExecProject and hashtable lookup.
|
||||
*/
|
||||
ResetExprContext(innerecontext);
|
||||
|
||||
/* Also must reset the hashtempcxt after each hashtable lookup. */
|
||||
MemoryContextReset(node->hashtempcxt);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -842,7 +839,6 @@ ExecInitSubPlan(SubPlan *subplan, PlanState *parent)
|
||||
sstate->hashtable = NULL;
|
||||
sstate->hashnulls = NULL;
|
||||
sstate->hashtablecxt = NULL;
|
||||
sstate->hashtempcxt = NULL;
|
||||
sstate->innerecontext = NULL;
|
||||
sstate->keyColIdx = NULL;
|
||||
sstate->tab_eq_funcoids = NULL;
|
||||
@@ -898,11 +894,6 @@ ExecInitSubPlan(SubPlan *subplan, PlanState *parent)
|
||||
AllocSetContextCreate(CurrentMemoryContext,
|
||||
"Subplan HashTable Context",
|
||||
ALLOCSET_DEFAULT_SIZES);
|
||||
/* and a small one for the hash tables to use as temp storage */
|
||||
sstate->hashtempcxt =
|
||||
AllocSetContextCreate(CurrentMemoryContext,
|
||||
"Subplan HashTable Temp Context",
|
||||
ALLOCSET_SMALL_SIZES);
|
||||
/* and a short-lived exprcontext for function evaluation */
|
||||
sstate->innerecontext = CreateExprContext(estate);
|
||||
|
||||
|
@@ -1020,7 +1020,6 @@ typedef struct SubPlanState
|
||||
bool havehashrows; /* true if hashtable is not empty */
|
||||
bool havenullrows; /* true if hashnulls is not empty */
|
||||
MemoryContext hashtablecxt; /* memory context containing hash tables */
|
||||
MemoryContext hashtempcxt; /* temp memory context for hash tables */
|
||||
ExprContext *innerecontext; /* econtext for computing inner tuples */
|
||||
int numCols; /* number of columns being hashed */
|
||||
/* each of the remaining fields is an array of length numCols: */
|
||||
|
Reference in New Issue
Block a user