On 11/13/2014 03:38 AM, Alvaro Herrera wrote:
configure is a generated file.  If your patch touches it but not
configure.in, there is a problem.

Thanks for pointing it out, I have now fixed it.

--
Andreas Karlsson
diff --git a/configure b/configure
new file mode 100755
index c4f70e8..bb801b4
*** a/configure
--- b/configure
*************** _ACEOF
*** 13735,13740 ****
--- 13735,13763 ----
  fi
  
  
+ # Check if platform support gcc style 128-bit integers.
+ ac_fn_c_check_type "$LINENO" "__int128_t" "ac_cv_type___int128_t" "#include <stdint.h>
+ "
+ if test "x$ac_cv_type___int128_t" = xyes; then :
+ 
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE___INT128_T 1
+ _ACEOF
+ 
+ 
+ fi
+ ac_fn_c_check_type "$LINENO" "__uint128_t" "ac_cv_type___uint128_t" "#include <stdint.h>
+ "
+ if test "x$ac_cv_type___uint128_t" = xyes; then :
+ 
+ cat >>confdefs.h <<_ACEOF
+ #define HAVE___UINT128_T 1
+ _ACEOF
+ 
+ 
+ fi
+ 
+ 
  # We also check for sig_atomic_t, which *should* be defined per ANSI
  # C, but is missing on some old platforms.
  ac_fn_c_check_type "$LINENO" "sig_atomic_t" "ac_cv_type_sig_atomic_t" "#include <signal.h>
diff --git a/configure.in b/configure.in
new file mode 100644
index 2465f26..1b8a59f
*** a/configure.in
--- b/configure.in
*************** AC_DEFINE_UNQUOTED(MAXIMUM_ALIGNOF, $MAX
*** 1751,1756 ****
--- 1751,1759 ----
  AC_CHECK_TYPES([int8, uint8, int64, uint64], [], [],
  [#include <stdio.h>])
  
+ # Check if platform support gcc style 128-bit integers.
+ AC_CHECK_TYPES([__int128_t, __uint128_t], [], [], [#include <stdint.h>])
+ 
  # We also check for sig_atomic_t, which *should* be defined per ANSI
  # C, but is missing on some old platforms.
  AC_CHECK_TYPES(sig_atomic_t, [], [], [#include <signal.h>])
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c
new file mode 100644
index d61af92..98183b4
*** a/src/backend/utils/adt/numeric.c
--- b/src/backend/utils/adt/numeric.c
*************** static void apply_typmod(NumericVar *var
*** 402,407 ****
--- 402,410 ----
  static int32 numericvar_to_int4(NumericVar *var);
  static bool numericvar_to_int8(NumericVar *var, int64 *result);
  static void int8_to_numericvar(int64 val, NumericVar *var);
+ #ifdef HAVE_INT128
+ static void int16_to_numericvar(int128 val, NumericVar *var);
+ #endif
  static double numeric_to_double_no_overflow(Numeric num);
  static double numericvar_to_double_no_overflow(NumericVar *var);
  
*************** numeric_float4(PG_FUNCTION_ARGS)
*** 2639,2644 ****
--- 2642,2650 ----
   * Actually, it's a pointer to a NumericAggState allocated in the aggregate
   * context.  The digit buffers for the NumericVars will be there too.
   *
+  * On platforms which support 128-bit integers some aggergates instead use a
+  * 128-bit integer based transition datatype to speed up calculations.
+  *
   * ----------------------------------------------------------------------
   */
  
*************** numeric_accum_inv(PG_FUNCTION_ARGS)
*** 2897,2902 ****
--- 2903,2967 ----
  	PG_RETURN_POINTER(state);
  }
  
+ #ifdef HAVE_INT128
+ typedef struct Int16AggState
+ {
+ 	bool	calcSumX2;	/* if true, calculate sumX2 */
+ 	int64	N;			/* count of processed numbers */
+ 	int128	sumX;		/* sum of processed numbers */
+ 	int128	sumX2;		/* sum of squares of processed numbers */
+ } Int16AggState;
+ 
+ /*
+  * Prepare state data for a 128-bit aggregate function that needs to compute
+  * sum, count and optionally sum of squares of the input.
+  */
+ static Int16AggState *
+ makeInt16AggState(FunctionCallInfo fcinfo, bool calcSumX2)
+ {
+ 	Int16AggState *state;
+ 	MemoryContext agg_context;
+ 	MemoryContext old_context;
+ 
+ 	if (!AggCheckCallContext(fcinfo, &agg_context))
+ 		elog(ERROR, "aggregate function called in non-aggregate context");
+ 
+ 	old_context = MemoryContextSwitchTo(agg_context);
+ 
+ 	state = (Int16AggState *) palloc0(sizeof(Int16AggState));
+ 	state->calcSumX2 = calcSumX2;
+ 
+ 	MemoryContextSwitchTo(old_context);
+ 
+ 	return state;
+ }
+ 
+ /*
+  * Accumulate a new input value for 128-bit aggregate functions.
+  */
+ static void
+ do_int16_accum(Int16AggState *state, int128 newval)
+ {
+ 	if (state->calcSumX2)
+ 		state->sumX2 += newval * newval;
+ 
+ 	state->sumX += newval;
+ 	state->N++;
+ }
+ 
+ /*
+  * Remove an input value from the aggregated state.
+  */
+ static void
+ do_int16_discard(Int16AggState *state, int128 newval)
+ {
+ 	if (state->calcSumX2)
+ 		state->sumX2 -= newval * newval;
+ 
+ 	state->sumX -= newval;
+ 	state->N--;
+ }
+ #endif
  
  /*
   * Integer data types all use Numeric accumulators to share code and
*************** numeric_accum_inv(PG_FUNCTION_ARGS)
*** 2905,2915 ****
--- 2970,2996 ----
   * for the sum(X*X) value.  Hence, we use int2_accum and int4_accum only
   * for stddev/variance --- there are faster special-purpose accumulator
   * routines for SUM and AVG of these datatypes.
+  *
+  * Similarily we can, where available, use 128-bit integer accumulators
+  * for sum(X) for int8 and sum(X*X) for int2 and int4, but not sum(X*X)
+  * for int8.
   */
  
  Datum
  int2_accum(PG_FUNCTION_ARGS)
  {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* Create the state data on the first call */
+ 	if (state == NULL)
+ 		state = makeInt16AggState(fcinfo, true);
+ 
+ 	if (!PG_ARGISNULL(1))
+ 		do_int16_accum(state, (int128) PG_GETARG_INT16(1));
+ #else
  	NumericAggState *state;
  
  	state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
*************** int2_accum(PG_FUNCTION_ARGS)
*** 2926,2931 ****
--- 3007,3013 ----
  													 PG_GETARG_DATUM(1)));
  		do_numeric_accum(state, newval);
  	}
+ #endif
  
  	PG_RETURN_POINTER(state);
  }
*************** int2_accum(PG_FUNCTION_ARGS)
*** 2933,2938 ****
--- 3015,3032 ----
  Datum
  int4_accum(PG_FUNCTION_ARGS)
  {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* Create the state data on the first call */
+ 	if (state == NULL)
+ 		state = makeInt16AggState(fcinfo, true);
+ 
+ 	if (!PG_ARGISNULL(1))
+ 		do_int16_accum(state, (int128) PG_GETARG_INT32(1));
+ #else
  	NumericAggState *state;
  
  	state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
*************** int4_accum(PG_FUNCTION_ARGS)
*** 2949,2954 ****
--- 3043,3049 ----
  													 PG_GETARG_DATUM(1)));
  		do_numeric_accum(state, newval);
  	}
+ #endif
  
  	PG_RETURN_POINTER(state);
  }
*************** int8_accum(PG_FUNCTION_ARGS)
*** 2982,2987 ****
--- 3077,3095 ----
  Datum
  int8_avg_accum(PG_FUNCTION_ARGS)
  {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* Create the state data on the first call */
+ 	if (state == NULL)
+ 		state = makeInt16AggState(fcinfo, false);
+ 
+ 	if (!PG_ARGISNULL(1))
+ 		do_int16_accum(state, (int128) PG_GETARG_INT64(1));
+ 
+ #else
  	NumericAggState *state;
  
  	state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
*************** int8_avg_accum(PG_FUNCTION_ARGS)
*** 2998,3003 ****
--- 3106,3112 ----
  													 PG_GETARG_DATUM(1)));
  		do_numeric_accum(state, newval);
  	}
