mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
Fix planner to make a reasonable assumption about the amount of memory space
used by array_agg(), string_agg(), and similar aggregate functions that use "internal" as their transition datatype. The previous coding thought this took *no* extra space, since "internal" is pass-by-value; but actually these aggregates typically consume a great deal of space. Per bug #5608 from Itagaki Takahiro, and fix suggestion from Hitoshi Harada. Back-patch to 8.4, where array_agg was introduced.
This commit is contained in:
parent
d2945deefb
commit
a5955f4a65
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.287 2010/03/19 22:54:41 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/optimizer/util/clauses.c,v 1.287.4.1 2010/08/14 15:47:21 tgl Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@ -549,6 +549,18 @@ count_agg_clauses_walker(Node *node, AggClauseCounts *counts)
|
||||
|
||||
counts->transitionSpace += avgwidth + 2 * sizeof(void *);
|
||||
}
|
||||
else if (aggtranstype == INTERNALOID)
|
||||
{
|
||||
/*
|
||||
* INTERNAL transition type is a special case: although INTERNAL
|
||||
* is pass-by-value, it's almost certainly being used as a pointer
|
||||
* to some large data structure. We assume usage of
|
||||
* ALLOCSET_DEFAULT_INITSIZE, which is a good guess if the data is
|
||||
* being kept in a private memory context, as is done by
|
||||
* array_agg() for instance.
|
||||
*/
|
||||
counts->transitionSpace += ALLOCSET_DEFAULT_INITSIZE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Complain if the aggregate's arguments contain any aggregates;
|
||||
|
Loading…
Reference in New Issue
Block a user