Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0aa8f76

Browse files
committed
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 <[email protected]> Discussion: https://www.postgresql.org/message-id/flat/[email protected]
1 parent a273dcc commit 0aa8f76

File tree

8 files changed

+50
-132
lines changed

8 files changed

+50
-132
lines changed

contrib/btree_gist/btree_numeric.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ gbt_numeric_penalty(PG_FUNCTION_ARGS)
195195
}
196196
else
197197
{
198-
Numeric nul = DatumGetNumeric(DirectFunctionCall1(int4_numeric, Int32GetDatum(0)));
198+
Numeric nul = int64_to_numeric(0);
199199

200200
*result = 0.0;
201201

contrib/jsonb_plperl/jsonb_plperl.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,7 @@ SV_to_JsonbValue(SV *in, JsonbParseState **jsonb_state, bool is_elem)
216216
IV ival = SvIV(in);
217217

218218
out.type = jbvNumeric;
219-
out.val.numeric =
220-
DatumGetNumeric(DirectFunctionCall1(int8_numeric,
221-
Int64GetDatum((int64) ival)));
219+
out.val.numeric = int64_to_numeric(ival);
222220
}
223221
else if (SvNOK(in))
224222
{

src/backend/utils/adt/cash.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1042,7 +1042,7 @@ cash_numeric(PG_FUNCTION_ARGS)
10421042
fpoint = 2;
10431043

10441044
/* convert the integral money value to numeric */
1045-
result = DirectFunctionCall1(int8_numeric, Int64GetDatum(money));
1045+
result = NumericGetDatum(int64_to_numeric(money));
10461046

10471047
/* scale appropriately, if needed */
10481048
if (fpoint > 0)
@@ -1056,8 +1056,7 @@ cash_numeric(PG_FUNCTION_ARGS)
10561056
scale = 1;
10571057
for (i = 0; i < fpoint; i++)
10581058
scale *= 10;
1059-
numeric_scale = DirectFunctionCall1(int8_numeric,
1060-
Int64GetDatum(scale));
1059+
numeric_scale = NumericGetDatum(int64_to_numeric(scale));
10611060

10621061
/*
10631062
* Given integral inputs approaching INT64_MAX, select_div_scale()
@@ -1107,7 +1106,7 @@ numeric_cash(PG_FUNCTION_ARGS)
11071106
scale *= 10;
11081107

11091108
/* multiply the input amount by scale factor */
1110-
numeric_scale = DirectFunctionCall1(int8_numeric, Int64GetDatum(scale));
1109+
numeric_scale = NumericGetDatum(int64_to_numeric(scale));
11111110
amount = DirectFunctionCall2(numeric_mul, amount, numeric_scale);
11121111

11131112
/* note that numeric_int8 will round to nearest integer for us */

src/backend/utils/adt/dbsize.c

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -579,14 +579,6 @@ numeric_to_cstring(Numeric n)
579579
return DatumGetCString(DirectFunctionCall1(numeric_out, d));
580580
}
581581

582-
static Numeric
583-
int64_to_numeric(int64 v)
584-
{
585-
Datum d = Int64GetDatum(v);
586-
587-
return DatumGetNumeric(DirectFunctionCall1(int8_numeric, d));
588-
}
589-
590582
static bool
591583
numeric_is_less(Numeric a, Numeric b)
592584
{
@@ -615,9 +607,9 @@ numeric_half_rounded(Numeric n)
615607
Datum two;
616608
Datum result;
617609

618-
zero = DirectFunctionCall1(int8_numeric, Int64GetDatum(0));
619-
one = DirectFunctionCall1(int8_numeric, Int64GetDatum(1));
620-
two = DirectFunctionCall1(int8_numeric, Int64GetDatum(2));
610+
zero = NumericGetDatum(int64_to_numeric(0));
611+
one = NumericGetDatum(int64_to_numeric(1));
612+
two = NumericGetDatum(int64_to_numeric(2));
621613

622614
if (DatumGetBool(DirectFunctionCall2(numeric_ge, d, zero)))
623615
d = DirectFunctionCall2(numeric_add, d, one);
@@ -632,12 +624,10 @@ static Numeric
632624
numeric_shift_right(Numeric n, unsigned count)
633625
{
634626
Datum d = NumericGetDatum(n);
635-
Datum divisor_int64;
636627
Datum divisor_numeric;
637628
Datum result;
638629

639-
divisor_int64 = Int64GetDatum((int64) (1 << count));
640-
divisor_numeric = DirectFunctionCall1(int8_numeric, divisor_int64);
630+
divisor_numeric = NumericGetDatum(int64_to_numeric(1 << count));
641631
result = DirectFunctionCall2(numeric_div_trunc, d, divisor_numeric);
642632
return DatumGetNumeric(result);
643633
}
@@ -832,8 +822,7 @@ pg_size_bytes(PG_FUNCTION_ARGS)
832822
{
833823
Numeric mul_num;
834824

835-
mul_num = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
836-
Int64GetDatum(multiplier)));
825+
mul_num = int64_to_numeric(multiplier);
837826

