PostgreSQL : la boucle DOCUMENTS génère une requete SQL invalide
Versions des logiciels utilisés :
- SPIP révision r11153
- [[PostgreSQL]] 8.2 (idem avec 8.3)
Avec la "dist", si on ajoute un document joint sur un article, on obtient le message suivant lors de l'affichage de squelette article.html :
Warning: pg_query() [function.pg-query]: Query failed: ERROR: syntax error at or near "." LINE 3: ON `documents`.id_document=a.id_document ^ in /home/drazzib/Dev/spip/ecrire/req/pg.php on line 109
Dans le fichier spip.log, j'observe que les noms de tables sont échappés avec des antiquotes (`) :
SELECT CAST(substring(documents.titre, '^ *[0-9]+') as int)AS num, documents.date, documents.id_document, L1.mime_type, documents.titre, L1.titre AS type_doc ument, documents.taille, documents.descriptif FROM ip_documents AS documents LEFT JOIN spip_documents_articles AS a ON `documents`.id_document=a.id_document LEFT JOIN spip_articles AS aa ON a.id_article=aa.id_article LEFT JOIN spip_documents_breves AS b ON `documents`.id_document=b.id_document LEFT JOIN spip_breves AS bb ON b.id_breve=bb.id_breve LEFT JOIN spip_documents_rubriques AS r ON `documents`.id_document=r.id_rubrique LEFT JOIN spip_rubriques AS rr ON r.id_rubrique=rr.id_rubrique INNER JOIN spip_types_documents AS L1 ON (L1.extension = documents.extension) WHERE (aa.statut = 'publie' OR bb.statut = 'publie' OR rr.statut = 'publie') AND (documents.mode != 'vignette') AND (documents.taille > 0 OR documents.distant='oui') AND 0=1 ORDER BY num,documents.date
Cette requete est declenchée par la function boucle_DOCUMENTS_dist() dans ecrire/public/boucles.php.
Je ne connais pas bien le fonctionnement de cette partie de SPIP, je n'ai donc pas de "patch" clean à disposition :)
Pour le moment, j'ai réussi à contouner le problème en :
- supprimant directement les antiquotes de la jointure
(voir fichier ci-joint) Ca ne me semble pas une solution satisfisant au problème et j'imagine que la vraie correction passe par une modification de la classe req/pg.php afin de "transformer" la requete en version pgSQL.