+ #endif
  
  	PG_RETURN_POINTER(state);
  }
*************** int8_avg_accum(PG_FUNCTION_ARGS)
*** 3010,3015 ****
--- 3119,3136 ----
  Datum
  int2_accum_inv(PG_FUNCTION_ARGS)
  {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* Should not get here with no state */
+ 	if (state == NULL)
+ 		elog(ERROR, "int2_accum_inv called with NULL state");
+ 
+ 	if (!PG_ARGISNULL(1))
+ 		do_int16_discard(state, (int128) PG_GETARG_INT16(1));
+ #else
  	NumericAggState *state;
  
  	state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
*************** int2_accum_inv(PG_FUNCTION_ARGS)
*** 3029,3034 ****
--- 3150,3156 ----
  		if (!do_numeric_discard(state, newval))
  			elog(ERROR, "do_numeric_discard failed unexpectedly");
  	}
+ #endif
  
  	PG_RETURN_POINTER(state);
  }
*************** int2_accum_inv(PG_FUNCTION_ARGS)
*** 3036,3041 ****
--- 3158,3175 ----
  Datum
  int4_accum_inv(PG_FUNCTION_ARGS)
  {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* Should not get here with no state */
+ 	if (state == NULL)
+ 		elog(ERROR, "int4_accum_inv called with NULL state");
+ 
+ 	if (!PG_ARGISNULL(1))
+ 		do_int16_discard(state, (int128) PG_GETARG_INT32(1));
+ #else
  	NumericAggState *state;
  
  	state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
*************** int4_accum_inv(PG_FUNCTION_ARGS)
*** 3055,3060 ****
--- 3189,3195 ----
  		if (!do_numeric_discard(state, newval))
  			elog(ERROR, "do_numeric_discard failed unexpectedly");
  	}
