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.
>

Gracias por la respuesta. En la función real, la que envié es sólo una
muestra de dónde truena, hago pallocs para todas las variables de trabajo,
pero me parece que el error va por otro lado.
Aquí va otro ejemplo:

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();
}

prueba_extensiones=# create or replace function crea_curp (text, text,
text, integer, text, text, text) returns text as
'/home/mancha/lib/inicio_curp.so', 'c_crea_curp' language c IMMUTABLE;
CREATE FUNCTION
prueba_extensiones=# select nombre, apeuno, apedos, entnac, sexo, fecnac,
'0'::text as hm, crea_curp(nombre::text, apeuno::text, apedos::text,
entnac::integer, sexo::text, fecnac::text, '0'::text) from mini_retrapo
limit 4;
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
The connection to the server was lost. Attempting reset: Failed.
!?>

Reply via email to