mirror of
https://github.com/postgres/postgres.git
synced 2025-06-27 23:21:58 +03:00
Expose internal function for converting int64 to numeric
Existing callers had to take complicated detours via DirectFunctionCall1(). This simplifies a lot of code. Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://www.postgresql.org/message-id/flat/42b73d2d-da12-ba9f-570a-420e0cce19d9@phystech.edu
This commit is contained in:
@ -4073,23 +4073,29 @@ numeric_trim_scale(PG_FUNCTION_ARGS)
|
||||
* ----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
Datum
|
||||
int4_numeric(PG_FUNCTION_ARGS)
|
||||
Numeric
|
||||
int64_to_numeric(int64 val)
|
||||
{
|
||||
int32 val = PG_GETARG_INT32(0);
|
||||
Numeric res;
|
||||
NumericVar result;
|
||||
|
||||
init_var(&result);
|
||||
|
||||
int64_to_numericvar((int64) val, &result);
|
||||
int64_to_numericvar(val, &result);
|
||||
|
||||
res = make_result(&result);
|
||||
|
||||
free_var(&result);
|
||||
|
||||
PG_RETURN_NUMERIC(res);
|
||||
return res;
|
||||
}
|
||||
|
||||
Datum
|
||||
int4_numeric(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int32 val = PG_GETARG_INT32(0);
|
||||
|
||||
PG_RETURN_NUMERIC(int64_to_numeric(val));
|
||||
}
|
||||
|
||||
int32
|
||||
@ -4174,18 +4180,8 @@ Datum
|
||||
int8_numeric(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int64 val = PG_GETARG_INT64(0);
|
||||
Numeric res;
|
||||
NumericVar result;
|
||||
|
||||
init_var(&result);
|
||||
|
||||
int64_to_numericvar(val, &result);
|
||||
|
||||
res = make_result(&result);
|
||||
|
||||
free_var(&result);
|
||||
|
||||
PG_RETURN_NUMERIC(res);
|
||||
PG_RETURN_NUMERIC(int64_to_numeric(val));
|
||||
}
|
||||
|
||||
|
||||
@ -4224,18 +4220,8 @@ Datum
|
||||
int2_numeric(PG_FUNCTION_ARGS)
|
||||
{
|
||||
int16 val = PG_GETARG_INT16(0);
|
||||
Numeric res;
|
||||
NumericVar result;
|
||||
|
||||
init_var(&result);
|
||||
|
||||
int64_to_numericvar((int64) val, &result);
|
||||
|
||||
res = make_result(&result);
|
||||
|
||||
free_var(&result);
|
||||
|
||||
PG_RETURN_NUMERIC(res);
|
||||
PG_RETURN_NUMERIC(int64_to_numeric(val));
|
||||
}
|
||||
|
||||
|
||||
@ -5290,11 +5276,7 @@ int2_accum(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT128
|
||||
do_int128_accum(state, (int128) PG_GETARG_INT16(1));
|
||||
#else
|
||||
Numeric newval;
|
||||
|
||||
newval = DatumGetNumeric(DirectFunctionCall1(int2_numeric,
|
||||
PG_GETARG_DATUM(1)));
|
||||
do_numeric_accum(state, newval);
|
||||
do_numeric_accum(state, int64_to_numeric(PG_GETARG_INT16(1)));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -5317,11 +5299,7 @@ int4_accum(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT128
|
||||
do_int128_accum(state, (int128) PG_GETARG_INT32(1));
|
||||
#else
|
||||
Numeric newval;
|
||||
|
||||
newval = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
|
||||
PG_GETARG_DATUM(1)));
|
||||
do_numeric_accum(state, newval);
|
||||
do_numeric_accum(state, int64_to_numeric(PG_GETARG_INT32(1)));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -5340,13 +5318,7 @@ int8_accum(PG_FUNCTION_ARGS)
|
||||
state = makeNumericAggState(fcinfo, true);
|
||||
|
||||
if (!PG_ARGISNULL(1))
|
||||
{
|
||||
Numeric newval;
|
||||
|
||||
newval = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
|
||||
PG_GETARG_DATUM(1)));
|
||||
do_numeric_accum(state, newval);
|
||||
}
|
||||
do_numeric_accum(state, int64_to_numeric(PG_GETARG_INT64(1)));
|
||||
|
||||
PG_RETURN_POINTER(state);
|
||||
}
|
||||
@ -5570,11 +5542,7 @@ int8_avg_accum(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT128
|
||||
do_int128_accum(state, (int128) PG_GETARG_INT64(1));
|
||||
#else
|
||||
Numeric newval;
|
||||
|
||||
newval = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
|
||||
PG_GETARG_DATUM(1)));
|
||||
do_numeric_accum(state, newval);
|
||||
do_numeric_accum(state, int64_to_numeric(PG_GETARG_INT64(1)));
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -5767,13 +5735,8 @@ int2_accum_inv(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT128
|
||||
do_int128_discard(state, (int128) PG_GETARG_INT16(1));
|
||||
#else
|
||||
Numeric newval;
|
||||
|
||||
newval = DatumGetNumeric(DirectFunctionCall1(int2_numeric,
|
||||
PG_GETARG_DATUM(1)));
|
||||
|
||||
/* Should never fail, all inputs have dscale 0 */
|
||||
if (!do_numeric_discard(state, newval))
|
||||
if (!do_numeric_discard(state, int64_to_numeric(PG_GETARG_INT16(1))))
|
||||
elog(ERROR, "do_numeric_discard failed unexpectedly");
|
||||
#endif
|
||||
}
|
||||
@ -5797,13 +5760,8 @@ int4_accum_inv(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT128
|
||||
do_int128_discard(state, (int128) PG_GETARG_INT32(1));
|
||||
#else
|
||||
Numeric newval;
|
||||
|
||||
newval = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
|
||||
PG_GETARG_DATUM(1)));
|
||||
|
||||
/* Should never fail, all inputs have dscale 0 */
|
||||
if (!do_numeric_discard(state, newval))
|
||||
if (!do_numeric_discard(state, int64_to_numeric(PG_GETARG_INT32(1))))
|
||||
elog(ERROR, "do_numeric_discard failed unexpectedly");
|
||||
#endif
|
||||
}
|
||||
@ -5824,13 +5782,8 @@ int8_accum_inv(PG_FUNCTION_ARGS)
|
||||
|
||||
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))
|
||||
if (!do_numeric_discard(state, int64_to_numeric(PG_GETARG_INT64(1))))
|
||||
elog(ERROR, "do_numeric_discard failed unexpectedly");
|
||||
}
|
||||
|
||||
@ -5853,13 +5806,8 @@ int8_avg_accum_inv(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT128
|
||||
do_int128_discard(state, (int128) PG_GETARG_INT64(1));
|
||||
#else
|
||||
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))
|
||||
if (!do_numeric_discard(state, int64_to_numeric(PG_GETARG_INT64(1))))
|
||||
elog(ERROR, "do_numeric_discard failed unexpectedly");
|
||||
#endif
|
||||
}
|
||||
@ -5914,8 +5862,7 @@ numeric_poly_avg(PG_FUNCTION_ARGS)
|
||||
|
||||
int128_to_numericvar(state->sumX, &result);
|
||||
|
||||
countd = DirectFunctionCall1(int8_numeric,
|
||||
Int64GetDatumFast(state->N));
|
||||
countd = NumericGetDatum(int64_to_numeric(state->N));
|
||||
sumd = NumericGetDatum(make_result(&result));
|
||||
|
||||
free_var(&result);
|
||||
@ -5951,7 +5898,7 @@ numeric_avg(PG_FUNCTION_ARGS)
|
||||
if (state->nInfcount > 0)
|
||||
PG_RETURN_NUMERIC(make_result(&const_ninf));
|
||||
|
||||
N_datum = DirectFunctionCall1(int8_numeric, Int64GetDatum(state->N));
|
||||
N_datum = NumericGetDatum(int64_to_numeric(state->N));
|
||||
|
||||
init_var(&sumX_var);
|
||||
accum_sum_final(&state->sumX, &sumX_var);
|
||||
@ -6411,7 +6358,6 @@ Datum
|
||||
int8_sum(PG_FUNCTION_ARGS)
|
||||
{
|
||||
Numeric oldsum;
|
||||
Datum newval;
|
||||
|
||||
if (PG_ARGISNULL(0))
|
||||
{
|
||||
@ -6419,8 +6365,7 @@ int8_sum(PG_FUNCTION_ARGS)
|
||||
if (PG_ARGISNULL(1))
|
||||
PG_RETURN_NULL(); /* still no non-null */
|
||||
/* This is the first non-null input. */
|
||||
newval = DirectFunctionCall1(int8_numeric, PG_GETARG_DATUM(1));
|
||||
PG_RETURN_DATUM(newval);
|
||||
PG_RETURN_NUMERIC(int64_to_numeric(PG_GETARG_INT64(1)));
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6436,10 +6381,9 @@ int8_sum(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_NUMERIC(oldsum);
|
||||
|
||||
/* OK to do the addition. */
|
||||
newval = DirectFunctionCall1(int8_numeric, PG_GETARG_DATUM(1));
|
||||
|
||||
PG_RETURN_DATUM(DirectFunctionCall2(numeric_add,
|
||||
NumericGetDatum(oldsum), newval));
|
||||
NumericGetDatum(oldsum),
|
||||
NumericGetDatum(int64_to_numeric(PG_GETARG_INT64(1)))));
|
||||
}
|
||||
|
||||
|
||||
@ -6618,10 +6562,8 @@ int8_avg(PG_FUNCTION_ARGS)
|
||||
if (transdata->count == 0)
|
||||
PG_RETURN_NULL();
|
||||
|
||||
countd = DirectFunctionCall1(int8_numeric,
|
||||
Int64GetDatumFast(transdata->count));
|
||||
sumd = DirectFunctionCall1(int8_numeric,
|
||||
Int64GetDatumFast(transdata->sum));
|
||||
countd = NumericGetDatum(int64_to_numeric(transdata->count));
|
||||
sumd = NumericGetDatum(int64_to_numeric(transdata->sum));
|
||||
|
||||
PG_RETURN_DATUM(DirectFunctionCall2(numeric_div, sumd, countd));
|
||||
}
|
||||
|
Reference in New Issue
Block a user