+ #endif
  
  	PG_RETURN_POINTER(state);
  }
*************** int8_accum_inv(PG_FUNCTION_ARGS)
*** 3086,3091 ****
--- 3221,3323 ----
  }
  
  Datum
+ int8_avg_accum_inv(PG_FUNCTION_ARGS)
+ {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* Should not get here with no state */
+ 	if (state == NULL)
+ 		elog(ERROR, "int8_avg_accum_inv called with NULL state");
+ 
+ 	if (!PG_ARGISNULL(1))
+ 		do_int16_discard(state, (int128) PG_GETARG_INT64(1));
+ #else
+ 	NumericAggState *state;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (NumericAggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* Should not get here with no state */
+ 	if (state == NULL)
+ 		elog(ERROR, "int8_avg_accum_inv called with NULL state");
+ 
+ 	if (!PG_ARGISNULL(1))
+ 	{
+ 		Numeric		newval;
+ 
+ 		newval = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
+ 													 PG_GETARG_DATUM(1)));
+ 
+ 		/* Should never fail, all inputs have dscale 0 */
+ 		if (!do_numeric_discard(state, newval))
+ 			elog(ERROR, "do_numeric_discard failed unexpectedly");
+ 	}
+ #endif
+ 
+ 	PG_RETURN_POINTER(state);
+ }
+ 
+ Datum
+ numeric_int16_sum(PG_FUNCTION_ARGS)
+ {
+ #ifdef HAVE_INT128
+ 	Int16AggState	*state;
+ 	Numeric			res;
+ 	NumericVar		result;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* If there were no non-null inputs, return NULL */
+ 	if (state == NULL || state->N == 0)
+ 		PG_RETURN_NULL();
+ 
+ 	init_var(&result);
+ 
+ 	int16_to_numericvar(state->sumX, &result);
+ 
+ 	res = make_result(&result);
+ 
+ 	free_var(&result);
+ 
+ 	PG_RETURN_NUMERIC(res);
+ #else
+ 	return numeric_sum(fcinfo);
+ #endif
+ }
+ 
+ Datum
+ numeric_int16_avg(PG_FUNCTION_ARGS)
+ {
+ #ifdef HAVE_INT128
+ 	Int16AggState	*state;
+ 	NumericVar		result;
+ 	Datum			countd, sumd;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	/* If there were no non-null inputs, return NULL */
+ 	if (state == NULL || state->N == 0)
+ 		PG_RETURN_NULL();
+ 
+ 	init_var(&result);
+ 
+ 	int16_to_numericvar(state->sumX, &result);
+ 
+ 	countd = DirectFunctionCall1(int8_numeric,
+ 								 Int64GetDatumFast(state->N));
+ 	sumd = NumericGetDatum(make_result(&result));
+ 
+ 	free_var(&result);
+ 
+ 	PG_RETURN_DATUM(DirectFunctionCall2(numeric_div, sumd, countd));
+ #else
+ 	return numeric_avg(fcinfo);
+ #endif
+ }
+ 
+ Datum
  numeric_avg(PG_FUNCTION_ARGS)
  {
  	NumericAggState *state;
*************** numeric_stddev_pop(PG_FUNCTION_ARGS)
*** 3287,3292 ****
--- 3519,3639 ----
  		PG_RETURN_NUMERIC(res);
  }
  
