"" <m...@instytut.com.pl> writes: > The expression 'a & !(c) | a & b' is interpreted as '( a | !c ) & a & b'. > select 'a & !(c) | a & b'::tsquery;
> Subsequent "rewrites" of the same expression give inconsistent results: > select '(a & !(c | d)) | (a & b)'::tsquery; -> 'a & !(c | d) | a & b' > (correct) > select 'a & !(c | d) | a & b'::tsquery; -> '(a | !(c | d)) & a & b' (not > correct) Hmm. The immediate problem seems to be fixed by diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index db9236a474157a7851e2a80516e865c050543634..ba09b3b2ce7fcc0815edf4a4622663291d6f0b8f 100644 *** a/src/backend/utils/adt/tsquery.c --- b/src/backend/utils/adt/tsquery.c *************** makepol(TSQueryParserState state, *** 371,378 **** case PT_OPEN: makepol(state, pushval, opaque); ! if (lenstack && (opstack[lenstack - 1] == OP_AND || ! opstack[lenstack - 1] == OP_NOT)) { lenstack--; pushOperator(state, opstack[lenstack]); --- 371,378 ---- case PT_OPEN: makepol(state, pushval, opaque); ! while (lenstack && (opstack[lenstack - 1] == OP_AND || ! opstack[lenstack - 1] == OP_NOT)) { lenstack--; pushOperator(state, opstack[lenstack]); but I can't say that I've got much confidence in the rest of that function. It's an utter kluge. regards, tom lane -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs