From 66e13f604ff9245611d7edf4a870323db47f6eb4 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Sun, 5 Aug 2007 20:29:28 +0000 Subject: [PATCH] =?UTF-8?q?%#209:=20Une=20colonne=20dans=20la=20clause=20'?= =?UTF-8?q?''ORDER'''=20doit=20etre=20mis=20apr=C3=A8s=20le=20'''SELECT'''?= =?UTF-8?q?=20en=20Postgres.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neutralisation de la construction MySQL spécifique '''FIELD''' (avec '''HAVING''') pour permettre au squelette standard ''article'' de s'afficher sans erreur Postgres mais c'est insatisfaisant évidemment. Modifs pour que le débusqueur puisse s'appliquer en cas d'erreur Postgres, mais là aussi c'est encore très bricolé tant il n'était pas prévu qu'il puisse s'appliquer à autre chose que MySQL. --- ecrire/base/db_pg.php | 20 ++++++++++++++++---- ecrire/public/criteres.php | 29 +++++++++++++++++++++-------- ecrire/public/debug.php | 9 +++++++-- 3 files changed, 44 insertions(+), 14 deletions(-) diff --git a/ecrire/base/db_pg.php b/ecrire/base/db_pg.php index aa4acf2916..294b30e9c4 100644 --- a/ecrire/base/db_pg.php +++ b/ecrire/base/db_pg.php @@ -84,6 +84,12 @@ function spip_pg_select($select, $from, $where, $count = $limatch[3]; } + if ($having) { + if (is_array($having)) + $having = join("\n\tAND ", array_map('calculer_pg_where', $having)); + spip_log("SPIP-PG ne sait pas traduire HAVING $having"); # a revoir + $having =''; + } $q = spip_pg_nocast($select) . (!$from ? '' : ("\nFROM " . @@ -122,8 +128,11 @@ function spip_pg_groupby($groupby, $from, $select) $join = is_array($from) ? (count($from) > 1) : strpos($from, ","); if ($join) $join = !is_array($select) ? $select : join(", ", $select); if ($join) $groupby = $groupby ? "$groupby, $join" : $join; + if (!$groupby) return ''; + $groupby = spip_pg_nocast($groupby); $groupby = preg_replace('/\s+AS\s+\w+/','', $groupby); - return (!$groupby ? '' : ("\nGROUP BY " . spip_pg_nocast($groupby))); + $groupby = trim(preg_replace('/SUM\(\w+\)\s*,/','', $groupby)); + return "\nGROUP BY $groupby"; } // 0+x avec un champ x commencant par des chiffres est converti par MySQL @@ -133,8 +142,11 @@ function spip_pg_groupby($groupby, $from, $select) function spip_pg_nocast($arg) { if (is_array($arg)) $arg = join(", ", $arg); - $arg = preg_replace('/\b0[+]([^, ]+)\s*,\s*\1\b/', '\1', $arg); - return preg_replace('/\b0[+]([^, ]+\b)/', '\1', $arg); + $res = preg_replace('/FIELD[(]([^,]*)[^)]*[)]/','1',$arg); + $res = preg_replace('/\b0[+]([^, ]+)\s*,\s*\1\b/', '\1', $res); + if ($res != $arg) + spip_log("SPIP-PG ne sait pas traduire $arg"); # a revoir + return preg_replace('/\b0[+]([^, ]+\b)/', '\1', $res); } @@ -233,7 +245,7 @@ function spip_pg_update($table, $exp, $where='') { // http://doc.spip.org/@spip_pg_error function spip_pg_error() { - return pg_last_error(); + return str_replace('ERROR', 'errcode: 1000 ', pg_last_error()); } // http://doc.spip.org/@spip_pg_errno diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index 4c12efc3e0..23f2324793 100644 --- a/ecrire/public/criteres.php +++ b/ecrire/public/criteres.php @@ -287,10 +287,13 @@ function critere_logo_dist($idb, &$boucles, $crit) { // http://doc.spip.org/@critere_fusion_dist function critere_fusion_dist($idb,&$boucles, $crit) { if (isset($crit->param[0])) { - $x = $crit->param[0]; - if ($x[0]->type == 'texte') - $boucles[$idb]->group[] = $x[0]->texte; - else $boucles[$idb]->group[] = '".' . calculer_critere_arg_dynamique($idb, $boucles, $x) . '."'; + $t = $crit->param[0]; + if ($t[0]->type == 'texte') + $t = $t[0]->texte; + else $t = '".' . calculer_critere_arg_dynamique($idb, $boucles, $t) . '."'; + $boucles[$idb]->group[] = $t; + if (!in_array($t, $boucles[$idb]->select)) + $boucles[$idb]->select[] = $t; } else erreur_squelette(_T('zbug_info_erreur_squelette'), "{groupby ?} BOUCLE$idb"); @@ -426,10 +429,20 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) { } } } - if ($order) - $boucle->order[] = ($fct ? "'$fct(' . $order . ')'" : $order) - . $collecte - . (($order[0]=="'") ? $sens : ""); + + if ($order) { + if (preg_match("/^'(.*)'$/", $order, $m)) { + $t = $m[1]; + if (strpos($t,'.') AND !in_array($t, $boucle->select)) { + $boucle->select[] = $t; + } + } + } else $sens =''; + + $boucle->order[] = ($fct ? "'$fct(' . $order . ')'" : $order) + . $collecte + . $sens; + } } diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php index 5e23cc9fc5..22f5945089 100644 --- a/ecrire/public/debug.php +++ b/ecrire/public/debug.php @@ -94,8 +94,10 @@ function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) { $GLOBALS['bouton_admin_debug'] = true; if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $erreur, $regs)) + { $errno = $regs[2]; - else if (($errno == 1030 OR $errno <= 1026) + + } else if (($errno == 1030 OR $errno <= 1026) AND preg_match(',[^[:alnum:]]([0-9]+)[^[:alnum:]],', $erreur, $regs)) $errno = $regs[1]; @@ -450,7 +452,10 @@ function debug_dumpfile ($texte, $fonc, $type) { echo "<div id=\"debug_boucle\"><fieldset>"; if ($var_mode_affiche == 'resultat') { echo "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>"; - echo ancre_texte(traite_query($debug_objets['requete'][$var_mode_objet])); + $req = $debug_objets['requete'][$var_mode_objet]; + if (function_exists('traite_query')) + $req = traite_query($req); + echo ancre_texte($req); foreach ($res as $view) if ($view) echo "\n<br /><fieldset>",interdire_scripts($view),"</fieldset>"; -- GitLab