diff --git a/ecrire/base/abstract_sql.php b/ecrire/base/abstract_sql.php
index 07503537723663929e950a9bdf7c1c9a33018e2f..b029b1e7eea66a0eb6224ae64ce5d25c5ecab95f 100644
--- a/ecrire/base/abstract_sql.php
+++ b/ecrire/base/abstract_sql.php
@@ -142,6 +142,12 @@ function sql_insertq($table, $couples=array(), $desc=array(), $serveur='',$reque
 	return $f($table, $couples, $desc, $serveur, $requeter);
 }
 
+function sql_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true)
+{
+	$f = sql_serveur('insertq_multi', $serveur);
+	return $f($table, $tab_couples, $desc, $serveur, $requeter);
+}
+
 // http://doc.spip.org/@sql_update
 function sql_update($table, $exp, $where='', $desc=array(), $serveur='',$requeter=true)
 {
@@ -167,10 +173,17 @@ function sql_delete($table, $where='', $serveur='',$requeter=true)
 }
 
 // http://doc.spip.org/@sql_replace
-function sql_replace($table, $values, $desc=array(), $serveur='',$requeter=true)
+function sql_replace($table, $couples, $desc=array(), $serveur='',$requeter=true)
 {
 	$f = sql_serveur('replace', $serveur);
-	return $f($table, $values, $desc, $serveur, $requeter);
+	return $f($table, $couples, $desc, $serveur, $requeter);
+}
+
+
+function sql_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true)
+{
+	$f = sql_serveur('replace_multi', $serveur);
+	return $f($table, $tab_couples, $desc, $serveur, $requeter);
 }
 
 // http://doc.spip.org/@sql_drop_table
diff --git a/ecrire/inc/prepare_recherche.php b/ecrire/inc/prepare_recherche.php
index ce8d275f1c69e5fa657e8357eaa561d01b9f9821..ab6f18a38380bb661efd587a3c87302144501347 100644
--- a/ecrire/inc/prepare_recherche.php
+++ b/ecrire/inc/prepare_recherche.php
@@ -76,15 +76,21 @@ function inc_prepare_recherche_dist($recherche, $table='articles', $cond=false,
 
 		// inserer les resultats dans la table de cache des recherches
 		if (count($points)){
-			$values = "";
+			$tab_couples = array();
 			foreach ($points as $id => $p){
-				$values.= ",('$hash',".intval($id).",".intval($p['score']).")";
-				if (strlen($values)>16000) { // eviter les debordements de pile sur tres gros resultats
-					sql_insert('spip_recherches',"(recherche,id,points)",substr($values,1),array(),$serveur);
-					$values = "";
+				$tab_couples[] = array(
+					'recherche' => "$hash",
+					'id' => $id,
+					'points' => $p['score']
+				);
+				//$values.= ",('$hash',".intval($id).",".intval($p['score']).")";
+				if (count($tab_couples)>100) { // eviter les debordements de pile sur tres gros resultats
+					sql_insertq_multi('spip_recherches',$tab_couples,array(),$serveur);
+					$tab_couples = array();
 				}
 			}
-			sql_insert('spip_recherches',"(recherche,id,points)",substr($values,1),array(),$serveur);
+			sql_insertq_multi('spip_recherches',$tab_couples,array(),$serveur);
+			//sql_insert('spip_recherches',"(recherche,id,points)",substr($values,1),array(),$serveur);
 		}
 	}
 
diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php
index 2e7c40d48baa0237b26a92ecf1445d96b3063c94..2dac8505db88401059b0196a346e153495516c19 100644
--- a/ecrire/req/mysql.php
+++ b/ecrire/req/mysql.php
@@ -56,12 +56,14 @@ $GLOBALS['spip_mysql_functions_1'] = array(
 		'in' => 'spip_mysql_in', 
 		'insert' => 'spip_mysql_insert',
 		'insertq' => 'spip_mysql_insertq',
+		'insertq_multi' => 'spip_mysql_insertq_multi',
 		'listdbs' => 'spip_mysql_listdbs',
 		'multi' => 'spip_mysql_multi',
 		'optimize' => 'spip_mysql_optimize',
 		'query' => 'spip_mysql_query',
 		'quote' => 'spip_mysql_quote',
 		'replace' => 'spip_mysql_replace',
+		'replace_multi' => 'spip_mysql_replace_multi',
 		'repair' => 'spip_mysql_repair',
 		'select' => 'spip_mysql_select',
 		'selectdb' => 'spip_mysql_selectdb',
@@ -494,7 +496,27 @@ function spip_mysql_insertq($table, $couples=array(), $desc=array(), $serveur=''
 		$couples[$champ]= spip_mysql_cite($val, $fields[$champ]);
 	}
 
-	return spip_mysql_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur);
+	return spip_mysql_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur, $requeter);
+}
+
+
+function spip_mysql_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true) {
+
+	if (!$desc) $desc = description_table($table);
+	if (!$desc) die("$table insertion sans description");
+	$fields =  isset($desc['field'])?$desc['field']:array();
+	
+	$cles = "(" . join(',',array_keys($tab_couples[0])) . ')';
+	$valeurs = array();
+	foreach ($tab_couples as $couples) {
+		foreach ($couples as $champ => $val){
+			$couples[$champ]= spip_mysql_cite($val, $fields[$champ]);
+		}
+		$valeurs[] = '(' .join(',', $couples) . ')';
+	}
+	$valeurs = implode(', ',$valeurs);
+
+	return	spip_mysql_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
 }
 
 // http://doc.spip.org/@spip_mysql_update
