Valider 814048f7 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

les jointures doivent s'inserer au bon endroit de la requete FROM, et non a la fin,

sinon cela casse des qu'un critere ajout eun from['trucs']='trucs'
le JOIN ne succedant plus le bon from
->refonte du mode d'insertion dans $from du calculer_select et des fonctions xxx_select_as des 3 types de serveur.
Au passage une optimisation des boucles vides est commentee car jamais applicable sur une boucle spip qui contient toujours une reference a la table principale dans le select (statut, mode ...) ajoute par la fonction boucle_XXX correspondante.
Le code de cette optimisation serait a revoir compte tenu de la correction ci dessus
parent c5567297
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+26 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -582,6 +582,7 @@ function calculer_select ($select = array(), $from = array(),
// si elle est seulement utile a Ln+1 elle meme inutile
	
	$sfrom = '';
	$afrom = array();
	$equiv = array();
	$k = count($join);
	foreach(array_reverse($join,true) as $cledef=>$j) {
@@ -603,16 +604,25 @@ function calculer_select ($select = array(), $from = array(),
		OR calculer_jointnul($cle, $join)
		OR calculer_jointnul($cle, $having)
		OR calculer_jointnul($cle, $where_simples)) {
			$sfrom = "\n\t".(isset($from_type[$cle])?$from_type[$cle]:"INNER")." JOIN " . $from[$cle] . " AS $cle ON ($cle.$c = $t.$carr)" . $sfrom;
			//$sfrom = "\n\t".(isset($from_type[$cle])?$from_type[$cle]:"INNER")." JOIN " . $from[$cle] . " AS $cle ON ($cle.$c = $t.$carr)" . $sfrom;
			$afrom[$t][$cle] = (isset($from_type[$cle])?$from_type[$cle]:"INNER")." JOIN " . $from[$cle] . " AS $cle ON ($cle.$c = $t.$carr)";
			if (isset($afrom[$cle])){
				$afrom[$t] = $afrom[$t] + $afrom[$cle];
				unset($afrom[$cle]);
			}
			$equiv[]= $c;
		} else { unset($join[$cledef]);}
		unset($from[$cle]);
		$k--;
	}

	if (count($afrom)) {
		// Regarder si la table principale ne sert finalement a rien comme dans
		// <BOUCLE1(ARTICLES){id_mot} />#TOTAL_BOUCLE<//B1>
	if ($sfrom) {
		// cette optimisation ne peut s'appliquer dans aucune boucle par defaut de SPIP
		// en raison de where ajoutes sur le statut ou autre par SPIP lui meme.
		// on desactive ce morceau de code pour le moment
		/*
	  list($t,$c) = each($from);
	  reset($from);
	  $e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/';
@@ -634,7 +644,18 @@ function calculer_select ($select = array(), $from = array(),
	    $groupby = remplacer_jointnul($t, $groupby, $e);
	    $orderby = remplacer_jointnul($t, $orderby, $e);
	  }
	  $from[-1] = $sfrom; 
	 	// $from[-1] = $sfrom; 
  	*/
	  // reinjecter les jointures dans le from, et dans l'ordre qui va bien
	  $from_synth = array();
	  foreach($from as $k=>$v){
	  	$from_synth[$k]=$from[$k];
	  	if (isset($afrom[$k])) {
	  		$from_synth["$k@"]= implode(' ',$afrom[$k]);
	  		unset($afrom[$k]);
	  	}
	  }
	  $from = $from_synth;
	}

	$GLOBALS['debug']['aucasou'] = array ($table, $id, $serveur);
+16 −13
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -240,12 +240,14 @@ function calculer_mysql_expression($expression, $v, $join = 'AND'){
// http://doc.spip.org/@spip_mysql_select_as
function spip_mysql_select_as($args)
{
	if (isset($args[-1])) {
		$join = ' ' . $args[-1];
		unset($args[-1]);
	} else $join ='';
	$res = '';
	foreach($args as $k => $v) {
		if (substr($k,-1)=='@') {
			// c'est une jointure qui se refere au from precedent
			// pas de virgule
		  $res .= '  ' . $v ;
		}
		else {
		  if (!is_numeric($k)) {
		  	$p = strpos($v, " ");
			if ($p)
@@ -255,7 +257,8 @@ function spip_mysql_select_as($args)
		      
		  $res .= ', ' . $v ;
		}
	return substr($res,2) . $join;
	}
	return substr($res,2);
}

//
+21 −19
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -495,13 +495,14 @@ function calculer_pg_expression($expression, $v, $join = 'AND'){
// http://doc.spip.org/@spip_pg_select_as
function spip_pg_select_as($args)
{
	if (isset($args[-1])) {
		$join = ' ' . $args[-1];
		unset($args[-1]);
	} else $join ='';

	$argsas = "";
	foreach($args as $k => $v) {
		if (substr($k,-1)=='@') {
			// c'est une jointure qui se refere au from precedent
			// pas de virgule
		  $argsas .= '  ' . $v ;
		}
		else {
			$as = '';
			//  spip_log("$k : $v");
			if (!is_numeric($k)) {
@@ -518,6 +519,7 @@ function spip_pg_select_as($args)
			// if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
			$argsas .= ', '. $v . $as; 
		}
	}
	return substr($argsas,2) . $join;
}

+14 −11
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -861,12 +861,14 @@ function _sqlite_calculer_order($orderby) {

// renvoie des 'nom AS alias' 
function _sqlite_calculer_select_as($args){
	if (isset($args[-1])) {
		$join = ' ' . $args[-1];
		unset($args[-1]);
	} else $join ='';
	$res = '';
	foreach($args as $k => $v) {
		if (substr($k,-1)=='@') {
			// c'est une jointure qui se refere au from precedent
			// pas de virgule
		  $res .= '  ' . $v ;
		}
		else {
			if (!is_numeric($k)) {
				$p = strpos($v, " ");
				if ($p)
@@ -875,6 +877,7 @@ function _sqlite_calculer_select_as($args){
	  	}
	  	$res .= ', ' . $v ;
		}
	}
	return substr($res,2) . $join;
}