Greetings,
I have spent a couple of days working on separated lib in PostgreSql, and I
am facing some issues with the return of data using SPI (Server Programming
Interface).
I have this simple get_tuples function used in the main function foobar. My
example is very simple too (Using a previously created table a with a
single column and with some data):
SELECT foobar('select * from a');
I am not able to get the array returned by get_tuples function, and I am
thinking it's SPI_finish(). When I tried to print my array tuples itens
after SPI_finish(), It is not working.
####################
###### My Code ######
####################
static char**
get_tuples(char *command) {
int ret;
int8 rows;
char **tuples;
SPI_connect();
ret = SPI_exec(command, 0);
rows = SPI_processed;
tuples = palloc(sizeof(char*)*rows);
if (ret > 0 && SPI_tuptable != NULL) {
TupleDesc tupdesc = SPI_tuptable->tupdesc;
SPITupleTable *tuptable = SPI_tuptable;
uint64 j;
for (j = 0; j < rows; j++){
HeapTuple tuple = tuptable->vals[j];
int i;
for (i = 1; i <= tupdesc->natts; i++){
char *rowid;
rowid = SPI_getvalue(tuple, tupdesc, i);
tuples[j] = palloc(strlen(rowid)*sizeof(char));
tuples[j]= rowid;
}
}
}
// Printing my array to verify if I have all tuples, in fact I have all
of the
for (int i = 0; i < rows; ++i) {
elog(INFO, "Item: %s", *(tuples + i));
}
pfree(command);
SPI_finish();
return tuples;
}
####################
Datum
foobar (PG_FUNCTION_ARGS) {
char *command;
command = text_to_cstring(PG_GETARG_TEXT_PP(0));
get_tuples(command);
// *When I tried to do something like this, I am losing the connection
with the server (error)*
//elog(INFO, "*****: %s", *(get_tuples(command) + 1));
PG_RETURN_INT64(1);
}
####################
CREATE FUNCTION foobar(text) RETURNS int8
AS 'MODULE_PATHNAME'
LANGUAGE C IMMUTABLE STRICT;
####################
regards,
*Andjasubu Bungama, Patrick *