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