Re: Segmentation fault en una función en C

From: Fernando Magariños <mancha(dot)at(dot)me(at)gmail(dot)com>
To: Jaime Soler <jaime(dot)soler(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)lists(dot)postgresql(dot)org
Subject: Re: Segmentation fault en una función en C
Date: 2024-08-27 19:16:58
Message-ID: CADGkbC-=b0hCeGzXhGhcqfFHDTC1cLgLBCwj-t22W0M+WJeV-A@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Tue, Aug 27, 2024 at 1:03 PM Fernando Magariños <mancha(dot)at(dot)me(at)gmail(dot)com>
wrote:

> On Tue, Aug 27, 2024 at 3:10 AM Jaime Soler <jaime(dot)soler(at)gmail(dot)com> wrote:
>
>> En tu caso, tu función devuelve un número variable de elementos y no veo
>> que reserves memoria para ellos de forma variable , puedes mirar el código
>> de la función del enlace
>> https://github.com/postgres/postgres/blob/master/src/tutorial/funcs.c#L89-L103
>> y que te guíe en la reserva de memoria y ampliación de la misma cuando los
>> resultados de la consulta son variables.
>>
>
Perdón, olvidé poner esto:

PG_FUNCTION_INFO_V1(c_crea_curp);

Datum c_crea_curp(PG_FUNCTION_ARGS)
{
text *nom = PG_GETARG_TEXT_PP(0);
text *pat = PG_GETARG_TEXT_PP(1);
/* text *mat = PG_GETARG_TEXT_PP(2); */
/* int32 ent = PG_GETARG_INT32(3); */
/* text *genero = PG_GETARG_TEXT_PP(4); */
/* text *fn = PG_GETARG_TEXT_PP(5); */
/* text *hm = PG_GETARG_TEXT_PP(6); */

char *nombre, *apepat, *apemat, *sexo, *fecnac, *lahm;

nombre = (char *) palloc(MAX_STR);
memcpy(text_to_cstring(nom), nombre, VARSIZE_ANY_EXHDR(nom));
apepat = (char *) palloc(MAX_STR);
memcpy(text_to_cstring(pat), apepat, VARSIZE_ANY_EXHDR(pat));
/* apemat = (char *) palloc(MAX_STR); */
/* memcpy(text_to_cstring(mat), apemat, VARSIZE_ANY_EXHDR(mat)); */
/* sexo = (char *) palloc(MAX_STR); */
/* memcpy(text_to_cstring(genero), sexo, VARSIZE_ANY_EXHDR(genero)); */
/* fecnac = (char *) palloc(MAX_STR); */
/* memcpy(text_to_cstring(fn), fecnac, VARSIZE_ANY_EXHDR(fn)); */
/* lahm = (char *) palloc(MAX_STR); */
/* memcpy(text_to_cstring(hm), lahm, VARSIZE_ANY_EXHDR(hm)); */

pfree(nombre);
pfree(apepat);
/* pfree(apemat); */
/* pfree(apemat); */
/* pfree(sexo); */
/* pfree(fecnac); */
/* pfree(lahm); */

PG_RETURN_NULL();
}

es decir, que sólo reciba 2 argumentos, funciona perfectamente y «procesa»
los 71 millones de registros de la base de pruebas. Si lo hago con tres
argumentos, truena igual que en el caso de los siete argumentos.

Lo más curioso del asunto es que la versión original se compone de cuatro
funciones que funcionaban estupendamente en PostgreSQL versiones 9 y 10,
los problemas comenzaron al compilarlo y probarlo para la versión 15.7, por
esto construí ejemplos cada vez más pequeños, luego de leer el código de
los contrib y tutorial.

Una duda para el moderador. Originalmente esta inscrito en la lista con la
dirección mancha(at)mac(dot)com, pero es un engorro las cuentas en Apple, si no
las usas con equipos Apple y por eso la redireccioné a
mancha(dot)at(dot)me(at)gmail(dot)com, pero al escribir a la lista, pues me envía a
moderación y no recuerdo cómo suscribirme para hacerlo desde otra dirección.

--
Saludos.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mario González Troncoso 2024-08-27 19:48:29 Re: Segmentation fault en una función en C
Previous Message Fernando Magariños 2024-08-27 19:03:53 Re: Segmentation fault en una función en C