From ca0da79d82c3b757f1d7f5f82ca25eedc31ce75c Mon Sep 17 00:00:00 2001 From: Alexey Kopytov Date: Mon, 30 Jan 2017 15:13:05 +0300 Subject: [PATCH] Call PQclear() for non-SELECT queries explicitly in drv_pgsql.c. --- src/drivers/pgsql/drv_pgsql.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/drivers/pgsql/drv_pgsql.c b/src/drivers/pgsql/drv_pgsql.c index aa17f77..27d0af7 100644 --- a/src/drivers/pgsql/drv_pgsql.c +++ b/src/drivers/pgsql/drv_pgsql.c @@ -505,6 +505,12 @@ static db_error_t pgsql_check_status(db_conn_t *con, PGresult *pgres, rs->counter = (rs->nrows > 0) ? SB_CNT_WRITE : SB_CNT_OTHER; rc = DB_ERROR_NONE; + /* + Since we are not returning a result set, the SQL layer will never call + pgsql_drv_free_results(). So we must call PQclear() here. + */ + PQclear(pgres); + break; case PGRES_FATAL_ERROR: @@ -611,7 +617,7 @@ db_error_t pgsql_drv_execute(db_stmt_t *stmt, db_result_t *rs) rc = pgsql_check_status(con, pgres, "PQexecPrepared", NULL, rs); - rs->ptr = (void *) pgres; + rs->ptr = (rs->counter == SB_CNT_READ) ? (void *) pgres : NULL; return rc; } @@ -672,7 +678,7 @@ db_error_t pgsql_drv_query(db_conn_t *sb_conn, const char *query, size_t len, pgres = PQexec(pgcon, query); rc = pgsql_check_status(sb_conn, pgres, "PQexec", query, rs); - rs->ptr = pgres; + rs->ptr = (rs->counter == SB_CNT_READ) ? (void *) pgres : NULL; return rc; }