Valider 4b4a0a24 rédigé par esj's avatar esj
Parcourir les fichiers

La détection des GroupBy superflus mise au point en [5949] pour une...

La détection des GroupBy superflus mise au point en [5949] pour une optimisation colossale (cf [http://article.gmane.org/gmane.comp.web.spip.devel/30555]) ne se faisait plus depuis la 1.9. C'est réparé pour MySQL, mais PG n'en profite pas et c'est en fait la clé (c'est le cas de le dire) de la subtitlité tournant autour de son message agaçant (cf [9831]) demandant systématiquement un GroupBy:  pour y échapper, il ne faut pas utiliser la syntaxe {{{FROM a,b}}} mais {{{a LEFT JOIN b}}} qui n'impose pas de GroupBy (car c'est parfois bien ce qu'on veut, ça vient de m'arriver et tout s'est éclairé).

Le traducteur Mysql->PG ne rajoute plus de GroupBy systématiquement dans le cas d'un LEFT JOIN, ce qui devrait accéléer les qq requêtes les utilisant dans l'espace privé.Mais:

	*  pour l'espace privé, il faudrait examiner ses 600 appels à select voir s'il y a un {{{FROM a,b}} transformable. On laisse tomber, mais il faut à présent y penser quand on écrit des nouveautés.

	* pour l'espace public, il n'y a pas beaucoup d'endroits où on produit cette forme, il faut donc poser la question: est-ce que tous les critères peuvent se compiler par un LEFT JOIN, et sinon qu'est-ce qui caractérise les exceptions ? L'enjeu est important.

Aussi dans ce dépot: traduction MySQL->PG de la fonction CONV (utile pour faire un CAST dans un critère), et prise en compte dès maintenant d'un LEFT JOIN dans les fonctions d'interface, ça servira tôt (le pb du jour) ou tard.
parent f77151b8
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -867,7 +867,7 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col='', $cond=false)
  // de l'index principal et de l'index de jointure (non conditionnel! [6031])
  // et operateur d'egalite (http://trac.rezo.net/trac/spip/ticket/477)

  if ($pk = (count($boucle->from) == 1) && !$cond) {
  if ($pk = (count($boucle->from) == 2) && !$cond) {
  	if ($pk = $a[1]['key']['PRIMARY KEY']) {
		$id_primary = $ddesc['key']['PRIMARY KEY'];
		$pk = preg_match("/^$id_primary, *$col$/", $pk) OR
+2 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -219,7 +219,8 @@ function spip_select_as($args)
{
	$argsas = "";
	foreach($args as $k => $v) {
		$argsas .= ', ' . $v . (is_numeric($k) ? '' : " AS `$k`");
		if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
		$argsas .= $v . (is_numeric($k) ? '' : " AS `$k`");
	}
	return substr($argsas,2);
}
+8 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -329,7 +329,7 @@ function spip_pg_orderby($order, $select)
function spip_pg_groupby($groupby, $from, $select)
{
	$join = is_array($from) ? (count($from) > 1) : 
	  (strpos($from, ",") OR strpos($from, "JOIN"));
	  (strpos($from, ","));
	if ($join OR $groupby) $join = !is_array($select) ? $select : join(", ", $select);
	if ($join) {
	  $join = str_replace('DISTINCT ','',$join);
@@ -368,13 +368,17 @@ function spip_pg_frommysql($arg)

	$res = spip_pg_fromfield($arg);

	$res = preg_replace('/\brand[(][)]/','random()', $res);
	$res = preg_replace('/\brand[(][)]/i','random()', $res);

	$res = preg_replace('/\b0\.0[+]([a-zA-Z0-9_.]+)\s*/',
			    'CAST(substring(\1, \'^ *[0-9.]+\') as float)',
			    $res);
	$res = preg_replace('/\b0[+]([a-zA-Z0-9_.]+)\s*/',
			    'CAST(substring(\1, \'^ *[0-9]+\') as int)',
			    $res);
	$res = preg_replace('/\bconv[(]([^,]*)[^)]*[)]/i',
			    'CAST(substring(\1, \'^ *[0-9]+\') as int)',
			    $res);
	$res = preg_replace('/UNIX_TIMESTAMP\s*[(]\s*[)]/',
			    'EXTRACT(\'epoch\' FROM NOW())', $res);

@@ -463,7 +467,8 @@ function spip_pg_select_as($args)
				$v = $k;
			elseif ($v != $k) $as = " AS $k"; 
		}
		$argsas .= ', ' . $v . $as; 
		if (strpos($v, 'JOIN') === false)  $argsas .= ', ';
		$argsas .= $v . $as; 
	}
	return substr($argsas,2);
}