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.