@@ -539,10 +561,22 @@ function spip_mysql_delete($table, $where='', $serveur='',$requeter=true) {
 }
 
 // http://doc.spip.org/@spip_mysql_replace
-function spip_mysql_replace($table, $values, $keys=array(), $serveur='',$requeter=true) {
-	return spip_mysql_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')', $serveur, $requeter);
+function spip_mysql_replace($table, $couples, $desc=array(), $serveur='',$requeter=true) {
+	return spip_mysql_query("REPLACE $table (" . join(',',array_keys($couples)) . ') VALUES (' .join(',',array_map('_q', $couples)) . ')', $serveur, $requeter);
+}
+
+
+function spip_mysql_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true) {
+	$cles = "(" . join(',',array_keys($tab_couples[0])). ')';
+	$valeurs = array();
+	foreach ($tab_couples as $couples) {
+		$valeurs[] = '(' .join(',',array_map('_q', $couples)) . ')';
+	}
+	$valeurs = implode(', ',$valeurs);
+	return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter);
 }
 
+
 // http://doc.spip.org/@spip_mysql_multi
 function spip_mysql_multi ($objet, $lang) {
 	$retour = "(TRIM(IF(INSTR(".$objet.", '<multi>') = 0 , ".
diff --git a/ecrire/req/pg.php b/ecrire/req/pg.php
index 4ee653c24c6999ff91dc7b1e3a2e3b52ae7e43b7..d3b69bbf4e629891336a98e9f77bee3ee82bbb9d 100644
--- a/ecrire/req/pg.php
+++ b/ecrire/req/pg.php
@@ -82,11 +82,13 @@ $GLOBALS['spip_pg_functions_1'] = array(
 		'in' => 'spip_pg_in',
 		'insert' => 'spip_pg_insert',
 		'insertq' => 'spip_pg_insertq',
+		'insertq_multi' => 'spip_pg_insertq_multi',
 		'listdbs' => 'spip_pg_listdbs',
 		'multi' => 'spip_pg_multi',
 		'query' => 'spip_pg_query',
 		'quote' => 'spip_pg_quote',
 		'replace' => 'spip_pg_replace',
+		'replace_multi' => 'spip_pg_replace_multi',
 		'select' => 'spip_pg_select',
 		'selectdb' => 'spip_pg_selectdb',
 		'set_connect_charset' => 'spip_pg_set_connect_charset',
@@ -610,6 +612,28 @@ function spip_pg_insertq($table, $couples=array(), $desc=array(), $serveur='',$r
 	return spip_pg_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur, $requeter);
 }
 
+
+
+function spip_pg_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true) {
+
+	if (!$desc) $desc = description_table($table);
+	if (!$desc) die("$table insertion sans description");
+	$fields =  isset($desc['field'])?$desc['field']:array();
+	
+	$cles = "(" . join(',',array_keys($tab_couples[0])). ')';
+	$valeurs = array();
+	foreach ($tab_couples as $couples) {
+		foreach ($couples as $champ => $val){
+			$couples[$champ]= spip_pg_cite($val, $fields[$champ]);
+		}
+		$valeurs[] = '(' .join(',', $couples) . ')';
+	}
+	$valeurs = implode(', ',$valeurs);
+	
+	return	spip_pg_insert($table, $cles, $valeurs, $desc, $serveur, $requeter);
+}
+
+
 // http://doc.spip.org/@spip_pg_update
 function spip_pg_update($table, $champs, $where='', $desc='', $serveur='',$requeter=true) {
 
@@ -715,6 +739,18 @@ function spip_pg_replace($table, $values, $desc, $serveur='',$requeter=true) {
 	return $couples;
 }
 
+
+function spip_pg_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true) {
+	// boucler pour traiter chaque requete independemment
+	foreach ($tab_couples as $couples){
+		$retour = spip_pg_replace($table, $couples, $desc, $serveur,$requeter);
+	}
+	// renvoie le dernier id 
+	return $retour; 
+}
+
+
+
 // Donne la sequence eventuelle associee a une table 
 // Pas extensible pour le moment,
 
diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php
index ee214b0dde13bc545eafc4e1a5e4ac8f43644f2a..19e25e88c8c1231dff8a6428255413fbca3a4279 100644
--- a/ecrire/req/sqlite_generique.php
+++ b/ecrire/req/sqlite_generique.php
@@ -509,6 +509,17 @@ function spip_sqlite_insertq($table, $couples=array(), $desc=array(), $serveur='
 }
 
 
+
+function spip_sqlite_insertq_multi($table, $tab_couples=array(), $desc=array(), $serveur='',$requeter=true) {
+	foreach ($tab_couples as $couples) {
+		$retour = spip_sqlite_insertq($table, $couples, $desc, $serveur, $requeter);
+	}
+	// renvoie le dernier id d'autoincrement ajoute
+	return $retour;
+}
+
+
+
 function spip_sqlite_listdbs($serveur='',$requeter=true) {
 	_sqlite_init();
 	
@@ -571,13 +582,25 @@ function spip_sqlite_repair($table, $serveur='',$requeter=true){
 }
 
 
-function spip_sqlite_replace($table, $values, $keys=array(), $serveur='',$requeter=true) {
+function spip_sqlite_replace($table, $couples, $desc=array(), $serveur='',$requeter=true) {
 	
 	// recherche de champs 'timestamp' pour mise a jour auto de ceux-ci
-	$values = array_map('spip_sqlite_quote', $values);
-	$values = _sqlite_ajouter_champs_timestamp($table, $values, '', $serveur);
+	$values = array_map('spip_sqlite_quote', $couples);
+	$values = _sqlite_ajouter_champs_timestamp($table, $couples, '', $serveur);
 	
-	return spip_sqlite_query("REPLACE INTO $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',$values) . ')', $serveur);
+	return spip_sqlite_query("REPLACE INTO $table (" . join(',',array_keys($couples)) . ') VALUES (' .join(',',$couples) . ')', $serveur);
+}
+
+
+
+function spip_sqlite_replace_multi($table, $tab_couples, $desc=array(), $serveur='',$requeter=true) {
+	
+	// boucler pour trainter chaque requete independemment
+	foreach ($tab_couples as $couples){
+		$retour = spip_sqlite_replace($table, $couples, $desc, $serveur,$requeter);
+	}
+	// renvoie le dernier id	
+	return $retour; 
 }
 
 
@@ -1068,12 +1091,14 @@ function _sqlite_ref_fonctions(){
 		'in' => 'spip_sqlite_in', 
 		'insert' => 'spip_sqlite_insert',
 		'insertq' => 'spip_sqlite_insertq',
+		'insertq_multi' => 'spip_sqlite_insertq_multi',
 		'listdbs' => 'spip_sqlite_listdbs',
 		'multi' => 'spip_sqlite_multi',
 		'optimize' => 'spip_sqlite_optimize',
 		'query' => 'spip_sqlite_query',
 		'quote' => 'spip_sqlite_quote',
 		'replace' => 'spip_sqlite_replace',
+		'replace_multi' => 'spip_sqlite_replace_multi',
 		'repair' => 'spip_sqlite_repair',
 		'select' => 'spip_sqlite_select',
 		'selectdb' => 'spip_sqlite_selectdb',