+ #ifdef HAVE_INT128
+ static Numeric
+ numeric_int16_stddev_internal(Int16AggState *state,
+ 						bool variance, bool sample,
+ 						bool *is_null)
+ {
+ 	NumericAggState numstate;
+ 	Numeric		res;
+ 
+ 	init_var(&numstate.sumX);
+ 	init_var(&numstate.sumX2);
+ 	numstate.NaNcount = 0;
+ 	numstate.agg_context = NULL;
+ 
+ 	if (state) {
+ 		numstate.N = state->N;
+ 		int16_to_numericvar(state->sumX, &numstate.sumX);
+ 		int16_to_numericvar(state->sumX2, &numstate.sumX2);
+ 	} else {
+ 		numstate.N = 0;
+ 	}
+ 
+ 	res = numeric_stddev_internal(&numstate, variance, sample, is_null);
+ 
+ 	free_var(&numstate.sumX);
+ 	free_var(&numstate.sumX2);
+ 
+ 	return res;
+ }
+ #endif
+ 
+ Datum
+ numeric_int16_var_samp(PG_FUNCTION_ARGS)
+ {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 	Numeric		res;
+ 	bool		is_null;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	res = numeric_int16_stddev_internal(state, true, true, &is_null);
+ 
+ 	if (is_null)
+ 		PG_RETURN_NULL();
+ 	else
+ 		PG_RETURN_NUMERIC(res);
+ #else
+ 	return numeric_var_samp(fcinfo);
+ #endif
+ }
+ 
+ Datum
+ numeric_int16_stddev_samp(PG_FUNCTION_ARGS)
+ {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 	Numeric		res;
+ 	bool		is_null;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	res = numeric_int16_stddev_internal(state, false, true, &is_null);
+ 
+ 	if (is_null)
+ 		PG_RETURN_NULL();
+ 	else
+ 		PG_RETURN_NUMERIC(res);
+ #else
+ 	return numeric_stddev_samp(fcinfo);
+ #endif
+ }
+ 
+ Datum
+ numeric_int16_var_pop(PG_FUNCTION_ARGS)
+ {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 	Numeric		res;
+ 	bool		is_null;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	res = numeric_int16_stddev_internal(state, true, false, &is_null);
+ 
+ 	if (is_null)
+ 		PG_RETURN_NULL();
+ 	else
+ 		PG_RETURN_NUMERIC(res);
+ #else
+ 	return numeric_var_pop(fcinfo);
+ #endif
+ }
+ 
+ Datum
+ numeric_int16_stddev_pop(PG_FUNCTION_ARGS)
+ {
+ #ifdef HAVE_INT128
+ 	Int16AggState *state;
+ 	Numeric		res;
+ 	bool		is_null;
+ 
+ 	state = PG_ARGISNULL(0) ? NULL : (Int16AggState *) PG_GETARG_POINTER(0);
+ 
+ 	res = numeric_int16_stddev_internal(state, false, false, &is_null);
+ 
+ 	if (is_null)
+ 		PG_RETURN_NULL();
+ 	else
+ 		PG_RETURN_NUMERIC(res);
+ #else
+ 	return numeric_stddev_pop(fcinfo);
+ #endif
+ }
+ 
  /*
   * SUM transition functions for integer datatypes.
   *
*************** int8_to_numericvar(int64 val, NumericVar
*** 4509,4514 ****
--- 4856,4908 ----
  	var->weight = ndigits - 1;
  }
  
+ #ifdef HAVE_INT128
+ /*
+  * Convert 128 bit integer to numeric.
+  */
+ static void
+ int16_to_numericvar(int128 val, NumericVar *var)
+ {
+ 	uint128		uval,
+ 				newuval;
+ 	NumericDigit *ptr;
+ 	int			ndigits;
+ 
+ 	/* int16 can require at most 39 decimal digits; add one for safety */
+ 	alloc_var(var, 40 / DEC_DIGITS);
+ 	if (val < 0)
+ 	{
+ 		var->sign = NUMERIC_NEG;
+ 		uval = -val;
+ 	}
+ 	else
+ 	{
+ 		var->sign = NUMERIC_POS;
+ 		uval = val;
+ 	}
+ 	var->dscale = 0;
+ 	if (val == 0)
+ 	{
+ 		var->ndigits = 0;
+ 		var->weight = 0;
+ 		return;
+ 	}
+ 	ptr = var->digits + var->ndigits;
+ 	ndigits = 0;
+ 	do
+ 	{
+ 		ptr--;
+ 		ndigits++;
+ 		newuval = uval / NBASE;
+ 		*ptr = uval - newuval * NBASE;
+ 		uval = newuval;
+ 	} while (uval);
+ 	var->digits = ptr;
+ 	var->ndigits = ndigits;
+ 	var->weight = ndigits - 1;
+ }
+ #endif
+ 
  /*
   * Convert numeric to float8; if out of range, return +/- HUGE_VAL
   */
diff --git a/src/include/c.h b/src/include/c.h
new file mode 100644
index ce38d78..9089a09
*** a/src/include/c.h
--- b/src/include/c.h
*************** typedef unsigned long long int uint64;
*** 297,302 ****
--- 297,312 ----
  #define HAVE_INT64_TIMESTAMP
  #endif
  
+ /*
+  * 128-bit integers
+  */
+ #if defined(HAVE___INT128_T) && defined(HAVE___UINT128_T)
+ typedef __int128_t int128;
+ typedef __uint128_t uint128;
+ 
+ #define HAVE_INT128
+ #endif
+ 
  /* sig_atomic_t is required by ANSI C, but may be missing on old platforms */
  #ifndef HAVE_SIG_ATOMIC_T
  typedef int sig_atomic_t;
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
new file mode 100644
index 3ba9e5e..576288b
*** a/src/include/catalog/pg_aggregate.h
--- b/src/include/catalog/pg_aggregate.h
*************** typedef FormData_pg_aggregate *Form_pg_a
*** 125,147 ****
   */
  
  /* avg */
! DATA(insert ( 2100	n 0 int8_avg_accum	numeric_avg		int8_avg_accum	int8_accum_inv	numeric_avg		f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2101	n 0 int4_avg_accum	int8_avg		int4_avg_accum	int4_avg_accum_inv	int8_avg	f f 0	1016	0	1016	0	"{0,0}" "{0,0}" ));
! DATA(insert ( 2102	n 0 int2_avg_accum	int8_avg		int2_avg_accum	int2_avg_accum_inv	int8_avg	f f 0	1016	0	1016	0	"{0,0}" "{0,0}" ));
! DATA(insert ( 2103	n 0 numeric_avg_accum numeric_avg	numeric_avg_accum numeric_accum_inv numeric_avg f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2104	n 0 float4_accum	float8_avg		-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2105	n 0 float8_accum	float8_avg		-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2106	n 0 interval_accum	interval_avg	interval_accum	interval_accum_inv interval_avg f f 0	1187	0	1187	0	"{0 second,0 second}" "{0 second,0 second}" ));
  
  /* sum */
