aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/utils/adt/tsquery.c22
-rw-r--r--src/test/regress/expected/tsearch.out7
-rw-r--r--src/test/regress/sql/tsearch.sql3
3 files changed, 19 insertions, 13 deletions
diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c
index 690a80d7740..6f532188392 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 cfa391ac512..9fad6c8b04b 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 db2e09be94c..fbd26cdba45 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');