[spip-dev] {titre_mot} ne marche pas lorsqu'il y a une jointure demandée

Avec SPIP stable 2.0.7.

Lorsque l'on fait par exemple :
<BOUCLE_f(FORUMS){titre_mot}{.....}>

La requête générée fait logiquement une jointure avec la table spip_mots.

...INNER JOIN spip_mots AS L2 ON ( L2.id_mot = L1.id_mot )
...
...AND (L2.titre = 'stakhanoviste')

Mais lorsque l'on demande une jointure explicite dans la même boucle (moi c'est pour pouvoir filtrer les forums suivant la rubrique des sites, et ça ça marche) :
<BOUCLE_f(FORUMS syndic){titre_mot}{.....}>

La requête générée fait n'importe quoi.

D'une : il n'y a plus de jointure pour le "from".
De deux : il génère une ligne de "where" complètement absurde :

...AND (titre = 'stakhanoviste')

C'est-à-dire une ligne où le paramètre ne vient ni de la jointure attendue, ni de la boucle de base (sinon ça serait "forum.titre", ce qui serait tout aussi absurde puisque je demande un titre_mot !).
Et du coup ça me génère aussi un "critère titre inconnu" dans la page.

D'après ce que je comprends, il manque surtout la jointure (le inner join) et le préfixe associé devant titre (L2.titre).

Bref. J'ai l'impression d'un bug.

Personne n'aurait confirmé ce bug à tout hasard ?

Je mets une boucle qui est censée générer un mauvais SQL :

"""""""""""""""""""""""""
Les forums de site de la rubrique 4 ayant tel mot-clé
<BOUCLE_test(FORUMS syndic){syndic.id_rubrique=4}{titre_mot=un truc}>
"""""""""""""""""""""""""

=> ça oublie alors de faire la jointure proprement sur spip_mots et il n'y alors plus de "as L2". On se retrouve alors avec "titre = un truc" au lieu de "L2.titre = un truc". Et ça génère une erreur "critère titre inconnu" en ne retournant rien.

Quelqu'un pourrait tester cette boucle chez lui ?
Ou n'importe quelle variante sinon : demander une jointure explicite dans les parenthèses puis demander le critère {titre_mot}.

Merci d'avance.

Bon denisb sur IRC m'a dit qu'il confirmait le bug.
J'ai donc ouvert un ticket :

Les critères produisant une jointure ne marchent pas dans une boucle où l'on a précisé une jointure explicite
http://trac.rezo.net/trac/spip/ticket/1772

Début de traçage :

Ça ne vient pas du calcul du critère en lui-même mais du calcul de la boucle bien en amont.

Dans une boucle normale, lorsque l'on met {titre_mot} cela *ajoute* une jointure dans le tableau "$boucle->jointures".

Boucle (FORUMS) + {titre_mot} :
["jointures"]=>
   array(3) {
     [0]=>
     string(10) "mots_forum"
     [1]=>
     string(4) "mots"
     [2]=>
     string(15) "documents_liens"
   }

Dans une boucle où l'on a ajouté une jointure explicite, on a beau mettre {titre_mot}, il n'y a plus que la jointure explicite dans "$boucle->jointures".

Boucle (FORUMS syndic) + {titre_mot} :
["jointures"]=>
   array(1) {
     [0]=>
     string(6) "syndic"
   }

Et bam !

Est-ce qu'Emmanuel ou un autre bien calé dans le compilateur des boucles voit d'où ça peut venir ?

Remarquez que la personne qui s'y connait ou qui l'a conçu pourrait très bien aussi répondre : "non c'est fait exprès, lorsque l'on indique des jointures explicitement dans les parenthèses alors cela supprime toutes les jointures par défaut".

Est-ce donc fait exprès ou bien faut-il rajouter ces jointures ?
Si c'est fait exprès alors il faut supprimer le ticket, mais il faut aussi que la doc soit claire en indiquant que dans ce cas, il faut rajouter les jointures par défaut en plus de la jointure explicite.

Par exemple pour mon précédent exemple, il faudrait écrire : (FORUMS syndic mots_forum mots) pour ajouter les jointures sur les mots qui sont normalement déjà définies par défaut.