]> granicus.if.org Git - postgresql/commitdiff
Fix parsing NOT sequence in tsquery
authorTeodor Sigaev <teodor@sigaev.ru>
Fri, 15 Jul 2016 17:01:41 +0000 (20:01 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Fri, 15 Jul 2016 17:01:41 +0000 (20:01 +0300)
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

src/backend/utils/adt/tsquery.c
src/test/regress/expected/tstypes.out
src/test/regress/sql/tstypes.sql

index 72e608eb913738d0d4de9afd264fd2f1d98dcf86..ab4aa7ca2d6f193bc1bb64683b8e6ab7284f1c44 100644 (file)
@@ -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)--;
index 6705e6900fcca14c89001dcbb68bc2d7757d5919..886ea747f17733f6b38e15bbd48bbf43b55fa316 100644 (file)
@@ -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          
index abcf1504ce5386539b91295c3d113c166b27be1e..724234d94d25daae8dc7708f2c010791696579c1 100644 (file)
@@ -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;