Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0aa8f76

Browse files
committed
Expose internal function for converting int64 to numeric
Existing callers had to take complicated detours viaDirectFunctionCall1(). 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
1 parenta273dcc commit0aa8f76

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-
Numericnul=DatumGetNumeric(DirectFunctionCall1(int4_numeric,Int32GetDatum(0)));
198+
Numericnul=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
IVival=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
elseif (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
returnDatumGetCString(DirectFunctionCall1(numeric_out,d));
580580
}
581581

582-
staticNumeric
583-
int64_to_numeric(int64v)
584-
{
585-
Datumd=Int64GetDatum(v);
586-
587-
returnDatumGetNumeric(DirectFunctionCall1(int8_numeric,d));
588-
}
589-
590582
staticbool
591583
numeric_is_less(Numerica,Numericb)
592584
{
@@ -615,9 +607,9 @@ numeric_half_rounded(Numeric n)
615607
Datumtwo;
616608
Datumresult;
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(Numericn,unsignedcount)
633625
{
634626
Datumd=NumericGetDatum(n);
635-
Datumdivisor_int64;
636627
Datumdivisor_numeric;
637628
Datumresult;
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
returnDatumGetNumeric(result);
643633
}
@@ -832,8 +822,7 @@ pg_size_bytes(PG_FUNCTION_ARGS)
832822
{
833823
Numericmul_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
Numericx;
6073-
Numerica=DatumGetNumeric(DirectFunctionCall1(int4_numeric,
6074-
Int32GetDatum(10)));
6075-
Numericb=DatumGetNumeric(DirectFunctionCall1(int4_numeric,
6076-
Int32GetDatum(-Num.multi)));
6073+
Numerica=int64_to_numeric(10);
6074+
Numericb=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-
Numerica=DatumGetNumeric(DirectFunctionCall1(int4_numeric,
6166-
Int32GetDatum(10)));
6167-
Numericb=DatumGetNumeric(DirectFunctionCall1(int4_numeric,
6168-
Int32GetDatum(Num.multi)));
6163+
Numerica=int64_to_numeric(10);
6164+
Numericb=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
elseif (IS_EEEE(&Num))
63406336
{
63416337
/* to avoid loss of precision, must go via numeric not float8 */
6342-
Numericval;
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)

[8]ページ先頭

©2009-2025 Movatter.jp