PostgreSQL
La base de donnťes la plus sophistiquťe au monde.

Ouverture de session

Contactez-nous

Administration du site :
"equipe chez postgresqlfr point org"

Contact presse :
"fr chez postgresql point org"

Contact association :
"bureau chez postgresqlfr point org"

Questions PostgreSQL :
 IRC :
  serveur irc.freenode.net
  canal #postgresqlfr

Recherche

Accéder aux archives

« Octobre 2008  
Lun Mar Mer Jeu Ven Sam Dim
  2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31  

Syndication

Flux XML

Sondage

Quelle est la version de PostgreSQL la plus répandue sur vos serveurs ?
8.3
10%
8.2
42%
8.1
40%
8.0
2%
7.4
6%
7.3 ou antérieure
0%
Nombre de votes: 48

CRASH de postgres.exe

Technique - windows | CRASH de postgres.exe

Par krizz le 20/04/2006 - 12:36

Bonjour à tous je suis entrain de faire une dll contenant des procédures stockées
Quand j'utilise la version 0 ( bool fonction(text* arg) ) cela fonctionne mais
quand j'utilise la version 1 ( Datum fonction(PG_FUNCTION_ARGS) cela plante postgres.exe

Cela plante surtout quand je récupère du text avec 1 ou 2 paramètres !

voici le code :

PG_FUNCTION_INFO_V1(concat_text);
Datum concat_text(PG_FUNCTION_ARGS)
{
text *arg1 = PG_GETARG_TEXT_P(0);
text *arg2 = PG_GETARG_TEXT_P(1);
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
text *new_text = (text *) palloc(new_text_size);
VARATT_SIZEP(new_text) = new_text_size;
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ), VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
PG_RETURN_TEXT_P(new_text);
}

J'aimerai savoir si quelqu'un avais deja utilisé la version 1 ou 0 ?

Je vais donc utiliser la version 0 Mais la version 1 doit être utilisée pour
retourner un tuple...

Merci encore !!!
Christophe

Options d'affichage des commentaires

Sélectionnez la méthode d'affichage des commentaires que vous préférez, puis cliquez sur "Sauvegarder les paramètres" pour activer vos changements.

Normalement un message d'erre

Christophe Chauvet/ = 20 Avril, 2006 - 16:24

Normalement un message d'erreur doit être disponible dans le journal d'évènement.

Si oui quelle est t'il ?

Cordialement.

Christophe Chauvet
http://kryskool.org/


Bonjour, Voici le log du g

krizz/ = 21 Avril, 2006 - 14:30

Bonjour,

Voici le log du gestionnaire d'evenement windows :

Type de l'événement : Erreur
Source de l'événement : Application Error
Catégorie de l'événement : Aucun
ID de l'événement : 1000
Date : 21/04/2006
Heure : 14:24 ©red
Utilisateur : N/A
Ordinateur : TOTO

Description :
Application défaillante postgres.exe, version 8.1.3.6044, module défaillant postgres.exe, version 8.1.3.6044, adresse de défaillance 0x001c1e06.

Pour plus d'informations, consultez le centre Aide et support à l'adresse http://go.microsoft.com/fwlink/events.asp.
Données :
0000: 41 70 70 6c 69 63 61 74 Applicat
0008: 69 6f 6e 20 46 61 69 6c ion Fail
0010: 75 72 65 20 20 70 6f 73 ure pos
0018: 74 67 72 65 73 2e 65 78 tgres.ex
0020: 65 20 38 2e 31 2e 33 2e e 8.1.3.
0028: 36 30 34 34 20 69 6e 20 6044 in
0030: 70 6f 73 74 67 72 65 73 postgres
0038: 2e 65 78 65 20 38 2e 31 .exe 8.1
0040: 2e 33 2e 36 30 34 34 20 .3.6044
0048: 61 74 20 6f 66 66 73 65 at offse
0050: 74 20 30 30 31 63 31 65 t 001c1e
0058: 30 36 0d 0a 06..

le log de Dr.MinGW :

postgres.exe caused an Access Violation at location 005c1e06 in module postgres.exe Reading from location 00000130.

