From 66e13f604ff9245611d7edf4a870323db47f6eb4 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sun, 5 Aug 2007 20:29:28 +0000
Subject: [PATCH] =?UTF-8?q?%#209:=20Une=20colonne=20dans=20la=20clause=20'?=
 =?UTF-8?q?''ORDER'''=20doit=20etre=20mis=20apr=C3=A8s=20le=20'''SELECT'''?=
 =?UTF-8?q?=20en=20Postgres.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Neutralisation de la construction MySQL spécifique '''FIELD''' (avec '''HAVING''') pour permettre au squelette standard ''article'' de s'afficher sans erreur Postgres mais c'est insatisfaisant évidemment.

Modifs pour que le débusqueur puisse s'appliquer en cas d'erreur Postgres, mais là aussi c'est encore très bricolé tant il n'était pas prévu qu'il puisse s'appliquer à autre chose que MySQL.
---
 ecrire/base/db_pg.php      | 20 ++++++++++++++++----
 ecrire/public/criteres.php | 29 +++++++++++++++++++++--------
 ecrire/public/debug.php    |  9 +++++++--
 3 files changed, 44 insertions(+), 14 deletions(-)

diff --git a/ecrire/base/db_pg.php b/ecrire/base/db_pg.php
index aa4acf2916..294b30e9c4 100644
--- a/ecrire/base/db_pg.php
+++ b/ecrire/base/db_pg.php
@@ -84,6 +84,12 @@ function spip_pg_select($select, $from, $where,
 		$count = $limatch[3];
 	}
 
+	if ($having) {
+	  if (is_array($having))
+	    $having = join("\n\tAND ", array_map('calculer_pg_where', $having));
+	  spip_log("SPIP-PG ne sait pas traduire HAVING $having"); # a revoir
+	  $having ='';
+	}
 	$q =  spip_pg_nocast($select) .
 	  (!$from ? '' :
 			("\nFROM " .
@@ -122,8 +128,11 @@ function spip_pg_groupby($groupby, $from, $select)
 	$join = is_array($from) ? (count($from) > 1) : strpos($from, ",");
 	if ($join) $join = !is_array($select) ? $select : join(", ", $select);
 	if ($join) $groupby = $groupby ? "$groupby, $join" : $join;
+	if (!$groupby) return '';
+	$groupby = spip_pg_nocast($groupby);
 	$groupby = preg_replace('/\s+AS\s+\w+/','', $groupby);
-	return (!$groupby ? '' : ("\nGROUP BY " . spip_pg_nocast($groupby)));
+	$groupby = trim(preg_replace('/SUM\(\w+\)\s*,/','', $groupby));
+	return "\nGROUP BY $groupby"; 
 }
 
 // 0+x avec un champ x commencant par des chiffres est converti par MySQL
@@ -133,8 +142,11 @@ function spip_pg_groupby($groupby, $from, $select)
 function spip_pg_nocast($arg)
 {
 	if (is_array($arg)) $arg = join(", ", $arg);
-	$arg = preg_replace('/\b0[+]([^, ]+)\s*,\s*\1\b/', '\1', $arg);
-	return preg_replace('/\b0[+]([^, ]+\b)/', '\1', $arg);
+	$res = preg_replace('/FIELD[(]([^,]*)[^)]*[)]/','1',$arg);
+	$res = preg_replace('/\b0[+]([^, ]+)\s*,\s*\1\b/', '\1', $res);
+	if ($res != $arg)
+	  spip_log("SPIP-PG ne sait pas traduire $arg"); # a revoir
+	return preg_replace('/\b0[+]([^, ]+\b)/', '\1', $res);
 }
 
 
@@ -233,7 +245,7 @@ function spip_pg_update($table, $exp, $where='') {
 
 // http://doc.spip.org/@spip_pg_error
 function spip_pg_error() {
-	return pg_last_error();
+	return str_replace('ERROR', 'errcode: 1000 ', pg_last_error());
 }
 
 // http://doc.spip.org/@spip_pg_errno
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 4c12efc3e0..23f2324793 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -287,10 +287,13 @@ function critere_logo_dist($idb, &$boucles, $crit) {
 // http://doc.spip.org/@critere_fusion_dist
 function critere_fusion_dist($idb,&$boucles, $crit) {
 	if (isset($crit->param[0])) {
-		$x = $crit->param[0];
-		if ($x[0]->type == 'texte')
-			$boucles[$idb]->group[] = $x[0]->texte;
-		else 	$boucles[$idb]->group[] = '".' . calculer_critere_arg_dynamique($idb, $boucles, $x) . '."';
+		$t = $crit->param[0];
+		if ($t[0]->type == 'texte')
+			$t = $t[0]->texte;
+		else 	$t = '".' . calculer_critere_arg_dynamique($idb, $boucles, $t) . '."';
+		$boucles[$idb]->group[] = $t; 
+		if (!in_array($t, $boucles[$idb]->select))
+		    $boucles[$idb]->select[] = $t;
 	} else 
 		erreur_squelette(_T('zbug_info_erreur_squelette'),
 			"{groupby ?} BOUCLE$idb");
@@ -426,10 +429,20 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
 	      }
 	      }
 	  }
-	  if ($order)
-	    $boucle->order[] = ($fct ? "'$fct(' . $order . ')'" : $order)
-	    	. $collecte
-	      . (($order[0]=="'") ? $sens : "");
+
+	  if ($order) {
+	    if (preg_match("/^'(.*)'$/", $order, $m)) {
+	      $t = $m[1];
+	      if (strpos($t,'.') AND !in_array($t, $boucle->select)) {
+		$boucle->select[] = $t;
+	      }
+	    }
+	  } else $sens ='';
+	  
+	  $boucle->order[] = ($fct ? "'$fct(' . $order . ')'" : $order)
+	    . $collecte
+	    . $sens;
+
 	}
 }
 
diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php
index 5e23cc9fc5..22f5945089 100644
--- a/ecrire/public/debug.php
+++ b/ecrire/public/debug.php
@@ -94,8 +94,10 @@ function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) {
 	$GLOBALS['bouton_admin_debug'] = true;
 
 	if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $erreur, $regs))
+	  {
 		$errno = $regs[2];
-	else if (($errno == 1030 OR $errno <= 1026)
+
+	  } else if (($errno == 1030 OR $errno <= 1026)
 		AND preg_match(',[^[:alnum:]]([0-9]+)[^[:alnum:]],', $erreur, $regs))
 	$errno = $regs[1];
 
@@ -450,7 +452,10 @@ function debug_dumpfile ($texte, $fonc, $type) {
 	    echo "<div id=\"debug_boucle\"><fieldset>";
 	    if ($var_mode_affiche == 'resultat') {
 		echo "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>";
-		echo ancre_texte(traite_query($debug_objets['requete'][$var_mode_objet]));
+		$req = $debug_objets['requete'][$var_mode_objet];
+		if (function_exists('traite_query'))
+		  $req = traite_query($req);
+		echo ancre_texte($req);
 		foreach ($res as $view) 
 			if ($view) echo "\n<br /><fieldset>",interdire_scripts($view),"</fieldset>";
 
-- 
GitLab