diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index ee98c3f02fc..bf375116d48 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -433,7 +433,7 @@ gettoken_query_websearch(TSQueryParserState state, int8 *operator, } else if (ISOPERATOR(state->buf)) { - /* or else gettoken_tsvector() will raise an error */ + /* ignore, else gettoken_tsvector() will raise an error */ state->buf++; state->state = WAITOPERAND; continue; @@ -492,6 +492,12 @@ gettoken_query_websearch(TSQueryParserState state, int8 *operator, *operator = OP_OR; return PT_OPR; } + else if (ISOPERATOR(state->buf)) + { + /* ignore other operators in this state too */ + state->buf++; + continue; + } else if (*state->buf == '\0') { return PT_END; diff --git a/src/test/regress/expected/tsearch.out b/src/test/regress/expected/tsearch.out index 827321ac917..73f2d13297c 100644 --- a/src/test/regress/expected/tsearch.out +++ b/src/test/regress/expected/tsearch.out @@ -2539,12 +2539,19 @@ select websearch_to_tsquery('simple', 'abc <-> def'); 'abc' & 'def' (1 row) +-- parens are ignored, too select websearch_to_tsquery('simple', 'abc (pg or class)'); websearch_to_tsquery ------------------------ 'abc' & 'pg' | 'class' (1 row) +select websearch_to_tsquery('simple', '(foo bar) or (ding dong)'); + websearch_to_tsquery +--------------------------------- + 'foo' & 'bar' | 'ding' & 'dong' +(1 row) + -- NOT is ignored in quotes select websearch_to_tsquery('english', 'My brand new smartphone'); websearch_to_tsquery diff --git a/src/test/regress/sql/tsearch.sql b/src/test/regress/sql/tsearch.sql index c958e4df0db..a6088288bc7 100644 --- a/src/test/regress/sql/tsearch.sql +++ b/src/test/regress/sql/tsearch.sql @@ -727,7 +727,10 @@ select websearch_to_tsquery('simple', ':'); select websearch_to_tsquery('simple', 'abc & def'); select websearch_to_tsquery('simple', 'abc | def'); select websearch_to_tsquery('simple', 'abc <-> def'); + +-- parens are ignored, too select websearch_to_tsquery('simple', 'abc (pg or class)'); +select websearch_to_tsquery('simple', '(foo bar) or (ding dong)'); -- NOT is ignored in quotes select websearch_to_tsquery('english', 'My brand new smartphone');