diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index 612180840e92c9a91263027c4860892cb5552939..6e00568aa1668c9465f94b50197ebb7c9f2a322e 100644 --- a/ecrire/public/criteres.php +++ b/ecrire/public/criteres.php @@ -712,6 +712,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { $type = $boucle->type_requete; $table = $boucle->id_table; $desc = $boucle->show; + $date = array(); list($fct, $col, $op, $val, $args_sql) = calculer_critere_infixe_ops($idb, $boucles, $crit); @@ -736,9 +737,9 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { } // Cas particulier : expressions de date - else if ($regs = tester_param_date($boucle->type_requete, $col)) { + else if ($date = tester_param_date($boucle->type_requete, $col)) { list($col, $table) = - calculer_critere_infixe_date($idb, $boucles, $regs); + calculer_critere_infixe_date($idb, $boucles, $date); } else { if (@!array_key_exists($col, $desc['field'])) { $calculer_critere_externe = 'calculer_critere_externe_init'; @@ -756,12 +757,17 @@ function calculer_critere_infixe($idb, &$boucles, $crit) { list($nom, $desc) = trouver_champ_exterieur($col, $boucle->jointures, $boucle); } } - // Si la colonne SQL est numerique + // Si la colonne SQL est numerique ou le critere est une date relative // forcer une conversion pour eviter un erreur au niveau SQL + if ($op == '=' OR in_array($op, $table_criteres_infixes)) { - if (strpos($val[0], 'sql_quote(') === 0 - AND $desc AND sql_test_int($desc['field'][$col])) - $val[0] = 'intval' . substr($val[0],strlen('sql_quote')); + if (($desc AND sql_test_int($desc['field'][$col])) + OR ($date AND strpos($date[0], '_relatif'))) { + if (strpos($val[0], 'sql_quote(') === 0) + $val[0] = 'intval' . substr($val[0],strlen('sql_quote')); + elseif (preg_match("/^\"'(-?\d+)'\"$/", $val[0], $r)) + $val[0] = $r[1]; + } } // tag du critere pour permettre aux boucles de modifier leurs requetes par defaut en fonction de ca $boucles[$idb]->modificateur['criteres'][$col] = true; diff --git a/ecrire/req/pg.php b/ecrire/req/pg.php index c5da0bb3ea5c70201b208f6c1228d3d0a9a1ac2d..760877c431ffb69eb0b4a9639d72f614f5bf7e43 100644 --- a/ecrire/req/pg.php +++ b/ecrire/req/pg.php @@ -413,7 +413,8 @@ function spip_pg_frommysql($arg) $res = preg_replace('/(timestamp .\d+)-00-/','\1-01-', $res); $res = preg_replace('/(timestamp .\d+-\d+)-00/','\1-01',$res); - $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)(timestamp *'[^']*' *[+-] *timestamp *'[^']*') *[)]/", '\2', $res); +# correct en theorie mais produit des debordements arithmetiques +# $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)(timestamp *'[^']*' *[+-] *timestamp *'[^']*') *[)]/", '\2', $res); $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)('[^']*')/", '\1 timestamp \2', $res); return str_replace('REGEXP', '~', $res);