On Tue, 27 Aug 2024 at 15:33, Fernando Magariños <mancha.at...@gmail.com> wrote:
>
> On Tue, Aug 27, 2024 at 1:03 PM Fernando Magariños <mancha.at...@gmail.com> 
> wrote:
>>
>> On Tue, Aug 27, 2024 at 3:10 AM Jaime Soler <jaime.so...@gmail.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;
>

Es difícil hacer la depuración con solo un trozo de código. El
segfault lo debes estar generando por un overflow. Por ejemplo si
entiendo bien, estás utilizando 2 tipos de límites para copiar y otro
diferente para pedir memoria. Estos no tienen porqué ser iguales por
lo que eso puede llevar a ese tipo de error dependiendo del sistema
operativo y del compilador. Cuando pasaste de Postgres 9 a v15,
utilizaste la misma versión de gcc?

Lo otro, creo que deberias tambien llamar a pfree() a los argumentos
que devuelve PG_GETARG_TEXT_PP[1]

[1] https://www.postgresql.org/docs/current/spi-examples.html

>   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 man...@mac.com, pero es un engorro las cuentas en Apple, si no las 
> usas con equipos Apple y por eso la redireccioné a mancha.at...@gmail.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.
>
>
>


-- 
https://www.linkedin.com/in/gonzalemario


Reply via email to