diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index ded919b39b..1a146372f7 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -420,7 +420,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; @@ -452,15 +452,9 @@ gettoken_query_websearch(TSQueryParserState state, int8 *operator, break; case WAITOPERATOR: - if (t_iseq(state->buf, '"')) + if (*state->buf == '\0') { - /* - * put implicit AND after an operand and handle this quote - * in WAITOPERAND - */ - state->state = WAITOPERAND; - *operator = OP_AND; - return PT_OPR; + return PT_END; } else if (parse_or_operator(state)) { @@ -468,15 +462,17 @@ gettoken_query_websearch(TSQueryParserState state, int8 *operator, *operator = OP_OR; return PT_OPR; } - else if (*state->buf == '\0') + else if (ISOPERATOR(state->buf)) { - return PT_END; + /* ignore other operators in this state too */ + state->buf++; + continue; } else if (!t_isspace(state->buf)) { - /* put implicit AND after an operand */ - *operator = OP_AND; + /* insert implicit AND between operands */ state->state = WAITOPERAND; + *operator = OP_AND; return PT_OPR; } break; diff --git a/src/test/regress/expected/tsearch.out b/src/test/regress/expected/tsearch.out index cfe38aa306..629147c5b1 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 b5a3a68a64..0a90c1b539 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');