Yuriy Rusinov <yrusinov@gmail.com> writes: > In C-function I do > size_t nr_ins = strlen ("insert into rand_state (state_rand) values ($1);"); > char * r_sql = (char *) palloc (nr_ins + 1); > strncpy (r_sql, "insert into rand_state (state_rand) values ($1);", nr_ins);
This is a hard, error-prone, and ultimately incorrect way to do pstrdup() --- you're not ensuring that the new string is null-terminated.
> Datum * val = PointerGetDatum (randBuf);
Didn't your compiler give you a warning about that? PointerGetDatum produces a Datum, not a pointer to a Datum. You'd need something more like
Datum val[1]; val[0] = PointerGetDatum (randBuf);
This is assuming that randBuf is even of the right format to be a bytea value, which is unclear from your extract.
> const char * nulls = "NULL";
And that's just wrong. Personally I'd just pass NULL to SPI_execute_with_args since you don't have any null values to pass, but if you don't want to do that you'd need something more like
char nulls[1]; nulls[0] = ' ';
(hmm, it looks like the SPI documentation leaves something to be desired here --- the SPI_execute_with_args page, at least, isn't explaining the convention for elements of the nulls[] array)
> Could you give some work examples for SPI_execute_with_args because I > didn't find them in documentation.
A quick grep says there's a usage in src/pl/plpgsql/src/pl_exec.c