<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body style='font-size: 9pt; font-family: Verdana,Geneva,sans-serif'>
<p>for instance, if I do a search from roundcube, the inbo name is NOT passed to the backend (which is normal)</p>
<p>the same search from the command line add the mailbox name ADDITIONALLY to the mailbox * pointer</p>
<p><br /></p>
<p>However, passing a search from roudcube ask TWICE the backend  (first with AND flag, second with OR flag)</p>
<p><br /></p>
<p>THis is obviously a clear bug form the part calling the backend (even if the backend may need improvements ! this is really not the point here)</p>
<p><br /></p>
<p><br /></p>
<p><br /></p>
<p>Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Get last UID of Sent = 61714<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Get last UID of Sent = 61714<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query: FLAG=AND<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(1/1): add term(wilcard) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(2/1): add term(wilcard) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(3/1): add term(wilcard) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(4/1): add term(wilcard) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(5/1): add term(wilcard) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: SEARCH_OR<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: MATCH NOT : 0<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Testing if wildcard<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query: set GLOBAL (no specified header)<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query : ( bcc:milao OR body:milao OR cc:milao OR from:milao OR message-id:milao OR subject:milao OR to:milao )<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query: 0 results in 0 ms<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query: FLAG=OR<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(1): add term(SUBJECT) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: SEARCH_HEADER<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: MATCH NOT : 0<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(2): add term(TO) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: SEARCH_HEADER<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: MATCH NOT : 0<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(3): add term(FROM) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: SEARCH_HEADER<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: MATCH NOT : 0<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(4): add term(CC) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: SEARCH_HEADER<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: MATCH NOT : 0<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query(5): add term(BCC) : milao<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: SEARCH_HEADER<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: MATCH NOT : 0<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Testing if wildcard<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query : ( bcc:milao ) OR ( cc:milao ) OR ( from:milao ) OR ( subject:milao ) OR ( to:milao )<br />Apr 21 11:08:39 gjserver dovecot[14251]: imap(jom@grosjo.net)<15709><Adi/XwiH+ON/AAAB>: Query: 0 results in 0 ms</p>
<div id="signature"> </div>
<p><br /></p>
<p id="reply-intro">On 2019-04-21 11:56, Joan Moreau via dovecot wrote:</p>
<blockquote type="cite" style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0"><!-- html ignored --><!-- head ignored --><!-- meta ignored -->
<p>Timo,</p>
<p>A little of logic here :</p>
<p>1 - the mailbox is passed by dovecot to the backend <span style="text-decoration: underline;">as a mailbox * pointer</span>  , NOT as a search parameter.</p>
<p>-> It works properly when entering a search from roundcube or evolution for instance.</p>
<p>-> therefore this is a clear bug of the command line</p>
<p><br /></p>
<p>2 - the loop : Actually, the timeout occurs because the dovecot core is DISCARDING the results of the backend and do its own search (ie. in my example , it search fo "milan" in my inbox , which is huge , without even considering the backend results</p>
<p>-> This is a enormous error.</p>
<div id="signature"> </div>
<p><br /></p>
<p id="reply-intro">On 2019-04-21 11:29, Timo Sirainen wrote:</p>
<blockquote style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0;">It's because you're misunderstanding how the lookup() function works. It gets ALL the search parameters, including the "mailbox inbox". This is intentional, and not a bug. Two reasons being:
<div> </div>
<div>1) The FTS plugin in theory could support indexing/searching any kinds of searches, not just regular word searches. So I didn't want to limit it unnecessarily.</div>
<div> </div>
<div>2) Especially with "mailbox inbox" this is important when searching from virtual mailboxes. If you configure "All mails in all folders" virtual mailbox, you can do a search in there that restricts which physical mailboxes are matched. In this case the FTS backend can optimize this lookup so it can filter only the physical mailboxes that have matches, leaving the others out. And it can do this in a single query if all the mailboxes are in the same FTS index.</div>
<div> </div>
<div>So again: Your lookup() function needs to be changed to only use those search args that it really wants to search, and ignore the others. Use solr_add_definite_query_args() as the template.</div>
<div> </div>
<div>Also I see now the reason for the timeout problem. It's because you're not setting search_arg->match_always=TRUE. These need to be set for the search args that you're actually using to generate the Xapian query. If it's not set, then Dovecot core doesn't think that the arg was part of the FTS search and it processes it itself. Meaning that it opens all the emails and does the search the slow way, practically making the FTS lookup ignored.</div>
<div> </div>
<div>
<div>
<blockquote style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0;">
<div>On 21 Apr 2019, at 19.50, Joan Moreau <<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>> wrote:</div>
<br class="Apple-interchange-newline" />
<div>
<div style="font-size: 9pt; font-family: Verdana,Geneva,sans-serif;">
<p>No, the parsing is made by dovecot core, that is nothing the backend can do about it. The backend shall *never*  reveive this. (would it be buggy or no)</p>
<p><br /></p>
<p>PLease, have a look deeper</p>
<p>And the loop is a very big problem as it times out all the time (and once again, this is not in any of the backend  functions)</p>
<div id="signature"> </div>
<p><br /></p>
<p id="reply-intro">On 2019-04-21 10:42, Timo Sirainen via dovecot wrote:</p>
<blockquote style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0;">
<div>Inbox appears in the list of arguments, because fts_backend_xapian_lookup() is parsing the search args wrong. Not sure about the other issue.</div>
<div><br />
<blockquote style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0;">
<div>On 21 Apr 2019, at 19.31, Joan Moreau <<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>> wrote:</div>
<br class="Apple-interchange-newline" />
<div>
<div style="font-size: 9pt; font-family: Verdana,Geneva,sans-serif;">
<p>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)</p>
<p>And even if this would be solved, the dovecot core loops *after* the backend hs returneds the results</p>
<p><br /></p>
<p># doveadm search -u <a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a> mailbox inbox text milan<br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): Info: Get last UID of INBOX = 315526<br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): Info: Get last UID of INBOX = 315526<br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): Info: Query: FLAG=AND<br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): Info: Query(1): add term(wilcard) : inbox<br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): Info: Query(2): add term(wilcard) : milan<br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): Info: Testing if wildcard<br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): Info: Query: set GLOBAL (no specified header)<br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): 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 )<br /><strong>doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): Info: Query: 2 results in 1 ms // THIS IS WHEN BACKEND HAS FOUND RESULTS AND STOPPED</strong><br />d82b4b0f550d38593644000095331209 847<br />d82b4b0f550d38593644000095331209 1569<br />d82b4b0f550d38593644000095331209 2260<br />d82b4b0f550d38593644000095331209 2575<br />d82b4b0f550d38593644000095331209 2811<br />d82b4b0f550d38593644000095331209 2885<br />d82b4b0f550d38593644000095331209 3038<br /><strong>d82b4b0f550d38593644000095331209 3121 -> LOOPING FOREVER</strong></p>
<p><br /></p>
<div id="signature"> </div>
<p><br /></p>
<p id="reply-intro">On 2019-04-21 09:57, Timo Sirainen via dovecot wrote:</p>
<blockquote style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0;">
<div class="pre" style="margin: 0; padding: 0; font-family: monospace;">On 3 Apr 2019, at 20.30, Joan Moreau via dovecot <<a href="mailto:dovecot@dovecot.org" rel="noreferrer">dovecot@dovecot.org</a>> wrote:
<blockquote style="padding: 0 0.4em; border-left: #1010ff 2px solid; margin: 0;">doveadm search -u <a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a> mailbox inbox text milan<br />output<br /><br />doveadm(<a href="mailto:jom@grosjo.net" rel="noreferrer">jom@grosjo.net</a>): 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 )<br /><br />1 - The query is wrong</blockquote>
<br />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().<br /><br /><br /></div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</blockquote>
</body></html>