1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-27 12:41:57 +03:00

Convert contrib/intarray's bqarr_in() to report errors softly

Reviewed by Tom Lane and Amul Sul

Discussion: https://postgr.es/m/49e598c2-cfe8-0928-b6fb-d0cc51aab626@dunslane.net
This commit is contained in:
Andrew Dunstan
2022-12-28 09:53:00 -05:00
parent 24b55cd949
commit 3b76622e04
3 changed files with 35 additions and 6 deletions

View File

@ -35,6 +35,7 @@ typedef struct
char *buf;
int32 state;
int32 count;
struct Node *escontext;
/* reverse polish notation in list (for temporary usage) */
NODE *str;
/* number in str */
@ -179,7 +180,7 @@ makepol(WORKSTATE *state)
else
{
if (lenstack == STACKDEPTH)
ereport(ERROR,
ereturn(state->escontext, ERR,
(errcode(ERRCODE_STATEMENT_TOO_COMPLEX),
errmsg("statement too complex")));
stack[lenstack] = val;
@ -206,10 +207,9 @@ makepol(WORKSTATE *state)
break;
case ERR:
default:
ereport(ERROR,
ereturn(state->escontext, ERR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("syntax error")));
return ERR;
}
}
@ -483,6 +483,7 @@ bqarr_in(PG_FUNCTION_ARGS)
ITEM *ptr;
NODE *tmp;
int32 pos = 0;
struct Node *escontext = fcinfo->context;
#ifdef BS_DEBUG
StringInfoData pbuf;
@ -493,16 +494,18 @@ bqarr_in(PG_FUNCTION_ARGS)
state.count = 0;
state.num = 0;
state.str = NULL;
state.escontext = escontext;
/* make polish notation (postfix, but in reverse order) */
makepol(&state);
if (makepol(&state) == ERR)
PG_RETURN_NULL();
if (!state.num)
ereport(ERROR,
ereturn(escontext, (Datum) 0,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("empty query")));
if (state.num > QUERYTYPEMAXITEMS)
ereport(ERROR,
ereturn(escontext, (Datum) 0,
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
errmsg("number of query items (%d) exceeds the maximum allowed (%d)",
state.num, (int) QUERYTYPEMAXITEMS)));