838827
num = DatumGetNumeric(DirectFunctionCall2(numeric_mul,
839828
NumericGetDatum(mul_num),

src/backend/utils/adt/formatting.c

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6070,10 +6070,8 @@ numeric_to_number(PG_FUNCTION_ARGS)
60706070
if (IS_MULTI(&Num))
60716071
{
60726072
Numeric x;
6073-
Numeric a = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
6074-
Int32GetDatum(10)));
6075-
Numeric b = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
6076-
Int32GetDatum(-Num.multi)));
6073+
Numeric a = int64_to_numeric(10);
6074+
Numeric b = int64_to_numeric(-Num.multi);
60776075

60786076
x = DatumGetNumeric(DirectFunctionCall2(numeric_power,
60796077
NumericGetDatum(a),
@@ -6162,10 +6160,8 @@ numeric_to_char(PG_FUNCTION_ARGS)
61626160

61636161
if (IS_MULTI(&Num))
61646162
{
6165-
Numeric a = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
6166-
Int32GetDatum(10)));
6167-
Numeric b = DatumGetNumeric(DirectFunctionCall1(int4_numeric,
6168-
Int32GetDatum(Num.multi)));
6163+
Numeric a = int64_to_numeric(10);
6164+
Numeric b = int64_to_numeric(Num.multi);
61696165

61706166
x = DatumGetNumeric(DirectFunctionCall2(numeric_power,
61716167
NumericGetDatum(a),
@@ -6339,11 +6335,8 @@ int8_to_char(PG_FUNCTION_ARGS)
63396335
else if (IS_EEEE(&Num))
63406336
{
63416337
/* to avoid loss of precision, must go via numeric not float8 */
6342-
Numeric val;
6343-
6344-
val = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
6345-
Int64GetDatum(value)));
6346-
orgnum = numeric_out_sci(val, Num.post);
6338+
orgnum = numeric_out_sci(int64_to_numeric(value),
6339+
Num.post);
63476340

63486341
/*
63496342
* numeric_out_sci() does not emit a sign for positive numbers. We

src/backend/utils/adt/jsonpath_exec.c

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -842,9 +842,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
842842
lastjbv = hasNext ? &tmpjbv : palloc(sizeof(*lastjbv));
843843

844844
lastjbv->type = jbvNumeric;
845-
lastjbv->val.numeric =
846-
DatumGetNumeric(DirectFunctionCall1(int4_numeric,
847-
Int32GetDatum(last)));
845+
lastjbv->val.numeric = int64_to_numeric(last);
848846

849847
res = executeNextItem(cxt, jsp, &elem,
850848
lastjbv, found, hasNext);
@@ -1012,9 +1010,7 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
10121010
jb = palloc(sizeof(*jb));
10131011

10141012
jb->type = jbvNumeric;
1015-
jb->val.numeric =
1016-
DatumGetNumeric(DirectFunctionCall1(int4_numeric,
1017-
Int32GetDatum(size)));
1013+
jb->val.numeric = int64_to_numeric(size);
10181014

10191015
res = executeNextItem(cxt, jsp, NULL, jb, found, false);
10201016
}
@@ -1979,8 +1975,7 @@ executeKeyValueMethod(JsonPathExecContext *cxt, JsonPathItem *jsp,
19791975
id += (int64) cxt->baseObject.id * INT64CONST(10000000000);
19801976

19811977
idval.type = jbvNumeric;
1982-
idval.val.numeric = DatumGetNumeric(DirectFunctionCall1(int8_numeric,
1983-
Int64GetDatum(id)));
1978+
idval.val.numeric = int64_to_numeric(id);
19841979

19851980
it = JsonbIteratorInit(jbc);
19861981

0 commit comments

Comments
 (0)