summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeodor Sigaev2016-07-15 17:01:41 +0000
committerTeodor Sigaev2016-07-15 17:01:41 +0000
commit00f304ce2dd86f4b76606225b41e0854a3362628 (patch)
treeb7b40fde335f14c7938a17addbb5be4c7726f786
parent19d290155d084754eeb5ebb2569654da06073ee8 (diff)
Fix parsing NOT sequence in tsquery
Digging around bug #14245 I found that commit 6734a1cacd44f5b731933cbc93182b135b167d0c missed that NOT operation is right associative in opposite to all other. This miss is resposible for tsquery parser fail on sequence of NOT operations
-rw-r--r--src/backend/utils/adt/tsquery.c4
-rw-r--r--src/test/regress/expected/tstypes.out36
-rw-r--r--src/test/regress/sql/tstypes.sql6
3 files changed, 45 insertions, 1 deletions
diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c
index 72e608eb91..ab4aa7ca2d 100644
--- a/src/backend/utils/adt/tsquery.c
+++ b/src/backend/utils/adt/tsquery.c
@@ -455,7 +455,9 @@ cleanOpStack(TSQueryParserState state,
while(*lenstack)
{
- if (opPriority > OP_PRIORITY(stack[*lenstack - 1].op))
+ /* NOT is right associative unlike to others */
+ if ((op != OP_NOT && opPriority > OP_PRIORITY(stack[*lenstack - 1].op)) ||
+ (op == OP_NOT && opPriority >= OP_PRIORITY(stack[*lenstack - 1].op)))
break;
(*lenstack)--;
diff --git a/src/test/regress/expected/tstypes.out b/src/test/regress/expected/tstypes.out
index 6705e6900f..886ea747f1 100644
--- a/src/test/regress/expected/tstypes.out
+++ b/src/test/regress/expected/tstypes.out
@@ -330,6 +330,42 @@ SELECT 'a:* & nbb:*ac | doo:a* | goo'::tsquery;
'a':* & 'nbb':*AC | 'doo':*A | 'goo'
(1 row)
+SELECT '!!b'::tsquery;
+ tsquery
+---------
+ !!'b'
+(1 row)
+
+SELECT '!!!b'::tsquery;
+ tsquery
+---------
+ !!!'b'
+(1 row)
+
+SELECT '!(!b)'::tsquery;
+ tsquery
+---------
+ !!'b'
+(1 row)
+
+SELECT 'a & !!b'::tsquery;
+ tsquery
+-------------
+ 'a' & !!'b'
+(1 row)
+
+SELECT '!!a & b'::tsquery;
+ tsquery
+-------------
+ !!'a' & 'b'
+(1 row)
+
+SELECT '!!a & !!b'::tsquery;
+ tsquery
+---------------
+ !!'a' & !!'b'
+(1 row)
+
-- phrase transformation
SELECT 'a <-> (b|c)'::tsquery;
tsquery
diff --git a/src/test/regress/sql/tstypes.sql b/src/test/regress/sql/tstypes.sql
index abcf1504ce..724234d94d 100644
--- a/src/test/regress/sql/tstypes.sql
+++ b/src/test/regress/sql/tstypes.sql
@@ -57,6 +57,12 @@ SELECT '1&(2&(4&(5|!6)))'::tsquery;
SELECT E'1&(''2''&('' 4''&(\\|5 | ''6 \\'' !|&'')))'::tsquery;
SELECT $$'\\as'$$::tsquery;
SELECT 'a:* & nbb:*ac | doo:a* | goo'::tsquery;
+SELECT '!!b'::tsquery;
+SELECT '!!!b'::tsquery;
+SELECT '!(!b)'::tsquery;
+SELECT 'a & !!b'::tsquery;
+SELECT '!!a & b'::tsquery;
+SELECT '!!a & !!b'::tsquery;
-- phrase transformation
SELECT 'a <-> (b|c)'::tsquery;