mirror of
https://github.com/postgres/postgres.git
synced 2025-06-16 06:01:02 +03:00
Convert a few datatype input functions to use "soft" error reporting.
This patch converts the input functions for bool, int2, int4, int8, float4, float8, numeric, and contrib/cube to the new soft-error style. array_in and record_in are also converted. There's lots more to do, but this is enough to provide proof-of-concept that the soft-error API is usable, as well as reference examples for how to convert input functions. This patch is mostly by me, but it owes very substantial debt to earlier work by Nikita Glukhov, Andrew Dunstan, and Amul Sul. Thanks to Andres Freund for review. Discussion: https://postgr.es/m/3bbbb0df-7382-bf87-9737-340ba096e034@postgrespro.ru
This commit is contained in:
@ -74,6 +74,16 @@ ArrayGetOffset0(int n, const int *tup, const int *scale)
|
||||
*/
|
||||
int
|
||||
ArrayGetNItems(int ndim, const int *dims)
|
||||
{
|
||||
return ArrayGetNItemsSafe(ndim, dims, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* This entry point can return the error into an ErrorSaveContext
|
||||
* instead of throwing an exception. -1 is returned after an error.
|
||||
*/
|
||||
int
|
||||
ArrayGetNItemsSafe(int ndim, const int *dims, struct Node *escontext)
|
||||
{
|
||||
int32 ret;
|
||||
int i;
|
||||
@ -89,7 +99,7 @@ ArrayGetNItems(int ndim, const int *dims)
|
||||
|
||||
/* A negative dimension implies that UB-LB overflowed ... */
|
||||
if (dims[i] < 0)
|
||||
ereport(ERROR,
|
||||
ereturn(escontext, -1,
|
||||
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
|
||||
errmsg("array size exceeds the maximum allowed (%d)",
|
||||
(int) MaxArraySize)));
|
||||
@ -98,14 +108,14 @@ ArrayGetNItems(int ndim, const int *dims)
|
||||
|
||||
ret = (int32) prod;
|
||||
if ((int64) ret != prod)
|
||||
ereport(ERROR,
|
||||
ereturn(escontext, -1,
|
||||
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
|
||||
errmsg("array size exceeds the maximum allowed (%d)",
|
||||
(int) MaxArraySize)));
|
||||
}
|
||||
Assert(ret >= 0);
|
||||
if ((Size) ret > MaxArraySize)
|
||||
ereport(ERROR,
|
||||
ereturn(escontext, -1,
|
||||
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
|
||||
errmsg("array size exceeds the maximum allowed (%d)",
|
||||
(int) MaxArraySize)));
|
||||
@ -126,6 +136,17 @@ ArrayGetNItems(int ndim, const int *dims)
|
||||
*/
|
||||
void
|
||||
ArrayCheckBounds(int ndim, const int *dims, const int *lb)
|
||||
{
|
||||
(void) ArrayCheckBoundsSafe(ndim, dims, lb, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* This entry point can return the error into an ErrorSaveContext
|
||||
* instead of throwing an exception.
|
||||
*/
|
||||
bool
|
||||
ArrayCheckBoundsSafe(int ndim, const int *dims, const int *lb,
|
||||
struct Node *escontext)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -135,11 +156,13 @@ ArrayCheckBounds(int ndim, const int *dims, const int *lb)
|
||||
int32 sum PG_USED_FOR_ASSERTS_ONLY;
|
||||
|
||||
if (pg_add_s32_overflow(dims[i], lb[i], &sum))
|
||||
ereport(ERROR,
|
||||
ereturn(escontext, false,
|
||||
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
|
||||
errmsg("array lower bound is too large: %d",
|
||||
lb[i])));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user