bug suivi des stats avec postgres #1936

Open
opened 11 years ago by miros · 5 comments
miros commented 11 years ago

Lors de l'ouverture de la page de suivi des statistiques dans la partie privé (/ecrire/?exec=statistiques_visites) le message d'erreur suivant apparait (+ une erreur squelette):

Warning: pg_query() [function.pg-query]: Query failed: ERREUR: la fonction abstime(double precision, unknown) n'existe pas at character 27 HINT: Aucune fonction ne correspond au nom donné et aux types d'arguments. Vous devez ajouter des conversions explicites de type. in /var/www/html/gesteau/ecrire/req/pg.php on line 150

La requête qui passe par la fonction "spip_pg_query_simple" est la suivante :
SELECT SUM(visites) AS n, ABSTIME( EXTRACT(epoch FROM date),'%Y-%m') AS d FROM spip_visites WHERE date > (NOW() -INTERVAL '2700 DAY') GROUP BY d, ABSTIME( EXTRACT(epoch FROM date),'%Y-%m')

Comme spip semble le suggérer me manque t-il une fonction à créer dans postgres? dans ce cas comment la définir?

En prime le détail de la table spip_visites dans postgres:
date date NOT NULL [pk]
visites integer NOT NULL 0
maj timestamp without time zone

Configuration serveur :

  • spip 2.1
  • php 5.1.6
  • postgres 8.1
    plugins installés :
  • cfg : moteur de configuration 1.15.0 - stable
  • Crayons 1.6.1 - stable
Lors de l'ouverture de la page de suivi des statistiques dans la partie privé (/ecrire/?exec=statistiques_visites) le message d'erreur suivant apparait (+ une erreur squelette): Warning: pg_query() [function.pg-query]: Query failed: ERREUR: la fonction abstime(double precision, unknown) n'existe pas at character 27 HINT: Aucune fonction ne correspond au nom donné et aux types d'arguments. Vous devez ajouter des conversions explicites de type. in /var/www/html/gesteau/ecrire/req/pg.php on line 150 La requête qui passe par la fonction "spip_pg_query_simple" est la suivante : SELECT SUM(visites) AS n, ABSTIME( EXTRACT(epoch FROM date),'%Y-%m') AS d FROM spip_visites WHERE date > (NOW() -INTERVAL '2700 DAY') GROUP BY d, ABSTIME( EXTRACT(epoch FROM date),'%Y-%m') Comme spip semble le suggérer me manque t-il une fonction à créer dans postgres? dans ce cas comment la définir? En prime le détail de la table spip_visites dans postgres: date date NOT NULL [pk] visites integer NOT NULL 0 maj timestamp without time zone Configuration serveur : - spip 2.1 - php 5.1.6 - postgres 8.1 plugins installés : - cfg : moteur de configuration 1.15.0 - stable - Crayons 1.6.1 - stable
Poster

Je me répond à moi même, au lieu de bricoler le code spip, je tente de vivre avec , un patch possible est de créer la fonction sql manquante dans postgres. Voici un exemple de trois fonctions pratiques pour postgres qui corrigent le problème :

CREATE OR REPLACE FUNCTION abstime(double precision, text) RETURNS timestamp AS 'DECLARE
pattern text := lower(RIGHT($2, 1));
BEGIN
IF pattern =y THEN
RETURN date_trunc(year, to_timestamp($1));
ELSIF pattern =m THEN
RETURN date_trunc(month, to_timestamp($1) );
ELSIF pattern =d THEN
RETURN date_trunc(day, to_timestamp($1));
ELSIF pattern =h THEN
RETURN date_trunc(hours, to_timestamp($1));
ELSE
RETURN $1::abstime::timestamp;
END IF;
END;'
LANGUAGE 'plpgsql';

CREATE OR REPLACE FUNCTION right(text, integer) RETURNS text AS 'SELECT substring($1 from char_length($1)-$2) AS result; ' LANGUAGE 'SQL';

CREATE OR REPLACE FUNCTION left(text, integer) RETURNS text AS 'SELECT substring($1 from 1 for $2) AS result; ' LANGUAGE 'SQL';

Il n'empêche que la requete générée par spip n'est pas valide par défaut.

Je me répond à moi même, au lieu de bricoler le code spip, je tente de vivre avec , un patch possible est de créer la fonction sql manquante dans postgres. Voici un exemple de trois fonctions pratiques pour postgres qui corrigent le problème : CREATE OR REPLACE FUNCTION abstime(double precision, text) RETURNS timestamp AS 'DECLARE pattern text := lower(RIGHT($2, 1)); BEGIN IF pattern =_y_ THEN RETURN date_trunc(_year_, to_timestamp($1)); ELSIF pattern =_m_ THEN RETURN date_trunc(_month_, to_timestamp($1) ); ELSIF pattern =_d_ THEN RETURN date_trunc(_day_, to_timestamp($1)); ELSIF pattern =_h_ THEN RETURN date_trunc(_hours_, to_timestamp($1)); ELSE RETURN $1::abstime::timestamp; END IF; END;' LANGUAGE 'plpgsql'; CREATE OR REPLACE FUNCTION right(text, integer) RETURNS text AS 'SELECT substring($1 from char_length($1)-$2) AS result; ' LANGUAGE 'SQL'; CREATE OR REPLACE FUNCTION left(text, integer) RETURNS text AS 'SELECT substring($1 from 1 for $2) AS result; ' LANGUAGE 'SQL'; Il n'empêche que la requete générée par spip n'est pas valide par défaut.
Owner

Version cible mise à 3.1

**Version cible mise à 3.1**
Owner

Version cible mise à 3.2

**Version cible mise à 3.2**
Owner

Version cible mise à 4.1

**Version cible mise à 4.1**
Owner

Version cible mise à 90. PostgreSQL

**Version cible mise à 90. PostgreSQL**
cy.altern added the
PostgreSQL
label 1 week ago
cy.altern removed this from the (deleted) milestone 1 week ago
Sign in to join this conversation.
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.