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;

  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.

Reply via email to