Index: src/backend/utils/adt/numeric.c
===================================================================
RCS file: /Users/neilc/local/cvs/pgsql/src/backend/utils/adt/numeric.c,v
retrieving revision 1.81
diff -c -r1.81 numeric.c
*** src/backend/utils/adt/numeric.c	1 Jan 2005 05:43:07 -0000	1.81
--- src/backend/utils/adt/numeric.c	4 Apr 2005 11:00:41 -0000
***************
*** 2462,2478 ****
  Datum
  int2_avg_accum(PG_FUNCTION_ARGS)
  {
! 	ArrayType  *transarray = PG_GETARG_ARRAYTYPE_P_COPY(0);
  	int16		newval = PG_GETARG_INT16(1);
  	Int8TransTypeData *transdata;
  
  	/*
! 	 * We copied the input array, so it's okay to scribble on it directly.
  	 */
  	if (ARR_SIZE(transarray) != ARR_OVERHEAD(1) + sizeof(Int8TransTypeData))
  		elog(ERROR, "expected 2-element int8 array");
- 	transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
  
  	transdata->count++;
  	transdata->sum += newval;
  
--- 2462,2485 ----
  Datum
  int2_avg_accum(PG_FUNCTION_ARGS)
  {
! 	ArrayType  *transarray;
  	int16		newval = PG_GETARG_INT16(1);
  	Int8TransTypeData *transdata;
  
  	/*
! 	 * If we're invoked by nodeAgg, we can cheat and modify our first
! 	 * parameter in-place to reduce palloc overhead. Otherwise we need
! 	 * to make a copy of it before scribbling on it.
  	 */
+ 	if (fcinfo->context && IsA(fcinfo->context, AggState))
+ 		transarray = PG_GETARG_ARRAYTYPE_P(0);
+ 	else
+ 		transarray = PG_GETARG_ARRAYTYPE_P_COPY(0);
+ 
  	if (ARR_SIZE(transarray) != ARR_OVERHEAD(1) + sizeof(Int8TransTypeData))
  		elog(ERROR, "expected 2-element int8 array");
  
+ 	transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
  	transdata->count++;
  	transdata->sum += newval;
  
***************
*** 2482,2498 ****
  Datum
  int4_avg_accum(PG_FUNCTION_ARGS)
  {
! 	ArrayType  *transarray = PG_GETARG_ARRAYTYPE_P_COPY(0);
  	int32		newval = PG_GETARG_INT32(1);
  	Int8TransTypeData *transdata;
  
  	/*
! 	 * We copied the input array, so it's okay to scribble on it directly.
  	 */
  	if (ARR_SIZE(transarray) != ARR_OVERHEAD(1) + sizeof(Int8TransTypeData))
  		elog(ERROR, "expected 2-element int8 array");
- 	transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
  
  	transdata->count++;
  	transdata->sum += newval;
  
--- 2489,2512 ----
  Datum
  int4_avg_accum(PG_FUNCTION_ARGS)
  {
! 	ArrayType  *transarray;
  	int32		newval = PG_GETARG_INT32(1);
  	Int8TransTypeData *transdata;
  
  	/*
! 	 * If we're invoked by nodeAgg, we can cheat and modify our first
! 	 * parameter in-place to reduce palloc overhead. Otherwise we need
! 	 * to make a copy of it before scribbling on it.
  	 */
+ 	if (fcinfo->context && IsA(fcinfo->context, AggState))
+ 		transarray = PG_GETARG_ARRAYTYPE_P(0);
+ 	else
+ 		transarray = PG_GETARG_ARRAYTYPE_P_COPY(0);
+ 
  	if (ARR_SIZE(transarray) != ARR_OVERHEAD(1) + sizeof(Int8TransTypeData))
  		elog(ERROR, "expected 2-element int8 array");
  
+ 	transdata = (Int8TransTypeData *) ARR_DATA_PTR(transarray);
  	transdata->count++;
  	transdata->sum += newval;
  
