diff options
author | Tom Lane | 2010-08-14 15:47:13 +0000 |
---|---|---|
committer | Tom Lane | 2010-08-14 15:47:13 +0000 |
commit | 22d9ddbb35f5d316312a2220041ff17744a72330 (patch) | |
tree | 3e1a6c8ad18bd7340b1505184c2aa0b18ca4a021 | |
parent | 41b810fe325663d84188220f5af911972d4e4c6e (diff) |
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.
-rw-r--r-- | src/backend/optimizer/util/clauses.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/backend/optimizer/util/clauses.c b/src/backend/optimizer/util/clauses.c index f6a943fcab..dec753b3a3 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -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.288 2010/08/14 15:47:13 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; |