I have tried to have the above change added in the missing places. Still, I see the below leaks reported by the address sanitizer. Please see the attachments for the leak reported and the function definition updated. Not sure for PQexecPrepared if we call PQclear(res) for cleaning up as well. let me know if you need any more information
You have many other leaks. See code below, you are making up to thee sequential calls to create a result before calling clear. All calls creating and returning returning PGresult have to be cleared before the pointer is reused.
merlin
LOG_DEBUG("%s() conninfo=%s",__func__,conninfo);
if(is_shadow_db) { shadow_db_conn = PQconnectdb(shadow_db_conn_info); if ( PQstatus(shadow_db_conn ) != CONNECTION_OK ) { LOG_ERROR("Connection to shadow database failed! %s", PQerrorMessage(conn)); PQfinish(shadow_db_conn); exit(1); } res = PQexec(shadow_db_conn, "SET bytea_output = 'escape'"); LOG_DEBUG("%s() Connection to shadow_shc_data database SUCCESSFUL",__func__); // execute_stored_procedure(shadow_db_conn); }
conn = PQconnectdb(conninfo); if ( PQstatus(conn) != CONNECTION_OK ) { LOG_ERROR("Connection to database failed! %s", PQerrorMessage(conn)); PQfinish(conn); exit(1); } else { res = PQexec(conn, "SET bytea_output = 'escape'"); LOG_DEBUG("%s() Connection to shc_data database SUCCESSFUL",__func__); }
res = PQexec(conn, "START TRANSACTION"); if (PQresultStatus(res) != PGRES_COMMAND_OK) { LOG_ERROR("START TRANSACTION failed: %s", PQerrorMessage(conn)); SQL_exit_nicely(conn,res); } PQclear(res);