Thread: [sqlsmith] Failed assertion in TS_phrase_execute
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'$$));
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
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
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