diff --git a/ecrire/base/db_pg.php b/ecrire/base/db_pg.php
index aa4acf29166d491912e750589bbb0ec13a822e16..294b30e9c498c9e27a32472619d8a2033de01d2d 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 4c12efc3e0afa265f22496dbe318a940094ebf60..23f2324793bff31215cc6fa07868bd4deb1d055d 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 5e23cc9fc50401170cb194c809d652fbf9060cbc..22f5945089b9b03ad851e8dd86b38e2839bc58aa 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>";