I am writing a function that returns a set of tuples by using also the PostGIS. Thuis, I am using SRF too. It successfully returns the expected result when it has at most 4 tuples. However, this is not the case when more than 4 tuples have to be returned. When I debug the code, I found that the problem is in my function that transforms a cstring after a SPI_connection. It seems that this cstring is not valid anymore in the moment of this conversion (see my comment below). I know that the SPI uses different contexts when it init and finish its process. But, I don't understand why I have this problem here. Please, note that I tried to copy the values of the whole tuple, but I have the same problem: system crash after the forth call of the function. Also note that I call this function only in the init call of the SRF. Please I would appreciate any suggestion and help.
----------- code of the problematic function here --------------- LWGEOM *retrieve_geom_from_postgis(int row_id) { char query[100]; int err; char *wkt; int srid; LWGEOM *lwgeom = NULL; HeapTuple cop; bool null; TupleDesc tupdesc; //refin is a prepared select command that returns 2 columns sprintf(query, "EXECUTE refinplan(%d);", row_id); if (SPI_OK_CONNECT != SPI_connect()) { SPI_finish(); _DEBUG(ERROR, "retrieve_geom_from_postgis: could not connect to SPI manager"); return NULL; } err = SPI_execute(query, false, 1); if (err < 0) { SPI_finish(); _DEBUG(ERROR, "retrieve_geom_from_postgis: could not execute the EXECUTE command"); return NULL; } if (SPI_processed <= 0) { SPI_finish(); _DEBUGF(ERROR, "the row_id (%d) does not exist in the table", row_id) return NULL; } cop = SPI_copytuple(SPI_tuptable->vals[0]); tupdesc = SPI_tuptable->tupdesc; /* disconnect from SPI */ SPI_finish(); wkt = text2cstring(DatumGetTextP(heap_getattr(cop, 1, tupdesc, &null))); srid = DatumGetInt32(heap_getattr(cop, 2, tupdesc, &null)); lwgeom = lwgeom_from_wkt(wkt, LW_PARSER_CHECK_NONE); //error here... only after the forth call lwgeom_set_srid(lwgeom, srid); lwfree(wkt); return lwgeom; }