diff --git a/ecrire/base/db_pg.php b/ecrire/base/db_pg.php index aa4acf29166d491912e750589bbb0ec13a822e16..294b30e9c498c9e27a32472619d8a2033de01d2d 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 4c12efc3e0afa265f22496dbe318a940094ebf60..23f2324793bff31215cc6fa07868bd4deb1d055d 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 5e23cc9fc50401170cb194c809d652fbf9060cbc..22f5945089b9b03ad851e8dd86b38e2839bc58aa 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>";