Eliminate duplicative hashtempcxt in nodeSubplan.c. master github/master
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 10 Sep 2025 20:15:08 +0000 (16:15 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 10 Sep 2025 20:15:08 +0000 (16:15 -0400)
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 commit 133924e13.  That's safe to do now
because bf6c614a2 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

src/backend/executor/nodeSubplan.c
src/include/nodes/execnodes.h

index 8e55dcc159b0b2cb61ac53d71827f888e3d942a0..53fb56f7388e83c53343a3431e387dc9f6b6653a 100644 (file)
@@ -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);
 
index de782014b2d41a527113a951d8dd3be2b3d51da1..71857feae4823107ebebe17b1b7764e3c501161a 100644 (file)
@@ -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: */