From a7a276708e95d66c9243ac62f82c4a1dd671cf2e Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Wed, 1 Mar 2006 13:33:14 +0000
Subject: [PATCH] =?UTF-8?q?En=20parlant=20de=20fonction=20SQL,=20plutot=20?=
 =?UTF-8?q?que=20de=20produire=20une=20requete=20incorrecte,=20=20on=20rep?=
 =?UTF-8?q?=C3=A8re=20maintenant=20des=20fonctions=20a=20plusieurs=20argum?=
 =?UTF-8?q?ents,=20ce=20qui=20permet=20en=20particulier=20un=20critere=20c?=
 =?UTF-8?q?omparant=20des=20titres=20commen=C3=A7ant=20par=20des=20numeros?=
 =?UTF-8?q?:=20{CONV(titre,10,10)=3D(#TITRE|intval)}?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/public/criteres.php     | 20 +++++++++++---------
 ecrire/public/phraser-html.php |  3 ++-
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 94017f2b54..ac479fe480 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -459,7 +459,7 @@ function calculer_criteres ($idb, &$boucles) {
 
 function calculer_critere_DEFAUT($idb, &$boucles, $crit)
 {
-	list($fct, $col, $op, $val, $table) =
+	list($fct, $col, $op, $val, $table, $args_sql) =
 	  calculer_critere_infixe($idb, $boucles, $crit);
 
 	// ajout pour le cas special d'une condition sur le champ statut:
@@ -485,7 +485,7 @@ function calculer_critere_DEFAUT($idb, &$boucles, $crit)
 	} else $ct = $col;
 
 	// inserer la fonction SQL
-	if ($fct) $ct = "$fct($ct)";
+	if ($fct) $ct = "$fct($ct$args_sql)";
 
 	// inserer la negation (cf !...)
 	if (strtoupper($op) == 'IN') {
@@ -524,7 +524,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 	$type = $boucle->type_requete;
 	$col_table = $boucle->id_table;
 
-	list($fct, $col, $op, $val) =
+	list($fct, $col, $op, $val, $args_sql) =
 	  calculer_critere_infixe_ops($idb, $boucles, $crit);
 
 	// Cas particulier : id_enfant => utiliser la colonne id_objet
@@ -565,7 +565,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 	  } // else: champ dans la table, c'est ok.
 	}
 
-	return array($fct, $col, $op, $val, $col_table);
+	return array($fct, $col, $op, $val, $col_table, $args_sql);
 }
 
 // deduction automatique des jointures 
@@ -740,14 +740,16 @@ function calculer_critere_infixe_ops($idb, &$boucles, $crit)
 	    }
 	}
 
-	$fct = '';
+	$fct = $args = '';
 	// fonction SQL ?
-	if (ereg("([A-Za-z_]+)\(([^)]+)\)", $col,$match3)) {
-	  $col = $match3[2];
-	  $fct = $match3[1];
+	if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) {
+	  $fct = $m[1];
+	  preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a);
+	  $col = $a[1];
+	  $args_sql = $a[2];
 	}
 
-	return array($fct, $col, $op, $val);
+	return array($fct, $col, $op, $val, $args_sql);
 }
 
 // compatibilite ancienne version
diff --git a/ecrire/public/phraser-html.php b/ecrire/public/phraser-html.php
index 58d9f1cdde..a485ea2dcc 100644
--- a/ecrire/public/phraser-html.php
+++ b/ecrire/public/phraser-html.php
@@ -33,7 +33,8 @@ define('CHAMP_ETENDU', '\[([^]\[]*)\(' . NOM_DE_CHAMP . '([^[)]*\)[^]\[]*)\]');
 
 define('BALISE_INCLURE','<INCLU[DR]E[[:space:]]*(\(([^)]*)\))?');
 
-define('CHAMP_SQL_PLUS_FONC', '`?([A-Za-z_][A-Za-z_0-9]*)\(?([A-Za-z_.]*)\)?`?');
+define('SQL_ARGS', '(\([^)]*\))');
+define('CHAMP_SQL_PLUS_FONC', '`?([A-Za-z_][A-Za-z_0-9]*)' . SQL_ARGS . '?`?');
 
 function phraser_inclure($texte, $ligne, $result) {
 
-- 
GitLab