diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php
index 8d81f5296f8120687fafa9cd6e4d3aa88d1858d3..52072be7a0567a29cc2cee84736d6162ab307765 100644
--- a/ecrire/action/cookie.php
+++ b/ecrire/action/cookie.php
@@ -100,7 +100,7 @@ function action_cookie_dist() {
 			$prefs = ($row_auteur['prefs']) ? unserialize($row_auteur['prefs']) : array();
 			$prefs['cnx'] = $session_remember;
 	
-			spip_query("UPDATE spip_auteurs SET prefs = " . _q(serialize($prefs)) . " WHERE id_auteur = " . $row_auteur['id_auteur']);
+			sql_updateq('spip_auteurs', array('prefs' => serialize($prefs)), "id_auteur = " . $row_auteur['id_auteur']);
 		}
 	}
 
diff --git a/ecrire/action/editer_auteur.php b/ecrire/action/editer_auteur.php
index abadbf9cbd449b2c21f3cc3cd3e585ea6e958400..ee248ad588a911e62a2bc01c3dc17946b8c123d5 100644
--- a/ecrire/action/editer_auteur.php
+++ b/ecrire/action/editer_auteur.php
@@ -202,13 +202,13 @@ function action_legender_auteur_post($r) {
 		sql_delete("spip_auteurs_rubriques", "id_auteur="._q($id_auteur));
 		foreach (array_unique($restreintes) as $id_rub)
 			if ($id_rub = intval($id_rub)) // si '0' on ignore
-				sql_insert('spip_auteurs_rubriques', "(id_auteur,id_rubrique)", "($id_auteur,$id_rub)");
+				sql_insertq('spip_auteurs_rubriques', array('id_auteur' => $id_auteur, 'id_rubrique'=>$id_rub));
 	}
 
 	// Lier a un article
 	if ($id_article = intval(_request('lier_id_article'))
 	AND autoriser('modifier', 'article', $id_article)) {
-		spip_query("INSERT spip_auteurs_articles (id_article,id_auteur) VALUES ($id_article,$id_auteur)");
+		sql_insertq('spip_auteurs_articles', array('id_article' => $id_article, 'id_auteur' =>$id_auteur));
 	}
 
 	// Notifications, gestion des revisions, reindexation...
diff --git a/ecrire/action/editer_mot.php b/ecrire/action/editer_mot.php
index 1b359cc2cac562ed0f15e229dae4e2fd2595be6b..2da3649978e74a3743d5af376f2df03214bd31fa 100644
--- a/ecrire/action/editer_mot.php
+++ b/ecrire/action/editer_mot.php
@@ -49,7 +49,7 @@ function action_editer_mot_post($r)
 		// inserer_mot("spip_mots_$table", $table_id, $id_objet, $nouv_mot);
 		$result = sql_countsel("spip_mots_$table", "id_mot=".intval($nouv_mot)." AND $table_id=$id_objet");
 		if (!$result)
-			spip_query("INSERT INTO spip_mots_$table (id_mot,$table_id) VALUES ("._q($nouv_mot).", $id_objet)");
+			sql_insertq("spip_mots_$table", array('id_mot' => $nouv_mot, $table_id =>$id_objet));
 	}
 
 	// Notifications, gestion des revisions, reindexation...
diff --git a/ecrire/base/db_pg.php b/ecrire/base/db_pg.php
index 0893681910f582f4db39add707b500558b3ff20b..30902ac325fa19eb8d765f9c15f544906fbb7770 100644
--- a/ecrire/base/db_pg.php
+++ b/ecrire/base/db_pg.php
@@ -238,14 +238,18 @@ function spip_pg_groupby($groupby, $from, $select)
 	if ($join OR $groupby) $join = !is_array($select) ? $select : join(", ", $select);
 	if ($join) {
 	  $join = str_replace('DISTINCT ','',$join);
-	  $join = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)(\s+AS\s+\w+)\s*,?/i','', $join);
-	  $join = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)(\s+AS\s+\w+)\s*,?/i','\\1', $join);
-	  $join = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)\s*,?/i','', $join);
+	  // fct SQL sur colonne et constante apostrophee ==> la colonne
+	  $join = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/','\\1', $join);
+	  // resultat d'agregat ne sont pas a mettre dans le groupby
+	  $join = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER|CAST)\([^)]+\)(\s*AS\s+\w+)\s*,?/i','', $join);
+	  // idem sans AS (fetch numerique)
+	  $join = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER|CAST)\([^)]+\)\s*,?/i','', $join);
+	  // ne reste plus que les vrais colonnes, et parfois 1 virgule
 	  if (preg_match('/^(.*),\s*$/',$join,$m)) $join=$m[1];
-#	  if (preg_match('/^(.*)\b[*]\b(.*)$/',$join,$m)) $join=$m[1].$m[2];
 	}
 	if ($join) $groupby = $groupby ? "$groupby, $join" : $join;
 	if (!$groupby) return '';
+
 	$groupby = spip_pg_frommysql($groupby);
 	$groupby = preg_replace('/\s+AS\s+\w+\s*/','', $groupby);