diff options
| author | Tom Lane <tgl@sss.pgh.pa.us> | 2010-08-14 15:47:21 +0000 | 
|---|---|---|
| committer | Tom Lane <tgl@sss.pgh.pa.us> | 2010-08-14 15:47:21 +0000 | 
| commit | a5955f4a652054bb00c11de96f90300b01ccbe27 (patch) | |
| tree | a3ba375f1710dde5c5e8f946f09a72de03c3ef82 /src/backend/optimizer/util/clauses.c | |
| parent | d2945deefb9a491cd2d015aeb893f24beb5e97cb (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.
Diffstat (limited to 'src/backend/optimizer/util/clauses.c')
| -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 f6a943fcab4..84865167ccb 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.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;  | 
