"Committo,Ergo:sum" <esj@rezo.net> writes:
En fait, ce n'était pas tout à fait vrai quand j'ai dit que ABSTIME
n'existait pas sur mon postgreSQL. Le message exact est : "function
abstime(double precision, unknown) does not exist" et il existe en
fait une fonction abstime, avec des arguments différents. Par contre,
elle ne fait pas grand chose d'intéressant : L'ancienne doc est ici :
PostgreSQL: Documentation: 7.0: Date/Time Functions
et la nouvelle dit simplement :
PostgreSQL: Documentation: 8.3: Date/Time Key Words
"The key word ABSTIME is ignored for historical reasons:
Attention ce sont deux choses différentes: un mot-clé et une
fonction, ça n'a rien à voir.
Effectivement, par contre, je ne trouve aucune trace de documentation
de la fonction abstime dans la doc de PostgreSQL 8.
Je pense avoir résolu le pb en éliminant FROM_UNIXTIME de le version MySQL de départ:
http://trac.rezo.net/trac/spip/changeset/15983
peux-tu essayer ?
Ça ne suffit pas. Il reste un appel à DATE_FORMAT dans la requete, et
PG ne connait pas ça.
J'ai tenté d'ajouter ça en imitant le code existant :
diff --git a/ecrire/req/pg.php b/ecrire/req/pg.php
index 0034a02..18c9fb9 100644
--- a/ecrire/req/pg.php
+++ b/ecrire/req/pg.php
@@ -596,6 +596,7 @@ function spip_pg_frommysql($arg)
$res = preg_replace("/(EXTRACT[(][^ ]* FROM *)\"([^\"]*)\"/", '\1\'\2\'', $res);
$res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m%d\'[)]/', 'to_number(to_char(\1, \'YYYYMMDD\'), \'8\')', $res);
$res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m\'[)]/', 'to_number(to_char(\1, \'YYYYMM\'),\'6\')', $res);
+ $res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y-%m\'[)]/', 'to_number(to_char(\1, \'YYYY-MM\'),\'6\')', $res);
$res = preg_replace('/DATE_SUB\s*[(]([^,]*),/', '(\1 -', $res);
$res = preg_replace('/DATE_ADD\s*[(]([^,]*),/', '(\1 +', $res);
$res = preg_replace('/INTERVAL\s+(\d+\s+\w+)/', 'INTERVAL \'\1\'', $res);
Mais ça ne marche doublement pas :
* D'une part, je ne comprends pas ce qu'est censé faire le
to_number(..., '6'), mais il ne marche pas, même sur des requetes
simples :
moy=> SELECT to_number(to_char(date, 'YYYY-MM'),'6') AS d FROM spip_visites;
ERROR: invalid input syntax for type numeric: " "
C'est le '6' qui est en cause pour l'erreur de syntaxe, si je met un
'9' à la place, je n'ai plus d'erreur de (mais j'ai une colonne de 2
comme résultats, c'est pas super interessant). Mais vu qu'on est en
train de remplacer un « DATE_FORMAT » MySQL, qui renvoit une string,
pourquoi tenter une re-conversion en integer ?
* D'autre part, spip_pg_groupby fait des siennes : la ligne
$join = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/','\\1', $join);
tente de faire quelque chose d'intelligent avec
to_number(to_char(date, 'YYYY-MM'),'6') et c'est l'échec, le
résultat est une clause « GROUP BY d, to_number(date,'6') » et une
erreur de syntaxe puisque to_number ne peut pas prendre une date en
argument 1.
Si j'applique ceci (i.e. sans le to_number), je n'ai plus d'erreur
SQL (mais je ne suis pas certain que le résultat soit correct pour
autant. En particulier, mon site est nouveau, il n'y a des visites que
pour le mois d'aout, donc je trouverai sans doute d'autres bugs après
le 1er septembre
)
--- a/ecrire/req/pg.php
+++ b/ecrire/req/pg.php
@@ -596,6 +596,7 @@ function spip_pg_frommysql($arg)
$res = preg_replace("/(EXTRACT[(][^ ]* FROM *)\"([^\"]*)\"/", '\1\'\2\'', $res);
$res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m%d\'[)]/', 'to_number(to_char(\1, \'YYYYMMDD\'), \'8\')', $res);
$res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y%m\'[)]/', 'to_number(to_char(\1, \'YYYYMM\'),\'6\')', $res);
+ $res = preg_replace('/DATE_FORMAT\s*[(]([^,]*),\s*\'%Y-%m\'[)]/', 'to_char(\1, \'YYYY-MM\')', $res);
$res = preg_replace('/DATE_SUB\s*[(]([^,]*),/', '(\1 -', $res);
$res = preg_replace('/DATE_ADD\s*[(]([^,]*),/', '(\1 +', $res);
$res = preg_replace('/INTERVAL\s+(\d+\s+\w+)/', 'INTERVAL \'\1\'', $res);