On Tue, Aug 27, 2024 at 1:48 PM Mario González Troncoso <
gonzalema...@gmail.com> wrote:

> 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
>
>
Gracias por el comentario. Lo que envié es todo el código, salvo los
#include de rigor. Es correcto tu comentario con respecto a las
asignaciones, las copié tal cual, de algún ejemplo. Respecto al compilador,
pues no, no son la misma versión de GCC.

Pero el problema quedó resuelto. El error está en que en PostgreSQL creaba
la función como «C IMMUTABLE» porque ví esto en algún ejemplo, pero en la
versión original las declaraba como «C STABLE STRICT» y al hacer esto, ya
funcionó el ejemplo:

Datum c_crea_curp(PG_FUNCTION_ARGS)
{
char *nombre  = text_to_cstring(PG_GETARG_TEXT_PP(0));
char *apepat  = text_to_cstring(PG_GETARG_TEXT_PP(1));
char *apemat  = text_to_cstring(PG_GETARG_TEXT_PP(2));
int   laent   = PG_GETARG_INT32(3);
char *sexo    = text_to_cstring(PG_GETARG_TEXT_PP(4));
char *lafn    = text_to_cstring(PG_GETARG_TEXT_PP(5));
char *lahm    = text_to_cstring(PG_GETARG_TEXT_PP(6));

char *salida = (char *) palloc(2048);

sprintf (salida, "%s|%s|%s|%d|%s|%s|%s", nombre, apepat, apemat, laent,
sexo, lafn, lahm);
PG_RETURN_TEXT_P(cstring_to_text(salida));
PG_RETURN_NULL();
}

Para los 71 millones de registros de prueba. Ahora voy con el código real,
que espero que pase limpio.

Muchas gracias a todos.

--
Saludos.

Reply via email to