PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#26 PL/Perl » Plantage process serveur lors de l'appel de unaccent » 21/08/2015 10:10:56

mgmpg
Réponses : 18

Bonjour,

Je fais des tests de migration pg9.1->9.4 (migration debian wheezy->jessie).

J'ai une fonction pour wrapper la fonction perl text::unaccent mais celle-ci fait carrément vautrer le serveur :-((
** Error in `postgres: postgres testperl [local] SELECT': free(): invalid pointer: 0x00007fc100000000 ***
2015-08-21 09:04:58 CEST [13653-77] LOG:  processus serveur (PID 13503) a été arrêté par le signal 6 : Aborted
2015-08-21 09:04:58 CEST [13653-78] DÉTAIL:  Le processus qui a échoué exécutait : SELECT unaccent('utf-8','_');
2015-08-21 09:04:58 CEST [13653-79] LOG:  arrêt des autres processus serveur actifs
2015-08-21 09:04:58 CEST [14091-1]  postgres@[local] testperl [inconnu] FATAL:  le système de bases de données est en cours de restauration
2015-08-21 09:04:58 CEST [12850-2] ATTENTION:  arrêt de la connexion à cause de l'arrêt brutal d'un autre processus serveur
2015-08-21 09:04:58 CEST [12850-3] DÉTAIL:  Le postmaster a commandé à ce processus serveur d'annuler la transaction
        courante et de quitter car un autre processus serveur a quitté anormalement
        et qu'il existe probablement de la mémoire partagée corrompue.
2015-08-21 09:04:58 CEST [12850-4] ASTUCE :  Dans un moment, vous devriez être capable de vous reconnecter à la base de
        données et de relancer votre commande.
2015-08-21 09:04:58 CEST [13653-80] LOG:  tous les processus serveur se sont arrêtés, réinitialisation
2015-08-21 09:04:58 CEST [14092-1] LOG:  le système de bases de données a été interrompu ; dernier lancement connu à 2015-08-21 08:56:43 CEST
2015-08-21 09:04:58 CEST [14092-2] LOG:  le système de bases de données n'a pas été arrêté proprement ; restauration
        automatique en cours
2015-08-21 09:04:58 CEST [14092-3] LOG:  la ré-exécution commence à 0/61B0360
2015-08-21 09:04:58 CEST [14092-4] LOG:  enregistrement de longueur nulle à 0/61B4F58
2015-08-21 09:04:58 CEST [14092-5] LOG:  ré-exécution faite à 0/61B4F28
2015-08-21 09:04:58 CEST [14092-6] LOG:  la dernière transaction a eu lieu à 2015-08-21 09:04:39.712487+02 (moment de la journalisation)
2015-08-21 09:04:58 CEST [13653-81] LOG:  le système de bases de données est prêt pour accepter les connexions
2015-08-21 09:04:58 CEST [14096-1] LOG:  lancement du processus autovacuum

Et en plus, il embarque toute la famille dans le tombeau !

La lib perl fonctionne bien hors postgresql:
$ cat test.perl
use Text::Unaccent;
print unac_string('utf-8','titanic ta mère');
$ perl test.perl
titanic ta mere

Pour reproduire:

create database testperl;
\c testperl

create extension plperlu;
CREATE or replace FUNCTION unaccent(the_charset text, the_string text) RETURNS text AS $_X$
  use Text::Unaccent;
  return unac_string($_[0],$_[1]);
  $_X$
  language plperlu;

SELECT unaccent('utf-8','');
unaccent
----------

(1 ligne)
Ca marche avec une chaine vide !

SELECT unaccent('utf-8','_');
la connexion au serveur a été coupée de façon inattendue
        Le serveur s'est peut-être arrêté anormalement avant ou durant le
        traitement de la requête.
La connexion au serveur a été perdue. Tentative de réinitialisation : Échec.
!>
Même avec un caractère "non utf8", ça plante !

J'ai un autre wrapper pour la fonction perl suivante:
use HTML::Entities;
return decode_entities($_[0]);
et celui ci fonctionne sans problème !

Une idée ?

Pied de page des forums

Propulsé par FluxBB