Skip to content
Extraits de code Groupes Projets
Valider 66e13f60 rédigé par esj's avatar esj
Parcourir les fichiers

%#209: Une colonne dans la clause '''ORDER''' doit etre mis après le '''SELECT''' en Postgres.

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.
parent 38c663c1
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -84,6 +84,12 @@ function spip_pg_select($select, $from, $where, ...@@ -84,6 +84,12 @@ function spip_pg_select($select, $from, $where,
$count = $limatch[3]; $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) . $q = spip_pg_nocast($select) .
(!$from ? '' : (!$from ? '' :
("\nFROM " . ("\nFROM " .
...@@ -122,8 +128,11 @@ function spip_pg_groupby($groupby, $from, $select) ...@@ -122,8 +128,11 @@ function spip_pg_groupby($groupby, $from, $select)
$join = is_array($from) ? (count($from) > 1) : strpos($from, ","); $join = is_array($from) ? (count($from) > 1) : strpos($from, ",");
if ($join) $join = !is_array($select) ? $select : join(", ", $select); if ($join) $join = !is_array($select) ? $select : join(", ", $select);
if ($join) $groupby = $groupby ? "$groupby, $join" : $join; if ($join) $groupby = $groupby ? "$groupby, $join" : $join;
if (!$groupby) return '';
$groupby = spip_pg_nocast($groupby);
$groupby = preg_replace('/\s+AS\s+\w+/','', $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 // 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) ...@@ -133,8 +142,11 @@ function spip_pg_groupby($groupby, $from, $select)
function spip_pg_nocast($arg) function spip_pg_nocast($arg)
{ {
if (is_array($arg)) $arg = join(", ", $arg); if (is_array($arg)) $arg = join(", ", $arg);
$arg = preg_replace('/\b0[+]([^, ]+)\s*,\s*\1\b/', '\1', $arg); $res = preg_replace('/FIELD[(]([^,]*)[^)]*[)]/','1',$arg);
return preg_replace('/\b0[+]([^, ]+\b)/', '\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='') { ...@@ -233,7 +245,7 @@ function spip_pg_update($table, $exp, $where='') {
// http://doc.spip.org/@spip_pg_error // http://doc.spip.org/@spip_pg_error
function 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 // http://doc.spip.org/@spip_pg_errno
......
...@@ -287,10 +287,13 @@ function critere_logo_dist($idb, &$boucles, $crit) { ...@@ -287,10 +287,13 @@ function critere_logo_dist($idb, &$boucles, $crit) {
// http://doc.spip.org/@critere_fusion_dist // http://doc.spip.org/@critere_fusion_dist
function critere_fusion_dist($idb,&$boucles, $crit) { function critere_fusion_dist($idb,&$boucles, $crit) {
if (isset($crit->param[0])) { if (isset($crit->param[0])) {
$x = $crit->param[0]; $t = $crit->param[0];
if ($x[0]->type == 'texte') if ($t[0]->type == 'texte')
$boucles[$idb]->group[] = $x[0]->texte; $t = $t[0]->texte;
else $boucles[$idb]->group[] = '".' . calculer_critere_arg_dynamique($idb, $boucles, $x) . '."'; 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 } else
erreur_squelette(_T('zbug_info_erreur_squelette'), erreur_squelette(_T('zbug_info_erreur_squelette'),
"{groupby ?} BOUCLE$idb"); "{groupby ?} BOUCLE$idb");
...@@ -426,10 +429,20 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) { ...@@ -426,10 +429,20 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
} }
} }
} }
if ($order)
$boucle->order[] = ($fct ? "'$fct(' . $order . ')'" : $order) if ($order) {
. $collecte if (preg_match("/^'(.*)'$/", $order, $m)) {
. (($order[0]=="'") ? $sens : ""); $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;
} }
} }
......
...@@ -94,8 +94,10 @@ function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) { ...@@ -94,8 +94,10 @@ function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) {
$GLOBALS['bouton_admin_debug'] = true; $GLOBALS['bouton_admin_debug'] = true;
if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $erreur, $regs)) if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $erreur, $regs))
{
$errno = $regs[2]; $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)) AND preg_match(',[^[:alnum:]]([0-9]+)[^[:alnum:]],', $erreur, $regs))
$errno = $regs[1]; $errno = $regs[1];
...@@ -450,7 +452,10 @@ function debug_dumpfile ($texte, $fonc, $type) { ...@@ -450,7 +452,10 @@ function debug_dumpfile ($texte, $fonc, $type) {
echo "<div id=\"debug_boucle\"><fieldset>"; echo "<div id=\"debug_boucle\"><fieldset>";
if ($var_mode_affiche == 'resultat') { if ($var_mode_affiche == 'resultat') {
echo "<legend>",$debug_objets['pretty'][$var_mode_objet],"</legend>"; 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) foreach ($res as $view)
if ($view) echo "\n<br /><fieldset>",interdire_scripts($view),"</fieldset>"; if ($view) echo "\n<br /><fieldset>",interdire_scripts($view),"</fieldset>";
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter