From 032cf588c25a436aa7da8f05fa3bc3b3c0a322d5 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sat, 6 Oct 2007 09:21:12 +0000
Subject: [PATCH] =?UTF-8?q?Tiens,=20il=20y=20a=20encore=20des=20spip=5Fque?=
 =?UTF-8?q?ry=20sur=20INSERT.=20Deux=20de=20moins.=20Et=20un=20UPDATE=20de?=
 =?UTF-8?q?=20moins.=20Et=20am=C3=A9liorations=20du=20traducteur=20MySQL->?=
 =?UTF-8?q?PG,=20qui=20traite=20les=20fonctions=20SQL=20plus=20intelligeme?=
 =?UTF-8?q?nt.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/action/cookie.php        |  2 +-
 ecrire/action/editer_auteur.php |  4 ++--
 ecrire/action/editer_mot.php    |  2 +-
 ecrire/base/db_pg.php           | 12 ++++++++----
 4 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php
index 8d81f5296f..52072be7a0 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 abadbf9cbd..ee248ad588 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 1b359cc2ca..2da3649978 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 0893681910..30902ac325 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);
 
-- 
GitLab