mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
Convert tsqueryin and tsvectorin to report errors softly.
This is slightly tedious because the adjustments cascade through a couple of levels of subroutines, but it's not very hard. I chose to avoid changing function signatures more than absolutely necessary, by passing the escontext pointer in existing structs where possible. tsquery's nuisance NOTICEs about empty queries are suppressed in soft-error mode, since they're not errors and we surely don't want them to be shown to the user anyway. Maybe that whole behavior should be reconsidered. Discussion: https://postgr.es/m/3824377.1672076822@sss.pgh.pa.us
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "postgres.h"
|
||||
|
||||
#include "libpq/pqformat.h"
|
||||
#include "nodes/miscnodes.h"
|
||||
#include "tsearch/ts_locale.h"
|
||||
#include "tsearch/ts_utils.h"
|
||||
#include "utils/builtins.h"
|
||||
@@ -178,6 +179,7 @@ Datum
|
||||
tsvectorin(PG_FUNCTION_ARGS)
|
||||
{
|
||||
char *buf = PG_GETARG_CSTRING(0);
|
||||
Node *escontext = fcinfo->context;
|
||||
TSVectorParseState state;
|
||||
WordEntryIN *arr;
|
||||
int totallen;
|
||||
@@ -201,7 +203,7 @@ tsvectorin(PG_FUNCTION_ARGS)
|
||||
char *cur;
|
||||
int buflen = 256; /* allocated size of tmpbuf */
|
||||
|
||||
state = init_tsvector_parser(buf, 0);
|
||||
state = init_tsvector_parser(buf, 0, escontext);
|
||||
|
||||
arrlen = 64;
|
||||
arr = (WordEntryIN *) palloc(sizeof(WordEntryIN) * arrlen);
|
||||
@@ -210,14 +212,14 @@ tsvectorin(PG_FUNCTION_ARGS)
|
||||
while (gettoken_tsvector(state, &token, &toklen, &pos, &poslen, NULL))
|
||||
{
|
||||
if (toklen >= MAXSTRLEN)
|
||||
ereport(ERROR,
|
||||
ereturn(escontext, (Datum) 0,
|
||||
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
|
||||
errmsg("word is too long (%ld bytes, max %ld bytes)",
|
||||
(long) toklen,
|
||||
(long) (MAXSTRLEN - 1))));
|
||||
|
||||
if (cur - tmpbuf > MAXSTRPOS)
|
||||
ereport(ERROR,
|
||||
ereturn(escontext, (Datum) 0,
|
||||
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
|
||||
errmsg("string is too long for tsvector (%ld bytes, max %ld bytes)",
|
||||
(long) (cur - tmpbuf), (long) MAXSTRPOS)));
|
||||
@@ -261,13 +263,17 @@ tsvectorin(PG_FUNCTION_ARGS)
|
||||
|
||||
close_tsvector_parser(state);
|
||||
|
||||
/* Did gettoken_tsvector fail? */
|
||||
if (SOFT_ERROR_OCCURRED(escontext))
|
||||
PG_RETURN_NULL();
|
||||
|
||||
if (len > 0)
|
||||
len = uniqueentry(arr, len, tmpbuf, &buflen);
|
||||
else
|
||||
buflen = 0;
|
||||
|
||||
if (buflen > MAXSTRPOS)
|
||||
ereport(ERROR,
|
||||
ereturn(escontext, (Datum) 0,
|
||||
(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
|
||||
errmsg("string is too long for tsvector (%d bytes, max %d bytes)", buflen, MAXSTRPOS)));
|
||||
|
||||
@@ -285,6 +291,7 @@ tsvectorin(PG_FUNCTION_ARGS)
|
||||
stroff += arr[i].entry.len;
|
||||
if (arr[i].entry.haspos)
|
||||
{
|
||||
/* This should be unreachable because of MAXNUMPOS restrictions */
|
||||
if (arr[i].poslen > 0xFFFF)
|
||||
elog(ERROR, "positions array too long");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user