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