diff options
author | Teodor Sigaev | 2016-07-15 17:01:41 +0000 |
---|---|---|
committer | Teodor Sigaev | 2016-07-15 17:01:41 +0000 |
commit | 00f304ce2dd86f4b76606225b41e0854a3362628 (patch) | |
tree | b7b40fde335f14c7938a17addbb5be4c7726f786 | |
parent | 19d290155d084754eeb5ebb2569654da06073ee8 (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.c | 4 | ||||
-rw-r--r-- | src/test/regress/expected/tstypes.out | 36 | ||||
-rw-r--r-- | src/test/regress/sql/tstypes.sql | 6 |
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; |