diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 9dceb2af2810d281d187593d3e06b9125f8a03db..038a9f492201068b678077a10d026176a4c1ae0b 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -280,7 +280,7 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) {
 	// Fin de parties
 	if ($boucle->mode_partie) $corps .= "\n		}\n";
 
-	$sql_args = '$allrows';
+	$sql_args = '$result, ' . _q($boucle->sql_serveur);
 
 	// si le corps est une constante, ne pas appeler le serveur N fois!
 	if (preg_match(CODE_MONOTONE,str_replace("\\'",'',$corps), $r)) {
@@ -300,7 +300,7 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) {
 	$SP++;
 
 	// RESULTATS
-	while ($Pile[$SP] = array_shift(' .
+	while ($Pile[$SP] = @sql_fetch(' .
 		  $sql_args .
 		  ")) {\n$corps\n	}\n" .
 		  $fin ;
@@ -316,10 +316,10 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) {
 
 	if ($boucle->numrows OR $boucle->mode_partie) {
 		if ($count == 'count(*)')
-			$count = "array_shift($sql_args)";
-		else $count = "count($sql_args)";
+			$count = "array_shift(sql_fetch($sql_args))";
+		else $count = "sql_count($sql_args)";
 		$count = !$boucle->mode_partie
-		  ? "\n\t\$Numrows['$id_boucle']['total'] = intval($count);"
+		  ? "\n\t\$Numrows['$id_boucle']['total'] = @intval($count);"
 		  : calculer_parties($boucles, $id_boucle, $count);
 	} else $count = '';
 	
@@ -328,7 +328,8 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) {
 			"\n\t\$Numrows['$id_boucle']['compteur_boucle'] = 0;")
 		. '
 	$t0 = "";' .
-		$corps;
+		$corps .
+		"\n\t@sql_free($sql_args);";
 }
 
 
@@ -354,9 +355,7 @@ function calculer_requete_sql(&$boucle)
 				    $boucle->limit))
 	  . calculer_dec('$having', calculer_dump_array($boucle->having))
 	  . "\n\t// REQUETE\n\t"
-	  . '$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);'
-		. "\n\t"
-		. '$allrows = @sql_fetch_all($result,$connect);';
+	  . '$result = calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect);';
 }
 
 // http://doc.spip.org/@calculer_dec
@@ -452,7 +451,7 @@ function calculer_parties($boucles, $id_boucle, $count) {
 	// n-1 pour le dernier ; donc total_boucle = 1 + debut - fin
 
 	// nombre total avant partition
-	$retour = "\n\n	// PARTITION\n\t" . '$nombre_boucle = ' . $count .';';
+	$retour = "\n\n	// PARTITION\n\t" . '$nombre_boucle = @' . $count .';';
 
 	preg_match(",([+-/p])([+-/])?,", $mode_partie, $regs);
 	list(,$op1,$op2) = $regs;
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index ed49e9316def64a2b2f6ebeee1f213b1f2041b0d..4b6d931224edc2e11fae220d0999a6eed9567610 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -152,7 +152,7 @@ function critere_pagination_dist($idb, &$boucles, $crit) {
 		// dans ce cas, on retrouve la page par un appel a quete_debut_pagination,
 		// et on place dans Pile[0]['debut_xxx'] le vrai numero de page pour la balise #PAGINATION
 		// et dans Pile[0][@primary] = yyy pour permettre a la balise #EXPOSER d'exposer l'objet
-		.'($Pile[0][\'debut\'.'.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($partie,1),'.intval($pas).',$allrows))'
+		.'($Pile[0][\'debut\'.'.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($partie,1),'.intval($pas).',calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect)))'
 		// sinon on fait un intval sur la valeur demandee, et c'est tout
 		.':intval($partie)';
 
diff --git a/ecrire/public/quete.php b/ecrire/public/quete.php
index 3a05ed2e0f4460ee86f714a88f9ae02233a73524..ff71030e289180c401abbb8e3a6fdf0851043dea 100644
--- a/ecrire/public/quete.php
+++ b/ecrire/public/quete.php
@@ -241,13 +241,11 @@ function calcul_exposer ($id, $prim, $reference, $parent, $type, $connect='') {
 	return isset($exposer[$m][$prim]) ? isset($exposer[$m][$prim][$id]) : '';
 }
 
-function quete_debut_pagination($primary,$valeur,$pas,$rows){
+function quete_debut_pagination($primary,$valeur,$pas,$res){
 	$pos = 0;
-	foreach($rows as $row){
-		if ($row[$primary]==$valeur)
-			break;
+	while ($row = sql_fetch($res) AND $row[$primary]!==$valeur)
 		$pos++;
-	}
+	sql_free($res);
 	// si on a pas trouve
 	if ($row[$primary]!==$valeur)
 		return 0;