Registers:
eax=00000130 ebx=00000002 ecx=00afd160 edx=681017e7 esi=00000002 edi=015a4450
eip=005c1e06 esp=00afd088 ebp=00afd088 iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206

Call stack:
005C1E06 postgres.exe:005C1E06 pg_detoast_datum
681017FB ceipgsql.dll:681017FB concat_text ceipgsql.c:137
Datum concat_text(
FunctionCallInfo fcinfo = &(indirect)
)
005C1FEE postgres.exe:005C1FEE pg_detoast_datum
004C08D8 postgres.exe:004C08D8 ExecMakeFunctionResult
004C4272 postgres.exe:004C4272 ExecProject
004CE030 postgres.exe:004CE030 ExecResult
004BF440 postgres.exe:004BF440 ExecProcNode
004BE276 postgres.exe:004BE276 ExecutorRun
00547822 postgres.exe:00547822 PortalSetResultFormat
00547E0A postgres.exe:00547E0A PortalRun
0054409A postgres.exe:0054409A pg_parse_query
005455CB postgres.exe:005455CB PostgresMain
0051EE2A postgres.exe:0051EE2A SubPostmasterMain
004DD5DF postgres.exe:004DD5DF main
004011E7 postgres.exe:004011E7
00401238 postgres.exe:00401238
7C816D4F kernel32.dll:7C816D4F RegisterWaitForInputIdle

Voici mon code :

PG_FUNCTION_INFO_V1(concat_text);
Datum concat_text(PG_FUNCTION_ARGS)
{
text *arg1 = PG_GETARG_TEXT_P(0); // ICI LIGNE 137
text *arg2 = PG_GETARG_TEXT_P(1);
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
text *new_text = (text *) palloc(new_text_size);
VARATT_SIZEP(new_text) = new_text_size;
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ), VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
PG_RETURN_TEXT_P(new_text);
}

ma requette :

select concat_text('erer','erere');


Pour info, je viens de trouve

krizz/ = 25 Avril, 2006 - 12:03

Pour info, je viens de trouver mon erreur ;)

Cet un problême de déclaration de fonction.

Dans le cas la fonction concat_text il faut bien vérifier la présence dans le fichier .def généré les déclaration de concat_text @1 ET de pg_finfo_concat_text

Voici mes sources pour info :

/*******/
fichier.h
/*******/

#ifndef __FICHIER_H__
#define __FICHIER_H__

#define WIN32_CLIENT_ONLY
#include "postgres.h"
#include "fmgr.h"
#include "executor/executor.h"

#ifdef BUILD_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif

EXPORT Datum concat_text(PG_FUNCTION_ARGS);

#endif

/*******/
fichier.c
/*******/

#define BUILD_DLL
#include "fichier.h"

#include stdio.h
#include stdlib.h
#include time.h

EXPORT PG_FUNCTION_INFO_V1(concat_text);
EXPORT Datum concat_text(PG_FUNCTION_ARGS)
{
if ( (PG_NARGS()>1)&&(!PG_ARGISNULL(0))&&(!PG_ARGISNULL(1)) )
{
text *arg1 = PG_GETARG_TEXT_P(0);
text *arg2 = PG_GETARG_TEXT_P(1);
int32 new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
text *new_text = (text *) palloc(new_text_size);
VARATT_SIZEP(new_text) = new_text_size;
memcpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1)-VARHDRSZ);
memcpy(VARDATA(new_text) + (VARSIZE(arg1)-VARHDRSZ), VARDATA(arg2), VARSIZE(arg2)-VARHDRSZ);
PG_RETURN_TEXT_P(new_text);
}
else
{
elog(ERROR,"concat_text PG_NARGS = %i", PG_NARGS());
PG_RETURN_NULL();
}
}

/**********/
fichier .def
/**********/

EXPORTS
concat_text @1
pg_finfo_concat_text @2

maintenant cela fonctionne...

krizz


© PostgreSQLFr, tous droits r√©serv√©s.
Site déclaré à la CNIL sous le numéro 1074678, conformément à la Loi en vigueur.