Francesco Casadei <f_casadei@libero.it> writes:
> 1) SPI_connect() and SPI_finish() mark a new memory context; since I must
> return cod I need to SPI_palloc() it in the upper Executor context. The
> problem is: how can I free the SPI_palloc()'ed memory?
I don't believe you need to. AFAICT, SPI_palloc will allocate in the
context that was current when SPI_connect was called. Assuming that
that was the active context when your function was entered, that is the
right context to palloc your result value in. It's the executor's
responsibility to clean up the result value, not yours.
> 2) If I use the VARSIZE(__PTR) macro (defined in postgres.h) to set
> the size of cod, the compiler will complain about an invalid
> lvalue. This is not valid:
> VARSIZE(cod) = VARHDRSZ + 8;
Right. As of 7.1 this should be
VARATT_SIZEP(cod) = VARHDRSZ + 8;
Did we miss any places in the documentation where this needs to be
updated?
> 3) The following variable is an identifier (Name):
> Name tablename = PG_GETARG_NAME(0);
> (void)strlcat(query, NameStr(fieldname), sizeof(query));
Should be NameStr(*tablename). Not too consistent maybe, but I didn't
invent that macro ;-)
regards, tom lane