From: | Dimitri Fontaine <dfontaine(at)hi-media(dot)com> |
---|---|
To: | Samuel ROZE <samuel(dot)roze(at)gmail(dot)com> |
Cc: | pgsql-fr-generale(at)postgresql(dot)org |
Subject: | Re: Fonction C: Segmentation fault |
Date: | 2009-10-14 18:53:16 |
Message-ID: | m2hbu1ajtv.fsf@hi-media.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Bonsoir,
Rapidemment aussi, avec un peu de chance plus tard dans la semaine je
pourrai regarder le code, mais je n'ai encore jamais retourné de tuple
en C...
Samuel ROZE <samuel(dot)roze(at)gmail(dot)com> writes:
> Pour le compilation, voilà ce que j'ai fait:
Regarde plutôt du côté de PGXS, tu fais un Makefile de 5 lignes et hop
ça roule. Il faut absolument utiliser les mêmes options de compilation
que ton serveur PG.
Voilà un exemple :
> Ça marche bien. Quelques petites erreurs:
> ------------------------------------------------------------------------
> parse_url.c: In function ‘parse_url’:
> parse_url.c:25: warning: unused variable ‘length’
> parse_url.c: In function ‘parse_url_alloc’:
> parse_url.c:73: warning: control reaches end of non-void function
> parse_url.c: In function ‘parse_url’:
> parse_url.c:51: warning: ‘tupdesc’ may be used uninitialized in this
> function
> ------------------------------------------------------------------------
N'accepte aucun warning. Pas la peine de tenter d'aller plus loin en
faisant comme si tu n'avais pas vu.
> Pour la création de la fonction dans PostgreSQL:
> ------------------------------------------------------------------------
> CREATE FUNCTION parse_url (text) RETURNS record AS '/root/PgSQL-parse_url/parse_url.so', 'parse_url' LANGUAGE C;
> ------------------------------------------------------------------------
Relis la doc sur les modules externes et PGXS, et utilise :
http://www.postgresql.org/docs/8.3/interactive/xfunc-c.html
Pour reprendre l'exemple de hstore-new :
CREATE OR REPLACE FUNCTION exist(hstore,text)
RETURNS bool
AS 'MODULE_PATHNAME','hstore_exists'
LANGUAGE C STRICT IMMUTABLE;
> Pour l'éxécution:
> ------------------------------------------------------------------------
> SELECT * FROM parse_url('http://www.google.fr') as ("schema" text, "query" text);
> ------------------------------------------------------------------------
>
> L'erreur suivante m'est retournée:
> ------------------------------------------------------------------------
> server closed the connection unexpectedly
> This probably means the server terminated abnormally
> before or while processing the request.
> ------------------------------------------------------------------------
Utilise un serveur compilé avec les options --enable-debug et
--enable-cassert pour valider du code maison en C, et regarde comment
attacher gdb au backend qui traite tes requêtes. En gros, dans deux
consoles interactives a et b :
a# psql ...
b# ps aux | grep '[p]ostgres.*idle'
b# gdb -p <pid>
b# continue
a# select ...
crash
b# bt
bt ça veut dire backtrace et tu peux demander plein d'autres infos pour
savoir exactement ce qui c'est passé, regarder la valeur des variables,
tout.
Et relis bien attentivement le manuel :)
http://www.postgresql.org/docs/8.3/interactive/xfunc-c.html
--
dim
From | Date | Subject | |
---|---|---|---|
Next Message | Guillaume Lelarge | 2009-10-14 19:07:04 | Re: Fonction C: Segmentation fault |
Previous Message | Samuel ROZE | 2009-10-14 17:46:55 | Re: Fonction C: Segmentation fault |