[sqlsmith] Failed assertion in TS_phrase_execute

Started by Andreas Seltenreichabout 9 years ago4 messages
#1Andreas Seltenreich
seltenreich@gmx.de

Hi,

the query below triggers an assertion in TS_phrase_execute. Testing was
done on master at dbdfd11.

regards,
Andreas

-- TRAP: FailedAssertion("!(curitem->qoperator.oper == 4)", File: "tsvector_op.c", Line: 1432)

select 'moscow' @@
ts_rewrite('moscow', 'moscow',
ts_rewrite(
tsquery_phrase('moscow','moscow'),
'moscow',
$$ 'sanct' & 'peter'$$));

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Andreas Seltenreich (#1)
Re: [sqlsmith] Failed assertion in TS_phrase_execute

Andreas Seltenreich <seltenreich@gmx.de> writes:

the query below triggers an assertion in TS_phrase_execute. Testing was
done on master at dbdfd11.

-- TRAP: FailedAssertion("!(curitem->qoperator.oper == 4)", File: "tsvector_op.c", Line: 1432)

select 'moscow' @@
ts_rewrite('moscow', 'moscow',
ts_rewrite(
tsquery_phrase('moscow','moscow'),
'moscow',
$$ 'sanct' & 'peter'$$));

Hmm. If you run the ts_rewrite alone, it prints

regression=# select ts_rewrite('moscow', 'moscow',
ts_rewrite(
tsquery_phrase('moscow','moscow'),
'moscow',
$$ 'sanct' & 'peter'$$));
ts_rewrite
-------------------------------------------------
( 'sanct' & 'peter' ) <-> ( 'sanct' & 'peter' )
(1 row)

and if you put that in explicitly, all's well:

regression=# select 'moscow' @@ $$( 'sanct' & 'peter' ) <-> ( 'sanct' & 'peter' )$$::tsquery;
?column?
----------
f
(1 row)

but I notice that some normalization seems to be getting done by
tsqueryin:

regression=# select $$( 'sanct' & 'peter' ) <-> ( 'sanct' & 'peter' )$$::tsquery;
tsquery

--------------------------------------------------------------------------------
-------
'sanct' <-> 'sanct' & 'peter' <-> 'sanct' & 'sanct' <-> 'peter' & 'peter' <-> '
peter'
(1 row)

so this seems to boil down to ts_rewrite failing to apply required
normalization. Or maybe the normalization shouldn't be required.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#2)
Re: [sqlsmith] Failed assertion in TS_phrase_execute

I wrote:

but I notice that some normalization seems to be getting done by
tsqueryin:

regression=# select $$( 'sanct' & 'peter' ) <-> ( 'sanct' & 'peter' )$$::tsquery;
tsquery

--------------------------------------------------------------------------------
-------
'sanct' <-> 'sanct' & 'peter' <-> 'sanct' & 'sanct' <-> 'peter' & 'peter' <-> '
peter'
(1 row)

BTW, it seems like that normalization is wrong. The transformed query
should (and does) match the string "sanct sanct peter sanct sanct peter
peter peter", since each of the <-> pairs has a match somewhere in there.
But I would expect the original query to be specifying that a match occurs
at exactly one place, which of course is unsatisfiable since 'sanct' and
'peter' can't match the same word.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#3)
Re: [sqlsmith] Failed assertion in TS_phrase_execute

I wrote:

but I notice that some normalization seems to be getting done by
tsqueryin:

regression=# select $$( 'sanct' & 'peter' ) <-> ( 'sanct' & 'peter' )$$::tsquery;
tsquery
---------------------------------------------------------------------------------------
'sanct' <-> 'sanct' & 'peter' <-> 'sanct' & 'sanct' <-> 'peter' & 'peter' <-> 'peter'
(1 row)

BTW, it seems like that normalization is wrong. The transformed query
should (and does) match the string "sanct sanct peter sanct sanct peter
peter peter", since each of the <-> pairs has a match somewhere in there.
But I would expect the original query to be specifying that a match occurs
at exactly one place, which of course is unsatisfiable since 'sanct' and
'peter' can't match the same word.

After further thought, it seems like a correct transformation would be
to replace & underneath a PHRASE operator with <0>, ie

('a' & 'b') <N> ('c' & 'd')

becomes

('a' <0> 'b') <N> ('c' <0> 'd')

This would have the same effect of getting rid of non-PHRASE operators
underneath a PHRASE, and it would produce what seems to me much less
surprising results, ie you get a match only when both sides of the &
can match at the same place. Comments?

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers