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