Project

General

Profile

Anomalie #4465

Table principale enlevée de la requête sur double jointure avec mots et auteurs

Added by Mathieu Lopes about 1 year ago. Updated about 1 month ago.

Status:
Fermé
Priority:
Haut
Assignee:
-
Category:
-
Target version:
Start date:
03/24/2020
Due date:
% Done:

0%

Resolution:
fixed
Navigateur:

Description

Bug découvert avec l'aide de marcimat sur IRC.

Sur ces boucles
TEST
<BOUCLE_test(DEPOTS){id_mot=1}> depot #ID_DEPOT<br/></BOUCLE_test>
<BOUCLE_test2(DEPOTS){id_auteur=1}> depot2 #ID_DEPOT<br/></BOUCLE_test2>
<BOUCLE_test3(DEPOTS){id_mot=1}{id_auteur=1}>depot3 #ID_DEPOT<br/></BOUCLE_test3>

Une erreur est levée :
Erreur SQL 1054
Unknown column 'depots.id_depot' in 'on clause'
SELECT L2.id_objet, L2.id_objet AS id_depot FROM spip_auteurs_liens AS `L2` INNER JOIN spip_mots_liens AS L1 ON ( L1.id_objet = depots.id_depot AND L1.objet='depot') WHERE (L1.id_mot = 1) AND (L2.id_auteur = 1) GROUP BY L2.id_objet

Dans la boucle test3 : la table principale est virée de la clause FROM (alors que le debug indique que tout est bon).

Bug découvert en essayant de créer un nouvel objet éditorial.

Pas de soucis avec les objets ARTICLES ou BREVES " (mais il y a un champ statut dessus, qui ajoute un champ)" (dixit marcimat)

"pareil avec : <BOUCLE_test(MESSAGES){tout}{id_mot=1}> #ID_MESSAGE<br/></BOUCLE_test>
qui crée une mauvaise requête
WHERE (L1.id_mot = 1)
alors qu’il faudrait WHERE (L1.id_mot = 1) AND (L1.objet = 'message')"

History

#1 Updated by marcimat 🌻 about 1 year ago

Dans la boucle <BOUCLE_test(DEPOTS){id_mot=1}> depot #ID_DEPOT<br/></BOUCLE_test>
Il crée une requête (comme <BOUCLE_test(MESSAGES){tout}{id_mot=1}> #ID_MESSAGE<br/></BOUCLE_test> d’ailleurs) qui
ne contient pas 'spip_depots', mais juste FROM spip_mots_liens AS L1 comprenant qu’il peut obtenir ID_DEPOT depuis la colonne L1.id_objet,
ce qui est tout à fait juste. Cepedant, il manque dans le WHERE le AND (L1.objet='depot').

Je suspecte une optimisation à un moment donné du compilateur qui comprend qu’aucun champ de 'spip_depots' n’est nécessaire, et retire la table du FROM en conséquence.
Pour le Where par contre, je ne sais pas.

Dès qu’on ajoute un champ de la table dans la boucle, tel que #TITRE, la requête devient correcte.

#2 Updated by marcimat 🌻 about 1 year ago

Avec #TITRE

SELECT depots.id_depot, depots.titre
FROM spip_depots AS `depots`  
INNER JOIN spip_mots_liens AS L1 ON ( L1.id_objet = depots.id_depot AND L1.objet='depot')
WHERE (L1.id_mot = 1)
GROUP BY depots.id_depot

Sans #TITRE

SELECT L1.id_objet, L1.id_objet AS id_depot
FROM spip_mots_liens AS `L1`  
WHERE (L1.id_mot = 1)
GROUP BY L1.id_objet

En fait le AND L1.objet='depot' qui saute est dans la clause ON de la jointure, qui n’a plus lieu d’être avec l’optimisation. Peut être que ça vient de là son absence.

#3 Updated by marcimat 🌻 about 1 year ago

Une partie se passe dans fabrique_jointure() : le where complémentaire (L1.objet = 'depot') n’est pas ajouté volontairement et laissé dans la jointure
https://git.spip.net/spip/spip/src/branch/master/ecrire/public/jointures.php#L174

L’autre partie doit se situer sur les optimisations dans calculer_select() par là :
https://git.spip.net/spip/spip/src/branch/master/ecrire/public/composer.php#L932

#4 Updated by Mathieu Lopes about 1 year ago

"alors que le debug indique que tout est bon" => je précise ce que je veux dire par là : la page avec var_mode=debug, en choisissant "code" sur la boucle en erreur, indique que le tableau $command['from'] contient bien toutes les tables qu'il faut

#5 Updated by cedric - 2 months ago

  • Target version changed from 3.2 to 3.3

#6 Updated by cedric - about 2 months ago

Ah j'ai retrouvé le commit d'origine (pas le report) qui explique bien pourquoi j'avais fait ça :
https://git.spip.net/spip/spip/commit/d711e9c740a7fda98e3049d9ee5322e631363fc3

Si on rajoute la condition dans le where c'est la boucle <BOUCLE(ARTICLES){id_document?}>...</BOUCLE> qui ne s'optimise plus quand aucun id_document n'est passé car la condition dans le where bloque l'optimisation

Ça s'annonce pas simple...

#7 Updated by cedric - about 2 months ago

J'ai donc un patch qui corrige ça sans recasser le problème d'origine, à tester un peu intensivement
https://git.spip.net/spip/spip/pulls/124

#8 Updated by cedric - about 2 months ago

  • Status changed from Nouveau to En cours

#9 Updated by cedric - about 1 month ago

  • Status changed from En cours to Fermé
  • Resolution set to fixed

intégré

Also available in: Atom PDF