Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit c1b9e1e

Browse files
committed
Add numeric_int8_opt_error() to optionally suppress errors
This matches the existing numeric_int4_opt_error() (see commit 16d489b). It will be used by a future JSON-related patch, which wants to report errors in its own way and thus does not want the internal functions to throw any error. Author: Jeevan Chalke <jeevan.chalke@enterprisedb.com> Discussion: https://www.postgresql.org/message-id/flat/CAM2+6=XjTyqrrqHAOj80r0wVQxJSxc0iyib9bPC55uFO9VKatg@mail.gmail.com
1 parent d4e66a3 commit c1b9e1e

File tree

2 files changed

+44
-16
lines changed

2 files changed

+44
-16
lines changed

src/backend/utils/adt/numeric.c

Lines changed: 43 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4430,35 +4430,62 @@ int8_numeric(PG_FUNCTION_ARGS)
44304430
PG_RETURN_NUMERIC(int64_to_numeric(val));
44314431
}
44324432

4433-
4434-
Datum
4435-
numeric_int8(PG_FUNCTION_ARGS)
4433+
int64
4434+
numeric_int8_opt_error(Numeric num, bool *have_error)
44364435
{
4437-
Numeric num = PG_GETARG_NUMERIC(0);
44384436
NumericVar x;
44394437
int64 result;
44404438

4439+
if (have_error)
4440+
*have_error = false;
4441+
44414442
if (NUMERIC_IS_SPECIAL(num))
44424443
{
4443-
if (NUMERIC_IS_NAN(num))
4444-
ereport(ERROR,
4445-
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4446-
errmsg("cannot convert NaN to %s", "bigint")));
4444+
if (have_error)
4445+
{
4446+
*have_error = true;
4447+
return 0;
4448+
}
44474449
else
4448-
ereport(ERROR,
4449-
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4450-
errmsg("cannot convert infinity to %s", "bigint")));
4450+
{
4451+
if (NUMERIC_IS_NAN(num))
4452+
ereport(ERROR,
4453+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4454+
errmsg("cannot convert NaN to %s", "bigint")));
4455+
else
4456+
ereport(ERROR,
4457+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4458+
errmsg("cannot convert infinity to %s", "bigint")));
4459+
}
44514460
}
44524461

4453-
/* Convert to variable format and thence to int8 */
4462+
/* Convert to variable format, then convert to int8 */
44544463
init_var_from_num(num, &x);
44554464

44564465
if (!numericvar_to_int64(&x, &result))
4457-
ereport(ERROR,
4458-
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4459-
errmsg("bigint out of range")));
4466+
{
4467+
if (have_error)
4468+
{
4469+
*have_error = true;
4470+
return 0;
4471+
}
4472+
else
4473+
{
4474+
ereport(ERROR,
4475+
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
4476+
errmsg("bigint out of range")));
4477+
}
4478+
}
4479+
4480+
return result;
4481+
}
4482+
4483+
Datum
4484+
numeric_int8(PG_FUNCTION_ARGS)
4485+
{
4486+
Numeric num = PG_GETARG_NUMERIC(0);
44604487

4461-
PG_RETURN_INT64(result);
4488+
PG_RETURN_INT64(numeric_int8_opt_error(num, NULL));
44624489
}
44634490

44644491

src/include/utils/numeric.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,5 +101,6 @@ extern Numeric numeric_div_opt_error(Numeric num1, Numeric num2,
101101
extern Numeric numeric_mod_opt_error(Numeric num1, Numeric num2,
102102
bool *have_error);
103103
extern int32 numeric_int4_opt_error(Numeric num, bool *have_error);
104+
extern int64 numeric_int8_opt_error(Numeric num, bool *have_error);
104105

105106
#endif /* _PG_NUMERIC_H_ */

0 commit comments

Comments
 (0)