mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
Add numeric_int8_opt_error() to optionally suppress errors
This matches the existing numeric_int4_opt_error() (see commit 16d489b0fe). 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
This commit is contained in:
parent
d4e66a39eb
commit
c1b9e1e56d
@ -4430,15 +4430,23 @@ int8_numeric(PG_FUNCTION_ARGS)
|
|||||||
PG_RETURN_NUMERIC(int64_to_numeric(val));
|
PG_RETURN_NUMERIC(int64_to_numeric(val));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64
|
||||||
Datum
|
numeric_int8_opt_error(Numeric num, bool *have_error)
|
||||||
numeric_int8(PG_FUNCTION_ARGS)
|
|
||||||
{
|
{
|
||||||
Numeric num = PG_GETARG_NUMERIC(0);
|
|
||||||
NumericVar x;
|
NumericVar x;
|
||||||
int64 result;
|
int64 result;
|
||||||
|
|
||||||
|
if (have_error)
|
||||||
|
*have_error = false;
|
||||||
|
|
||||||
if (NUMERIC_IS_SPECIAL(num))
|
if (NUMERIC_IS_SPECIAL(num))
|
||||||
|
{
|
||||||
|
if (have_error)
|
||||||
|
{
|
||||||
|
*have_error = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (NUMERIC_IS_NAN(num))
|
if (NUMERIC_IS_NAN(num))
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
@ -4449,16 +4457,35 @@ numeric_int8(PG_FUNCTION_ARGS)
|
|||||||
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
errmsg("cannot convert infinity to %s", "bigint")));
|
errmsg("cannot convert infinity to %s", "bigint")));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Convert to variable format and thence to int8 */
|
/* Convert to variable format, then convert to int8 */
|
||||||
init_var_from_num(num, &x);
|
init_var_from_num(num, &x);
|
||||||
|
|
||||||
if (!numericvar_to_int64(&x, &result))
|
if (!numericvar_to_int64(&x, &result))
|
||||||
|
{
|
||||||
|
if (have_error)
|
||||||
|
{
|
||||||
|
*have_error = true;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
ereport(ERROR,
|
ereport(ERROR,
|
||||||
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
||||||
errmsg("bigint out of range")));
|
errmsg("bigint out of range")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
PG_RETURN_INT64(result);
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Datum
|
||||||
|
numeric_int8(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
Numeric num = PG_GETARG_NUMERIC(0);
|
||||||
|
|
||||||
|
PG_RETURN_INT64(numeric_int8_opt_error(num, NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,5 +101,6 @@ extern Numeric numeric_div_opt_error(Numeric num1, Numeric num2,
|
|||||||
extern Numeric numeric_mod_opt_error(Numeric num1, Numeric num2,
|
extern Numeric numeric_mod_opt_error(Numeric num1, Numeric num2,
|
||||||
bool *have_error);
|
bool *have_error);
|
||||||
extern int32 numeric_int4_opt_error(Numeric num, bool *have_error);
|
extern int32 numeric_int4_opt_error(Numeric num, bool *have_error);
|
||||||
|
extern int64 numeric_int8_opt_error(Numeric num, bool *have_error);
|
||||||
|
|
||||||
#endif /* _PG_NUMERIC_H_ */
|
#endif /* _PG_NUMERIC_H_ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user