mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +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:
@ -3948,7 +3948,7 @@ xpath(PG_FUNCTION_ARGS)
|
||||
ArrayType *namespaces = PG_GETARG_ARRAYTYPE_P(2);
|
||||
ArrayBuildState *astate;
|
||||
|
||||
astate = initArrayResult(XMLOID, CurrentMemoryContext);
|
||||
astate = initArrayResult(XMLOID, CurrentMemoryContext, true);
|
||||
xpath_internal(xpath_expr_text, data, namespaces,
|
||||
NULL, astate);
|
||||
PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, CurrentMemoryContext));
|
||||
|
Reference in New Issue
Block a user