Antoher example so you understand how may understand the bug in dovecote core :
# doveadm search -u jom@grosjo.net mailbox Sent text milan
doveadm(jom@grosjo.net): Info: Get last UID of Sent = 61707 -> Correctly assigned the proper mailbox to the back end
doveadm(jom@grosjo.net): Info: Get last UID of Sent = 61707
doveadm(jom@grosjo.net): Info: Query: FLAG=AND
doveadm(jom@grosjo.net): Info: Query(1): add term(wilcard) : Sent -> WHy is "sent" among the serach parameters ???
doveadm(jom@grosjo.net): Info: Query(2): add term(wilcard) : milan
doveadm(jom@grosjo.net): Info: Testing if wildcard
doveadm(jom@grosjo.net): Info: Query: set GLOBAL (no specified header)
doveadm(jom@grosjo.net): Info: Query : ( bcc:milan OR body:milan OR cc:milan OR from:milan OR message-id:milan OR subject:milan OR to:milan ) AND ( bcc:sent OR body:sent OR cc:sent OR from:sent OR message-id:sent OR subject:sent OR to:sent )
doveadm(jom@grosjo.net): Info: Query: 7 results in 71 ms
(and same loop)
In this example, the "Sent" shall *never* be passed as argument to the backend (xapian, solr or any other), only the mailbox reference. However, it appears in the search parameters
For this first point, the problem is that dovecot core sends TWICE the request and "Inbox" appears in the list of arguments ! (inbox shall serve to select teh right mailbox, never sent to the backend)
And even if this would be solved, the dovecot core loops *after* the backend hs returneds the results
# doveadm search -u jom@grosjo.net mailbox inbox text milan
doveadm(jom@grosjo.net): Info: Get last UID of INBOX = 315526
doveadm(jom@grosjo.net): Info: Get last UID of INBOX = 315526
doveadm(jom@grosjo.net): Info: Query: FLAG=AND
doveadm(jom@grosjo.net): Info: Query(1): add term(wilcard) : inbox
doveadm(jom@grosjo.net): Info: Query(2): add term(wilcard) : milan
doveadm(jom@grosjo.net): Info: Testing if wildcard
doveadm(jom@grosjo.net): Info: Query: set GLOBAL (no specified header)
doveadm(jom@grosjo.net): Info: Query : ( bcc:inbox OR body:inbox OR cc:inbox OR from:inbox OR message-id:inbox OR subject:inbox OR to:inbox ) AND ( bcc:milan OR body:milan OR cc:milan OR from:milan OR message-id:milan OR subject:milan OR to:milan )
doveadm(jom@grosjo.net): Info: Query: 2 results in 1 ms // THIS IS WHEN BACKEND HAS FOUND RESULTS AND STOPPED
d82b4b0f550d38593644000095331209 847
d82b4b0f550d38593644000095331209 1569
d82b4b0f550d38593644000095331209 2260
d82b4b0f550d38593644000095331209 2575
d82b4b0f550d38593644000095331209 2811
d82b4b0f550d38593644000095331209 2885
d82b4b0f550d38593644000095331209 3038
d82b4b0f550d38593644000095331209 3121 -> LOOPING FOREVER
On 3 Apr 2019, at 20.30, Joan Moreau via dovecot <dovecot@dovecot.org> wrote:doveadm search -u jom@grosjo.net mailbox inbox text milan
output
doveadm(jom@grosjo.net): Info: Query : ( bcc:inbox OR body:inbox OR cc:inbox OR from:inbox OR message-id:inbox OR subject:inbox OR to:inbox OR uid:inbox ) AND ( bcc:milan OR body:milan OR cc:milan OR from:milan OR message-id:milan OR subject:milan OR to:milan OR uid:milan )
1 - The query is wrong
That's because fts_backend_xapian_lookup() isn't anywhere close to being correct. Try to copy the logic based on solr_add_definite_query_args().