summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/adt/tsquery.c8
-rw-r--r--src/test/regress/expected/tsearch.out7
-rw-r--r--src/test/regress/sql/tsearch.sql3
3 files changed, 17 insertions, 1 deletions
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');