From bcdb138c3977dd72a17a1ca6a483a024b423d48d Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Mon, 26 Nov 2007 13:51:50 +0000 Subject: [PATCH] =?UTF-8?q?Suite=20de=20[10843]:=20c'est=20en=20fait=20un?= =?UTF-8?q?=20INNER=20JOIN=20qui=20est=20utilis=C3=A9=20implicitement=20da?= =?UTF-8?q?ns=20les=20crit=C3=A8res=20de=20SPIP=20n=C3=A9cessitant=20des?= =?UTF-8?q?=20jointures.=20On=20l'introduit=20afin=20que=20PG=20profite=20?= =?UTF-8?q?des=20optimisations=20=C3=A9liminant=20les=20GroupBy=20au=20lie?= =?UTF-8?q?u=20d'imposer=20de=20les=20=C3=A9crire=20(=C3=A0=20titre=20de?= =?UTF-8?q?=20curiosit=C3=A9,=20ce=20serait=20int=C3=A9ressant=20de=20voir?= =?UTF-8?q?=20si=20MySQL=20les=20rajoute=20sans=20rien=20dire=20ou=20s'il?= =?UTF-8?q?=20calcule=20une=20requ=C3=AAte=20sans=20GroupBy).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecrire/public/composer.php | 8 +++++--- ecrire/public/criteres.php | 5 ----- ecrire/req/mysql.php | 12 ++++++++---- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php index 6360369390..90fab5b2d7 100644 --- a/ecrire/public/composer.php +++ b/ecrire/public/composer.php @@ -499,6 +499,7 @@ function calculer_select ($select = array(), $from = array(), // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln // si elle est seulement utile a Ln+1 elle meme inutile + $sfrom = ''; for($k = count($join); $k > 0; $k--) { list($t,$c) = $join[$k]; $cle = "L$k"; @@ -506,10 +507,11 @@ function calculer_select ($select = array(), $from = array(), OR calculer_jointnul($cle, $select) OR calculer_jointnul($cle, $join) OR calculer_jointnul($cle, $where)) - $where[]= "$t.$c=$cle.$c"; - else { unset($from[$cle]); unset($join[$k]);} + $sfrom = " INNER JOIN " . $from[$cle] . " AS $cle ON $t.$c=$cle.$c" . $sfrom; + else { unset($join[$k]);} + unset($from[$cle]); } - + if ($sfrom) $from[-1] = $sfrom; $GLOBALS['debug']['aucasou'] = array ($table, $id, $serveur); $r = sql_select($select, $from, $where, diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index a0157ba541..ee3e8059d6 100644 --- a/ecrire/public/criteres.php +++ b/ecrire/public/criteres.php @@ -853,13 +853,11 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col='', $cond=false) function fabrique_jointures(&$boucle, $res, $cond=false, $desc, $nom='', $col='') { - spip_log("fj " . join(',',$res) . ' ' . join(';', $desc)); static $num=array(); $id_table = ""; $cpt = &$num[$boucle->descr['nom']][$boucle->id_boucle]; foreach($res as $r) { list($d, $a, $j) = $r; - spip_log("id $id_table d $d a $a[0] j $j"); if (!$id_table) $id_table = $d; $n = ++$cpt; $boucle->join[$n]= array("'$id_table'","'$j'"); @@ -876,17 +874,14 @@ function fabrique_jointures(&$boucle, $res, $cond=false, $desc, $nom='', $col='' if ($pk = ((count($boucle->from) == 2) && !$cond)) { if ($pk = $a[1]['key']['PRIMARY KEY']) { $id_primary = $desc['key']['PRIMARY KEY']; - spip_log("prim $id_primary $col '$pk'"); $pk = (preg_match("/^$id_primary, *$col$/", $pk) OR preg_match("/^$col, *$id_primary$/", $pk)); } } // la clause Group by est en conflit avec ORDER BY, a completer - spip_log("pj '$pk' '$cond' " . join(',',$boucle->from) . " $desc"); if (!$pk) foreach(liste_champs_jointures($nom,$desc) as $id_prim){ $id_field = $nom . '.' . $id_prim; - spip_log("id_field"); if (!in_array($id_field, $boucle->group)) { $boucle->group[] = $id_field; // postgres exige que le champ pour GROUP soit dans le SELECT diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php index 412a2401d8..cb54f2e2bb 100644 --- a/ecrire/req/mysql.php +++ b/ecrire/req/mysql.php @@ -217,12 +217,16 @@ function calculer_where($v) // http://doc.spip.org/@spip_select_as function spip_select_as($args) { - $argsas = ""; + if (isset($args[-1])) { + $join = ' ' . $args[-1]; + unset($args[-1]); + } else $join =''; + $res = ''; foreach($args as $k => $v) { - if (strpos($v, 'JOIN') === false) $argsas .= ', '; - $argsas .= $v . (is_numeric($k) ? '' : " AS `$k`"); + $res .= ', ' . $v . (is_numeric($k) ? '' : " AS `$k`") . $join; + $join = ''; } - return substr($argsas,2); + return substr($res,2); } // -- GitLab