[spip-dev] postgresql - compilateur ?

En utilisant le plugin mediatheque, avec une base de données en PostGreSQL,
lors du premier clic sur Edition -> Mediathèque, je reçois l'erreur suivante:

Erreur SQL 1000
errcode: 1000 : GROUP BY position 0 is not in select list LINE 7: GROUP BY
media, documents.id_document, 0, L4.media ^

SELECT documents.id_document, 0 as points, COUNT(L4.extension) AS
compteur_types_documents, L4.media FROM spip_documents AS documents INNER JOIN
spip_types_documents AS L4 ON ( L4.extension = documents.extension ) WHERE
(documents.mode != 'vignette') AND (documents.taille > 0 OR
documents.distant='oui') AND ((L4.media IN ('image','audio','video','file')))
GROUP BY media, documents.id_document, 0, L4.media ORDER BY case when
L4.media='image' then 1 when L4.media='audio' then 2 when L4.media='video' then
3 when L4.media='file' then 4 else 0 end

Si j'ai bien lu la doc, la solution, en SQL, est de remplacer "0" par
"points" dans GROUP BY (dernières lignes de
http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html) (ca
marche avec PostGreSQL):

SELECT documents.id_document, 0 as points, COUNT(L4.extension) AS
compteur_types_documents, L4.media FROM spip_documents AS documents INNER JOIN
spip_types_documents AS L4 ON ( L4.extension = documents.extension ) WHERE
(documents.mode != 'vignette') AND (documents.taille > 0 OR
documents.distant='oui') AND ((L4.media IN ('image','audio','video','file')))
GROUP BY media, documents.id_document, points, L4.media ORDER BY case when
L4.media='image' then 1 when L4.media='audio' then 2 when L4.media='video' then
3 when L4.media='file' then 4 else 0 end

Pour ca, je pense qu'il faut modifier le compilateur, parce que le squelette
parait bien (pardon je coupe les lignes):

<BOUCLE_medias(DOCUMENTS){id_rubrique ?}{id_article ?}{id_breve ?}
  {id_document ?}{recherche ?}{statut==.*}{compteur types_documents, media}
  {media IN image,audio,video,file}>
[<li class='#MEDIA'>(#GET{self}|parametre_url{media,#MEDIA}
   >aoustrong{#VAL{medias:media_}|concat{#MEDIA}|_T
   >concat{' (',#COMPTEUR{types_documents},')'},#ENV{media}
   >=={#MEDIA},ajax})</li>]
</BOUCLE_medias>

Qqn a un avis sur la question ?

Severo

Severo <lesage.sylvain <at> laposte.net> writes:

En utilisant le plugin mediatheque, avec une base de données en PostGreSQL,
lors du premier clic sur Edition -> Mediathèque, je reçois l'erreur suivante:

Erreur SQL 1000
errcode: 1000 : GROUP BY position 0 is not in select list LINE 7: GROUP BY
media, documents.id_document, 0, L4.media ^

SELECT documents.id_document, 0 as points, COUNT(L4.extension) AS
compteur_types_documents, L4.media FROM spip_documents AS documents INNER JOIN
spip_types_documents AS L4 ON ( L4.extension = documents.extension ) WHERE
(documents.mode != 'vignette') AND (documents.taille > 0 OR
documents.distant='oui') AND ((L4.media IN ('image','audio','video','file')))
GROUP BY media, documents.id_document, 0, L4.media ORDER BY case when
L4.media='image' then 1 when L4.media='audio' then 2 when L4.media='video' then
3 when L4.media='file' then 4 else 0 end

Si j'ai bien lu la doc, la solution, en SQL, est de remplacer "0" par
"points" dans GROUP BY (dernières lignes de
http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html) (ca
marche avec PostGreSQL):

SELECT documents.id_document, 0 as points, COUNT(L4.extension) AS
compteur_types_documents, L4.media FROM spip_documents AS documents INNER JOIN
spip_types_documents AS L4 ON ( L4.extension = documents.extension ) WHERE
(documents.mode != 'vignette') AND (documents.taille > 0 OR
documents.distant='oui') AND ((L4.media IN ('image','audio','video','file')))
GROUP BY media, documents.id_document, points, L4.media ORDER BY case when
L4.media='image' then 1 when L4.media='audio' then 2 when L4.media='video' then
3 when L4.media='file' then 4 else 0 end

Pour ca, je pense qu'il faut modifier le compilateur, parce que le squelette
parait bien (pardon je coupe les lignes):

<BOUCLE_medias(DOCUMENTS){id_rubrique ?}{id_article ?}{id_breve ?}
  {id_document ?}{recherche ?}{statut==.*}{compteur types_documents, media}
  {media IN image,audio,video,file}>
[<li class='#MEDIA'>(#GET{self}|parametre_url{media,#MEDIA}
   >aoustrong{#VAL{medias:media_}|concat{#MEDIA}|_T
   >concat{' (',#COMPTEUR{types_documents},')'},#ENV{media}
   >=={#MEDIA},ajax})</li>]
</BOUCLE_medias>

Qqn a un avis sur la question ?

Severo

Bonjour,

Je viens de «tomber» sur votre post. J'ai exactement le même problème
(quand je vais sur la page auteurs) après l'installation des plugins
SPIP-Bonux et Afficher Objets.
J'ai d'ailleurs deux autres bugs dans Afficher Objets... (sans doute
lié au différences entre PostgreSQL et MySQL ?)

Pour ma part, je vies de «solutionner» ce bug (sans doute pas très proprement)
en éditant le fichier :
ecrire/inc/prepare_recherche.php

=> à la ligne 33 j'ai remplacé :
- return array("0 as points" /* as points */, /* where */ '');
+ return array("1 as points" /* as points */, /* where */ '');

Pour une raison que je ne m'explique pas complètement, il n'y a
maintenant plus de SQL Error 1000 !

Serge.

http://core.spip.org/projects/spip/repository/revisions/20019

Committo,Ergo:Sum