mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Correctly re-use hash tables in buildSubPlanHash().
Commit 356687bd8
omitted to remove leftover code for destroying
a hashed subplan's hash tables, with the result that the tables
were always rebuilt not reused; this leads to severe memory
leakage if a hashed subplan is re-executed enough times.
Moreover, the code for reusing the hashnulls table had a typo
that would have made it do the wrong thing if it were reached.
Looking at the code coverage report shows severe under-coverage
of the potential callers of ResetTupleHashTable, so add some test
cases that exercise them.
Andreas Karlsson and Tom Lane, per reports from Ranier Vilela
and Justin Pryzby.
Backpatch to v11, as the faulty commit was.
Discussion: https://postgr.es/m/edb62547-c453-c35b-3ed6-a069e4d6b937@proxel.se
Discussion: https://postgr.es/m/CAEudQAo=DCebm1RXtig9OH+QivpS97sMkikt0A9qHmMUs+g6ZA@mail.gmail.com
Discussion: https://postgr.es/m/20200210032547.GA1412@telsasoft.com
This commit is contained in:
@ -495,8 +495,6 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
|
||||
* need to store subplan output rows that contain NULL.
|
||||
*/
|
||||
MemoryContextReset(node->hashtablecxt);
|
||||
node->hashtable = NULL;
|
||||
node->hashnulls = NULL;
|
||||
node->havehashrows = false;
|
||||
node->havenullrows = false;
|
||||
|
||||
@ -533,7 +531,7 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
|
||||
}
|
||||
|
||||
if (node->hashnulls)
|
||||
ResetTupleHashTable(node->hashtable);
|
||||
ResetTupleHashTable(node->hashnulls);
|
||||
else
|
||||
node->hashnulls = BuildTupleHashTableExt(node->parent,
|
||||
node->descRight,
|
||||
@ -549,6 +547,8 @@ buildSubPlanHash(SubPlanState *node, ExprContext *econtext)
|
||||
node->hashtempcxt,
|
||||
false);
|
||||
}
|
||||
else
|
||||
node->hashnulls = NULL;
|
||||
|
||||
/*
|
||||
* We are probably in a short-lived expression-evaluation context. Switch
|
||||
|
Reference in New Issue
Block a user