diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index 690a80d774..6f53218839 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -439,7 +439,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; @@ -476,15 +476,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)) { @@ -492,15 +486,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 cfa391ac51..9fad6c8b04 100644 --- a/src/test/regress/expected/tsearch.out +++ b/src/test/regress/expected/tsearch.out @@ -2676,12 +2676,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 db2e09be94..fbd26cdba4 100644 --- a/src/test/regress/sql/tsearch.sql +++ b/src/test/regress/sql/tsearch.sql @@ -818,7 +818,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');