Re: BUG #5793: tsquery error
От | Tom Lane |
---|---|
Тема | Re: BUG #5793: tsquery error |
Дата | |
Msg-id | 16079.1292734266@sss.pgh.pa.us обсуждение исходный текст |
Ответ на | BUG #5793: tsquery error ("" <ms@instytut.com.pl>) |
Список | pgsql-bugs |
"" <ms@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
В списке pgsql-bugs по дате отправления: