BUG #5793: tsquery error

Started by Nonameover 15 years ago2 messagesbugs
Jump to latest
#1Noname
ms@instytut.com.pl

The following bug has been logged online:

Bug reference: 5793
Logged by:
Email address: ms@instytut.com.pl
PostgreSQL version: 8, 9
Operating system: Linux
Description: tsquery error
Details:

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)

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Noname (#1)
Re: BUG #5793: tsquery error

"" <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