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

Commit90161da

Browse files
committed
Convert a few more datatype input functions to report errors softly.
Convert cash_in and uuid_in to the new style.Amul Sul, minor mods by meDiscussion:https://postgr.es/m/CAAJ_b97KeDWUdpTKGOaFYPv0OicjOu6EW+QYWj-Ywrgj_aEy1g@mail.gmail.com
1 parent47f3f97 commit90161da

File tree

6 files changed

+58
-9
lines changed

6 files changed

+58
-9
lines changed

‎src/backend/utils/adt/cash.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ Datum
9696
cash_in(PG_FUNCTION_ARGS)
9797
{
9898
char*str=PG_GETARG_CSTRING(0);
99+
Node*escontext=fcinfo->context;
99100
Cashresult;
100101
Cashvalue=0;
101102
Cashdec=0;
@@ -209,7 +210,7 @@ cash_in(PG_FUNCTION_ARGS)
209210

210211
if (pg_mul_s64_overflow(value,10,&value)||
211212
pg_sub_s64_overflow(value,digit,&value))
212-
ereport(ERROR,
213+
ereturn(escontext, (Datum)0,
213214
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
214215
errmsg("value \"%s\" is out of range for type %s",
215216
str,"money")));
@@ -234,7 +235,7 @@ cash_in(PG_FUNCTION_ARGS)
234235
{
235236
/* remember we build the value in the negative */
236237
if (pg_sub_s64_overflow(value,1,&value))
237-
ereport(ERROR,
238+
ereturn(escontext, (Datum)0,
238239
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
239240
errmsg("value \"%s\" is out of range for type %s",
240241
str,"money")));
@@ -244,7 +245,7 @@ cash_in(PG_FUNCTION_ARGS)
244245
for (;dec<fpoint;dec++)
245246
{
246247
if (pg_mul_s64_overflow(value,10,&value))
247-
ereport(ERROR,
248+
ereturn(escontext, (Datum)0,
248249
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
249250
errmsg("value \"%s\" is out of range for type %s",
250251
str,"money")));
@@ -271,7 +272,7 @@ cash_in(PG_FUNCTION_ARGS)
271272
elseif (strncmp(s,csymbol,strlen(csymbol))==0)
272273
s+=strlen(csymbol);
273274
else
274-
ereport(ERROR,
275+
ereturn(escontext, (Datum)0,
275276
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
276277
errmsg("invalid input syntax for type %s: \"%s\"",
277278
"money",str)));
@@ -284,7 +285,7 @@ cash_in(PG_FUNCTION_ARGS)
284285
if (sgn>0)
285286
{
286287
if (value==PG_INT64_MIN)
287-
ereport(ERROR,
288+
ereturn(escontext, (Datum)0,
288289
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
289290
errmsg("value \"%s\" is out of range for type %s",
290291
str,"money")));

‎src/backend/utils/adt/uuid.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ typedef struct
3131
hyperLogLogStateabbr_card;/* cardinality estimator */
3232
}uuid_sortsupport_state;
3333

34-
staticvoidstring_to_uuid(constchar*source,pg_uuid_t*uuid);
34+
staticvoidstring_to_uuid(constchar*source,pg_uuid_t*uuid,Node*escontext);
3535
staticintuuid_internal_cmp(constpg_uuid_t*arg1,constpg_uuid_t*arg2);
3636
staticintuuid_fast_cmp(Datumx,Datumy,SortSupportssup);
3737
staticbooluuid_abbrev_abort(intmemtupcount,SortSupportssup);
@@ -44,7 +44,7 @@ uuid_in(PG_FUNCTION_ARGS)
4444
pg_uuid_t*uuid;
4545

4646
uuid= (pg_uuid_t*)palloc(sizeof(*uuid));
47-
string_to_uuid(uuid_str,uuid);
47+
string_to_uuid(uuid_str,uuid,fcinfo->context);
4848
PG_RETURN_UUID_P(uuid);
4949
}
5050

@@ -87,7 +87,7 @@ uuid_out(PG_FUNCTION_ARGS)
8787
* digits, is the only one used for output.)
8888
*/
8989
staticvoid
90-
string_to_uuid(constchar*source,pg_uuid_t*uuid)
90+
string_to_uuid(constchar*source,pg_uuid_t*uuid,Node*escontext)
9191
{
9292
constchar*src=source;
9393
boolbraces= false;
@@ -130,7 +130,7 @@ string_to_uuid(const char *source, pg_uuid_t *uuid)
130130
return;
131131

132132
syntax_error:
133-
ereport(ERROR,
133+
ereturn(escontext,,
134134
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
135135
errmsg("invalid input syntax for type %s: \"%s\"",
136136
"uuid",source)));

‎src/test/regress/expected/money.out

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,31 @@ SELECT '($123,456.78)'::money;
331331
-$123,456.78
332332
(1 row)
333333

334+
-- test non-error-throwing API
335+
SELECT pg_input_is_valid('\x0001', 'money');
336+
pg_input_is_valid
337+
-------------------
338+
f
339+
(1 row)
340+
341+
SELECT pg_input_error_message('\x0001', 'money');
342+
pg_input_error_message
343+
-----------------------------------------------
344+
invalid input syntax for type money: "\x0001"
345+
(1 row)
346+
347+
SELECT pg_input_is_valid('192233720368547758.07', 'money');
348+
pg_input_is_valid
349+
-------------------
350+
f
351+
(1 row)
352+
353+
SELECT pg_input_error_message('192233720368547758.07', 'money');
354+
pg_input_error_message
355+
--------------------------------------------------------------
356+
value "192233720368547758.07" is out of range for type money
357+
(1 row)
358+
334359
-- documented minimums and maximums
335360
SELECT '-92233720368547758.08'::money;
336361
money

‎src/test/regress/expected/uuid.out

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,19 @@ INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-1111-111111111111');
3939
ERROR: invalid input syntax for type uuid: "11+11111-1111-1111-1111-111111111111"
4040
LINE 1: INSERT INTO guid1(guid_field) VALUES('11+11111-1111-1111-111...
4141
^
42+
-- test non-error-throwing API
43+
SELECT pg_input_is_valid('11', 'uuid');
44+
pg_input_is_valid
45+
-------------------
46+
f
47+
(1 row)
48+
49+
SELECT pg_input_error_message('11', 'uuid');
50+
pg_input_error_message
51+
------------------------------------------
52+
invalid input syntax for type uuid: "11"
53+
(1 row)
54+
4255
--inserting three input formats
4356
INSERT INTO guid1(guid_field) VALUES('11111111-1111-1111-1111-111111111111');
4457
INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222}');

‎src/test/regress/sql/money.sql

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ SELECT '-9223372036854775808'::money;
8888
SELECT'(1)'::money;
8989
SELECT'($123,456.78)'::money;
9090

91+
-- test non-error-throwing API
92+
SELECT pg_input_is_valid('\x0001','money');
93+
SELECT pg_input_error_message('\x0001','money');
94+
SELECT pg_input_is_valid('192233720368547758.07','money');
95+
SELECT pg_input_error_message('192233720368547758.07','money');
96+
9197
-- documented minimums and maximums
9298
SELECT'-92233720368547758.08'::money;
9399
SELECT'92233720368547758.07'::money;

‎src/test/regress/sql/uuid.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ INSERT INTO guid1(guid_field) VALUES('{22222222-2222-2222-2222-222222222222 ');
2323
INSERT INTO guid1(guid_field)VALUES('11111111-1111-1111-G111-111111111111');
2424
INSERT INTO guid1(guid_field)VALUES('11+11111-1111-1111-1111-111111111111');
2525

26+
-- test non-error-throwing API
27+
SELECT pg_input_is_valid('11','uuid');
28+
SELECT pg_input_error_message('11','uuid');
29+
2630
--inserting three input formats
2731
INSERT INTO guid1(guid_field)VALUES('11111111-1111-1111-1111-111111111111');
2832
INSERT INTO guid1(guid_field)VALUES('{22222222-2222-2222-2222-222222222222}');

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp