diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2022-12-27 12:00:31 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2022-12-27 12:00:31 -0500 |
commit | 78212f21011449f0374831323655baa7c00f3680 (patch) | |
tree | 6ff1d8ba1c89999920225d8f6bfa2d8567a24d77 /src/backend/utils/adt/tsvector.c | |
parent | eb8312a22a84c33fc405ae9b497113973f552f90 (diff) | |
download | postgresql-78212f21011449f0374831323655baa7c00f3680.tar.gz postgresql-78212f21011449f0374831323655baa7c00f3680.zip |
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
Diffstat (limited to 'src/backend/utils/adt/tsvector.c')
-rw-r--r-- | src/backend/utils/adt/tsvector.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c index 04c6f33537a..0b430d3c479 100644 --- a/src/backend/utils/adt/tsvector.c +++ b/src/backend/utils/adt/tsvector.c @@ -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"); |