[spip-dev] Bug sur les points d'interrogation dans les critères

juste pour que ca ne passe pas inapercu :

http://trac.rezo.net/trac/spip/ticket/1382

Je ne reproduis pas le bug. Sur une de mes bases ça me donne:

SELECT documents.id_document, documents.titre
FROM spipnet_documents AS `documents` INNER JOIN spipnet_documents_liens AS L1 ON ( L1.id_document = documents.id_document )
WHERE (documents.mode != 'vignette')
     AND (documents.taille > 0 OR documents.distant='oui')
     AND (L1.id_objet = 3636)
     AND (L1.objet = 'article')
GROUP BY documents.id_document

et me retourne le doc associé.

Committo,Ergo:Sum

Hello ESJ …

ok j’avais réduit le problème bêtement …

ca marche en effet avec la micro boucle …

la ou ca casse c’est dans des boucles “teste tout” utilisée dans des plugins et qui ne bloquaient pas récemment… (sans changer la configuration du site)

Par exemple prenons cette page simple de test ( :

BOUCLE avec points d’interrogation et plusieurs critères facultatifs:


<BOUCLE_docs(DOCUMENTS){id_article ?}{id_rubrique ?}{id_document ?}{id_mot ?}>
#ID_DOCUMENT
</BOUCLE_docs>


BOUCLE sans avec juste {id_article ?} id_article=#ENV{id_article}

documents =
<BOUCLE_docs1(DOCUMENTS){id_article ?}>
#ID_DOCUMENT
</BOUCLE_docs1>

Pour la première boucle, rien ne sors

La seconde est ok

Là je ne comprends pas trop

kent1

Au fait la page est là :

http://kent1.sklunk.net/spip.php?page=test&id_article=99

kent1

2008/7/10 Quentin Drouet <kent1@arscenic.info>:

Oui en effet l'unification des tables de doc_lien a fichu en l'air la prise en compte des critères conditionnels, puisq'on a ça:

SELECT documents.id_document
FROM spipnet_documents AS `documents` INNER JOIN spipnet_documents_liens AS L2 ON ( L2.id_document = documents.id_document ) INNER JOIN spipnet_documents_liens AS L1 ON ( L1.id_document = documents.id_document )
WHERE (documents.mode != 'vignette')
     AND (documents.taille > 0 OR documents.distant='oui')
     AND (L1.id_objet = 3636)
     AND (L1.objet = 'article')
     AND (L2.objet = 'rubrique')
GROUP BY documents.id_document

Faut réfléchir pour ça donne une triple jointure, c'est pas clair à cette heure.

Committo,Ergo:Sum

ok,je vois le probleme
la condition supplémentaire (LN.objet='yyyy') est ajouté sans condition, ce qui fait que la jointure n'est pas supprimee en cas d'absence d'id_yyy.
Je vais regarder
Cédric

regarde ça aussi

http://trac.rezo.net/trac/spip/ticket/1382#comment:3

Committo,Ergo:Sum

oui, c'est bon
concernant la syntaxe
INNER JOIN L on (t.id_xx=L.id_objet AND L.objet='xxx')
je n'ai pas pris le temps de verifier sa compatibilité avec toutes les versons de mysql et autres

Par ailleurs je crois que son implémentation nécessitera de casser encore un peu le compilo.
Du coup, j'ai préféré m'en tenir à une valeur sure en completant la condition dans le ON par un WHERE.
Cela laisse une marge d'optimisation pour la prochaine version

Cédric