mirror of
https://github.com/postgres/postgres.git
synced 2025-07-02 09:02:37 +03:00
In array_agg(), don't create a new context for every group.
Previously, each new array created a new memory context that started out at 8kB. This is incredibly wasteful when there are lots of small groups of just a few elements each. Change initArrayResult() and friends to accept a "subcontext" argument to indicate whether the caller wants the ArrayBuildState allocated in a new subcontext or not. If not, it can no longer be released separately from the rest of the memory context. Fixes bug report by Frank van Vugt on 2013-10-19. Tomas Vondra. Reviewed by Ali Akbar, Tom Lane, and me.
This commit is contained in:
@ -262,7 +262,7 @@ ExecScanSubPlan(SubPlanState *node,
|
||||
/* Initialize ArrayBuildStateAny in caller's context, if needed */
|
||||
if (subLinkType == ARRAY_SUBLINK)
|
||||
astate = initArrayResultAny(subplan->firstColType,
|
||||
CurrentMemoryContext);
|
||||
CurrentMemoryContext, true);
|
||||
|
||||
/*
|
||||
* We are probably in a short-lived expression-evaluation context. Switch
|
||||
@ -964,7 +964,7 @@ ExecSetParamPlan(SubPlanState *node, ExprContext *econtext)
|
||||
/* Initialize ArrayBuildStateAny in caller's context, if needed */
|
||||
if (subLinkType == ARRAY_SUBLINK)
|
||||
astate = initArrayResultAny(subplan->firstColType,
|
||||
CurrentMemoryContext);
|
||||
CurrentMemoryContext, true);
|
||||
|
||||
/*
|
||||
* Must switch to per-query memory context.
|
||||
|
Reference in New Issue
Block a user