mirror of
https://github.com/postgres/postgres.git
synced 2025-11-18 02:02:55 +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 becausebf6c614a2decoupled 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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user