! DATA(insert ( 2107	n 0 int8_avg_accum	numeric_sum		int8_avg_accum	int8_accum_inv	numeric_sum		f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2108	n 0 int4_sum		-				int4_avg_accum	int4_avg_accum_inv int2int4_sum f f 0	20		0	1016	0	_null_ "{0,0}" ));
! DATA(insert ( 2109	n 0 int2_sum		-				int2_avg_accum	int2_avg_accum_inv int2int4_sum f f 0	20		0	1016	0	_null_ "{0,0}" ));
! DATA(insert ( 2110	n 0 float4pl		-				-				-				-				f f 0	700		0	0		0	_null_ _null_ ));
! DATA(insert ( 2111	n 0 float8pl		-				-				-				-				f f 0	701		0	0		0	_null_ _null_ ));
! DATA(insert ( 2112	n 0 cash_pl			-				cash_pl			cash_mi			-				f f 0	790		0	790		0	_null_ _null_ ));
! DATA(insert ( 2113	n 0 interval_pl		-				interval_pl		interval_mi		-				f f 0	1186	0	1186	0	_null_ _null_ ));
! DATA(insert ( 2114	n 0 numeric_avg_accum	numeric_sum numeric_avg_accum numeric_accum_inv numeric_sum f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* max */
  DATA(insert ( 2115	n 0 int8larger		-				-				-				-				f f 413		20		0	0		0	_null_ _null_ ));
--- 125,147 ----
   */
  
  /* avg */
! DATA(insert ( 2100	n 0 int8_avg_accum	numeric_int16_avg		int8_avg_accum	int8_avg_accum_inv	numeric_int16_avg	f f 0	2281	48	2281	48	_null_ _null_ ));
! DATA(insert ( 2101	n 0 int4_avg_accum	int8_avg		int4_avg_accum	int4_avg_accum_inv	int8_avg					f f 0	1016	0	1016	0	"{0,0}" "{0,0}" ));
! DATA(insert ( 2102	n 0 int2_avg_accum	int8_avg		int2_avg_accum	int2_avg_accum_inv	int8_avg					f f 0	1016	0	1016	0	"{0,0}" "{0,0}" ));
! DATA(insert ( 2103	n 0 numeric_avg_accum numeric_avg	numeric_avg_accum numeric_accum_inv numeric_avg 				f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2104	n 0 float4_accum	float8_avg		-				-				-								f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2105	n 0 float8_accum	float8_avg		-				-				-								f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2106	n 0 interval_accum	interval_avg	interval_accum	interval_accum_inv interval_avg					f f 0	1187	0	1187	0	"{0 second,0 second}" "{0 second,0 second}" ));
  
  /* sum */
! DATA(insert ( 2107	n 0 int8_avg_accum	numeric_int16_sum		int8_avg_accum	int8_avg_accum_inv numeric_int16_sum	f f 0	2281	48	2281	48	_null_ _null_ ));
! DATA(insert ( 2108	n 0 int4_sum		-				int4_avg_accum	int4_avg_accum_inv int2int4_sum 				f f 0	20		0	1016	0	_null_ "{0,0}" ));
! DATA(insert ( 2109	n 0 int2_sum		-				int2_avg_accum	int2_avg_accum_inv int2int4_sum 				f f 0	20		0	1016	0	_null_ "{0,0}" ));
! DATA(insert ( 2110	n 0 float4pl		-				-				-				-								f f 0	700		0	0		0	_null_ _null_ ));
! DATA(insert ( 2111	n 0 float8pl		-				-				-				-								f f 0	701		0	0		0	_null_ _null_ ));
! DATA(insert ( 2112	n 0 cash_pl			-				cash_pl			cash_mi			-								f f 0	790		0	790		0	_null_ _null_ ));
! DATA(insert ( 2113	n 0 interval_pl		-				interval_pl		interval_mi		-								f f 0	1186	0	1186	0	_null_ _null_ ));
! DATA(insert ( 2114	n 0 numeric_avg_accum	numeric_sum numeric_avg_accum numeric_accum_inv numeric_sum					f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* max */
  DATA(insert ( 2115	n 0 int8larger		-				-				-				-				f f 413		20		0	0		0	_null_ _null_ ));
*************** DATA(insert ( 2147	n 0 int8inc_any		-
*** 194,245 ****
  DATA(insert ( 2803	n 0 int8inc			-				int8inc			int8dec			-				f f 0		20		0	20		0	"0" "0" ));
  
  /* var_pop */
! DATA(insert ( 2718	n 0 int8_accum	numeric_var_pop		int8_accum		int8_accum_inv	numeric_var_pop f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2719	n 0 int4_accum	numeric_var_pop		int4_accum		int4_accum_inv	numeric_var_pop f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2720	n 0 int2_accum	numeric_var_pop		int2_accum		int2_accum_inv	numeric_var_pop f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2721	n 0 float4_accum	float8_var_pop	-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2722	n 0 float8_accum	float8_var_pop	-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2723	n 0 numeric_accum	numeric_var_pop numeric_accum numeric_accum_inv numeric_var_pop f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* var_samp */
! DATA(insert ( 2641	n 0 int8_accum	numeric_var_samp	int8_accum		int8_accum_inv	numeric_var_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2642	n 0 int4_accum	numeric_var_samp	int4_accum		int4_accum_inv	numeric_var_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2643	n 0 int2_accum	numeric_var_samp	int2_accum		int2_accum_inv	numeric_var_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2644	n 0 float4_accum	float8_var_samp -				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2645	n 0 float8_accum	float8_var_samp -				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2646	n 0 numeric_accum	numeric_var_samp numeric_accum numeric_accum_inv numeric_var_samp f f 0 2281	128 2281	128 _null_ _null_ ));
  
  /* variance: historical Postgres syntax for var_samp */
! DATA(insert ( 2148	n 0 int8_accum	numeric_var_samp	int8_accum		int8_accum_inv	numeric_var_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2149	n 0 int4_accum	numeric_var_samp	int4_accum		int4_accum_inv	numeric_var_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2150	n 0 int2_accum	numeric_var_samp	int2_accum		int2_accum_inv	numeric_var_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2151	n 0 float4_accum	float8_var_samp -				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2152	n 0 float8_accum	float8_var_samp -				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2153	n 0 numeric_accum	numeric_var_samp numeric_accum numeric_accum_inv numeric_var_samp f f 0 2281	128 2281	128 _null_ _null_ ));
  
  /* stddev_pop */
! DATA(insert ( 2724	n 0 int8_accum	numeric_stddev_pop		int8_accum	int8_accum_inv	numeric_stddev_pop	f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2725	n 0 int4_accum	numeric_stddev_pop		int4_accum	int4_accum_inv	numeric_stddev_pop	f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2726	n 0 int2_accum	numeric_stddev_pop		int2_accum	int2_accum_inv	numeric_stddev_pop	f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2727	n 0 float4_accum	float8_stddev_pop	-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2728	n 0 float8_accum	float8_stddev_pop	-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2729	n 0 numeric_accum	numeric_stddev_pop numeric_accum numeric_accum_inv numeric_stddev_pop f f 0 2281	128 2281	128 _null_ _null_ ));
  
  /* stddev_samp */
! DATA(insert ( 2712	n 0 int8_accum	numeric_stddev_samp		int8_accum	int8_accum_inv	numeric_stddev_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2713	n 0 int4_accum	numeric_stddev_samp		int4_accum	int4_accum_inv	numeric_stddev_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2714	n 0 int2_accum	numeric_stddev_samp		int2_accum	int2_accum_inv	numeric_stddev_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2715	n 0 float4_accum	float8_stddev_samp	-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2716	n 0 float8_accum	float8_stddev_samp	-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2717	n 0 numeric_accum	numeric_stddev_samp numeric_accum numeric_accum_inv numeric_stddev_samp f f 0 2281	128 2281	128 _null_ _null_ ));
  
  /* stddev: historical Postgres syntax for stddev_samp */
! DATA(insert ( 2154	n 0 int8_accum	numeric_stddev_samp		int8_accum	int8_accum_inv	numeric_stddev_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2155	n 0 int4_accum	numeric_stddev_samp		int4_accum	int4_accum_inv	numeric_stddev_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2156	n 0 int2_accum	numeric_stddev_samp		int2_accum	int2_accum_inv	numeric_stddev_samp f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2157	n 0 float4_accum	float8_stddev_samp	-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2158	n 0 float8_accum	float8_stddev_samp	-				-				-				f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2159	n 0 numeric_accum	numeric_stddev_samp numeric_accum numeric_accum_inv numeric_stddev_samp f f 0 2281	128 2281	128 _null_ _null_ ));
  
  /* SQL2003 binary regression aggregates */
  DATA(insert ( 2818	n 0 int8inc_float8_float8	-					-				-				-				f f 0	20		0	0		0	"0" _null_ ));
--- 194,245 ----
  DATA(insert ( 2803	n 0 int8inc			-				int8inc			int8dec			-				f f 0		20		0	20		0	"0" "0" ));
  
  /* var_pop */
! DATA(insert ( 2718	n 0 int8_accum	numeric_var_pop		int8_accum		int8_accum_inv	numeric_var_pop 				f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2719	n 0 int4_accum	numeric_int16_var_pop		int4_accum		int4_accum_inv	numeric_int16_var_pop	f f 0	2281	48	2281	48	_null_ _null_ ));
! DATA(insert ( 2720	n 0 int2_accum	numeric_int16_var_pop		int2_accum		int2_accum_inv	numeric_int16_var_pop	f f 0	2281	48	2281	48	_null_ _null_ ));
! DATA(insert ( 2721	n 0 float4_accum	float8_var_pop	-				-				-								f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2722	n 0 float8_accum	float8_var_pop	-				-				-								f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2723	n 0 numeric_accum	numeric_var_pop numeric_accum numeric_accum_inv numeric_var_pop					f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* var_samp */
! DATA(insert ( 2641	n 0 int8_accum	numeric_var_samp	int8_accum		int8_accum_inv	numeric_var_samp				f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2642	n 0 int4_accum	numeric_int16_var_samp		int4_accum		int4_accum_inv	numeric_int16_var_samp	f f 0	2281	48 	2281	48	_null_ _null_ ));
! DATA(insert ( 2643	n 0 int2_accum	numeric_int16_var_samp		int2_accum		int2_accum_inv	numeric_int16_var_samp	f f 0	2281	48 	2281	48	_null_ _null_ ));
! DATA(insert ( 2644	n 0 float4_accum	float8_var_samp -				-				-								f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2645	n 0 float8_accum	float8_var_samp -				-				-								f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2646	n 0 numeric_accum	numeric_var_samp numeric_accum numeric_accum_inv numeric_var_samp 				f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* variance: historical Postgres syntax for var_samp */
! DATA(insert ( 2148	n 0 int8_accum	numeric_var_samp	int8_accum		int8_accum_inv	numeric_var_samp				f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2149	n 0 int4_accum	numeric_int16_var_samp		int4_accum		int4_accum_inv	numeric_int16_var_samp	f f 0	2281	48 	2281	48 	_null_ _null_ ));
! DATA(insert ( 2150	n 0 int2_accum	numeric_int16_var_samp		int2_accum		int2_accum_inv	numeric_int16_var_samp	f f 0	2281	48 	2281	48 	_null_ _null_ ));
! DATA(insert ( 2151	n 0 float4_accum	float8_var_samp -				-				-								f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2152	n 0 float8_accum	float8_var_samp -				-				-								f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2153	n 0 numeric_accum	numeric_var_samp numeric_accum numeric_accum_inv numeric_var_samp				f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* stddev_pop */
! DATA(insert ( 2724	n 0 int8_accum	numeric_stddev_pop	int8_accum	int8_accum_inv	numeric_stddev_pop					f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2725	n 0 int4_accum	numeric_int16_stddev_pop	int4_accum	int4_accum_inv	numeric_int16_stddev_pop	f f 0	2281	48	2281	48	_null_ _null_ ));
! DATA(insert ( 2726	n 0 int2_accum	numeric_int16_stddev_pop	int2_accum	int2_accum_inv	numeric_int16_stddev_pop	f f 0	2281	48	2281	48	_null_ _null_ ));
! DATA(insert ( 2727	n 0 float4_accum	float8_stddev_pop	-				-				-							f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2728	n 0 float8_accum	float8_stddev_pop	-				-				-							f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2729	n 0 numeric_accum	numeric_stddev_pop numeric_accum numeric_accum_inv numeric_stddev_pop			f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* stddev_samp */
! DATA(insert ( 2712	n 0 int8_accum	numeric_stddev_samp		int8_accum	int8_accum_inv	numeric_stddev_samp				f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2713	n 0 int4_accum	numeric_int16_stddev_samp	int4_accum	int4_accum_inv	numeric_int16_stddev_samp	f f 0	2281	48 	2281	48	_null_ _null_ ));
! DATA(insert ( 2714	n 0 int2_accum	numeric_int16_stddev_samp	int2_accum	int2_accum_inv	numeric_int16_stddev_samp	f f 0	2281	48 	2281	48	_null_ _null_ ));
! DATA(insert ( 2715	n 0 float4_accum	float8_stddev_samp	-				-				-							f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2716	n 0 float8_accum	float8_stddev_samp	-				-				-							f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2717	n 0 numeric_accum	numeric_stddev_samp numeric_accum numeric_accum_inv numeric_stddev_samp			f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* stddev: historical Postgres syntax for stddev_samp */
! DATA(insert ( 2154	n 0 int8_accum	numeric_stddev_samp		int8_accum	int8_accum_inv	numeric_stddev_samp 			f f 0	2281	128 2281	128 _null_ _null_ ));
! DATA(insert ( 2155	n 0 int4_accum	numeric_int16_stddev_samp	int4_accum	int4_accum_inv	numeric_int16_stddev_samp	f f 0	2281	48	2281	48	_null_ _null_ ));
! DATA(insert ( 2156	n 0 int2_accum	numeric_int16_stddev_samp	int2_accum	int2_accum_inv	numeric_int16_stddev_samp	f f 0	2281	48	2281	48	_null_ _null_ ));
! DATA(insert ( 2157	n 0 float4_accum	float8_stddev_samp	-				-				-							f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2158	n 0 float8_accum	float8_stddev_samp	-				-				-							f f 0	1022	0	0		0	"{0,0,0}" _null_ ));
! DATA(insert ( 2159	n 0 numeric_accum	numeric_stddev_samp numeric_accum numeric_accum_inv numeric_stddev_samp			f f 0	2281	128 2281	128 _null_ _null_ ));
  
  /* SQL2003 binary regression aggregates */
  DATA(insert ( 2818	n 0 int8inc_float8_float8	-					-				-				-				f f 0	20		0	0		0	"0" _null_ ));
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
new file mode 100644
index 5d4e889..e813550
*** a/src/include/catalog/pg_proc.h
--- b/src/include/catalog/pg_proc.h
*************** DATA(insert OID = 3568 (  int4_accum_inv
*** 2484,2489 ****
--- 2484,2491 ----
  DESCR("aggregate transition function");
  DATA(insert OID = 3569 (  int8_accum_inv   PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 20" _null_ _null_ _null_ _null_ int8_accum_inv _null_ _null_ _null_ ));
  DESCR("aggregate transition function");
+ DATA(insert OID = 3261 (  int8_avg_accum_inv   PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 20" _null_ _null_ _null_ _null_ int8_avg_accum_inv _null_ _null_ _null_ ));
+ DESCR("aggregate transition function");
  DATA(insert OID = 3178 (  numeric_sum	   PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ numeric_sum _null_ _null_ _null_ ));
  DESCR("aggregate final function");
  DATA(insert OID = 1837 (  numeric_avg	   PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ numeric_avg _null_ _null_ _null_ ));
*************** DATA(insert OID = 1841 (  int4_sum		   P
*** 2502,2507 ****
--- 2504,2522 ----
  DESCR("aggregate transition function");
  DATA(insert OID = 1842 (  int8_sum		   PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 1700 "1700 20" _null_ _null_ _null_ _null_ int8_sum _null_ _null_ _null_ ));
  DESCR("aggregate transition function");
+ DATA(insert OID = 3262 (  numeric_int16_sum	   PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ numeric_int16_sum _null_ _null_ _null_ ));
+ DESCR("aggregate final function");
+ DATA(insert OID = 3263 (  numeric_int16_avg	   PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ numeric_int16_avg _null_ _null_ _null_ ));
+ DESCR("aggregate final function");
+ DATA(insert OID = 3264 (  numeric_int16_var_pop  PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ numeric_int16_var_pop _null_ _null_ _null_ ));
+ DESCR("aggregate final function");
+ DATA(insert OID = 3265 (  numeric_int16_var_samp PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ numeric_int16_var_samp _null_ _null_ _null_ ));
+ DESCR("aggregate final function");
+ DATA(insert OID = 3266 (  numeric_int16_stddev_pop PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_	numeric_int16_stddev_pop _null_ _null_ _null_ ));
+ DESCR("aggregate final function");
+ DATA(insert OID = 3267 (  numeric_int16_stddev_samp	PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ numeric_int16_stddev_samp _null_ _null_ _null_ ));
+ DESCR("aggregate final function");
+ 
  DATA(insert OID = 1843 (  interval_accum   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1187 "1187 1186" _null_ _null_ _null_ _null_ interval_accum _null_ _null_ _null_ ));
  DESCR("aggregate transition function");
  DATA(insert OID = 3549 (  interval_accum_inv   PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1187 "1187 1186" _null_ _null_ _null_ _null_ interval_accum_inv _null_ _null_ _null_ ));
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
new file mode 100644
index 3e78d65..9341f75
*** a/src/include/pg_config.h.in
--- b/src/include/pg_config.h.in
***************
*** 198,203 ****
--- 198,209 ----
  /* Define to 1 if you have __sync_compare_and_swap(int64 *, int64, int64). */
  #undef HAVE_GCC__SYNC_INT64_CAS
  
+ /* Define to 1 if you have __int128_t */
+ #undef HAVE___INT128_T
+ 
+ /* Define to 1 if you have __uint128_t */
+ #undef HAVE___UINT128_T
+ 
  /* Define to 1 if you have the `getaddrinfo' function. */
  #undef HAVE_GETADDRINFO
  
diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h
new file mode 100644
index 3ba34f8..0ce89ae
*** a/src/include/utils/builtins.h
--- b/src/include/utils/builtins.h
*************** extern Datum numeric_var_pop(PG_FUNCTION
*** 1018,1023 ****
--- 1018,1029 ----
  extern Datum numeric_var_samp(PG_FUNCTION_ARGS);
  extern Datum numeric_stddev_pop(PG_FUNCTION_ARGS);
  extern Datum numeric_stddev_samp(PG_FUNCTION_ARGS);
+ extern Datum numeric_int16_sum(PG_FUNCTION_ARGS);
+ extern Datum numeric_int16_avg(PG_FUNCTION_ARGS);
+ extern Datum numeric_int16_var_pop(PG_FUNCTION_ARGS);
+ extern Datum numeric_int16_var_samp(PG_FUNCTION_ARGS);
+ extern Datum numeric_int16_stddev_pop(PG_FUNCTION_ARGS);
+ extern Datum numeric_int16_stddev_samp(PG_FUNCTION_ARGS);
  extern Datum int2_sum(PG_FUNCTION_ARGS);
  extern Datum int4_sum(PG_FUNCTION_ARGS);
  extern Datum int8_sum(PG_FUNCTION_ARGS);
*************** extern Datum int2_avg_accum(PG_FUNCTION_
*** 1025,1030 ****
--- 1031,1037 ----
  extern Datum int4_avg_accum(PG_FUNCTION_ARGS);
  extern Datum int2_avg_accum_inv(PG_FUNCTION_ARGS);
  extern Datum int4_avg_accum_inv(PG_FUNCTION_ARGS);
+ extern Datum int8_avg_accum_inv(PG_FUNCTION_ARGS);
  extern Datum int8_avg(PG_FUNCTION_ARGS);
  extern Datum int2int4_sum(PG_FUNCTION_ARGS);
  extern Datum width_bucket_numeric(PG_FUNCTION_ARGS);
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to