char *buf;
int32 state;
int32 count;
+ struct Node *escontext;
/* reverse polish notation in list (for temporary usage) */
NODE *str;
/* number in str */
else
{
if (lenstack == STACKDEPTH)
- ereport(ERROR,
+ ereturn(state->escontext, ERR,
(errcode(ERRCODE_STATEMENT_TOO_COMPLEX),
errmsg("statement too complex")));
stack[lenstack] = val;
break;
case ERR:
default:
- ereport(ERROR,
+ ereturn(state->escontext, ERR,
(errcode(ERRCODE_SYNTAX_ERROR),
errmsg("syntax error")));
- return ERR;
}
}
ITEM *ptr;
NODE *tmp;
int32 pos = 0;
+ struct Node *escontext = fcinfo->context;
#ifdef BS_DEBUG
StringInfoData pbuf;
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)));
1 & 2 & 4 & ( 5 | !6 )
(1 row)
+-- test non-error-throwing input
+SELECT str as "query_int",
+ pg_input_is_valid(str,'query_int') as ok,
+ pg_input_error_message(str,'query_int') as errmsg
+FROM (VALUES ('1&(2&(4&(5|6)))'),
+ ('1#(2&(4&(5&6)))'),
+ ('foo'))
+ AS a(str);
+ query_int | ok | errmsg
+-----------------+----+--------------
+ 1&(2&(4&(5|6))) | t |
+ 1#(2&(4&(5&6))) | f | syntax error
+ foo | f | syntax error
+(3 rows)
+
CREATE TABLE test__int( a int[] );
\copy test__int from 'data/test__int.data'
ANALYZE test__int;
SELECT '1&(2&(4&(5|6)))'::query_int;
SELECT '1&(2&(4&(5|!6)))'::query_int;
+-- test non-error-throwing input
+
+SELECT str as "query_int",
+ pg_input_is_valid(str,'query_int') as ok,
+ pg_input_error_message(str,'query_int') as errmsg
+FROM (VALUES ('1&(2&(4&(5|6)))'),
+ ('1#(2&(4&(5&6)))'),
+ ('foo'))
+ AS a(str);
+
+
CREATE TABLE test__int( a int[] );
\copy test__int from 'data/test__int.data'