Fix a couple of places where psql might fail to report a suitable error

if PQexec returns NULL.  These don't seem significant enough to be worth
back-patching, but they ought to get fixed ...
This commit is contained in:
Tom Lane 2008-08-16 01:36:35 +00:00
parent b9984ade83
commit 63c3b9903b
2 changed files with 32 additions and 21 deletions

View File

@ -3,7 +3,7 @@
* *
* Copyright (c) 2000-2008, PostgreSQL Global Development Group * Copyright (c) 2000-2008, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.139 2008/05/14 19:10:29 tgl Exp $ * $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.140 2008/08/16 01:36:35 tgl Exp $
*/ */
#include "postgres_fe.h" #include "postgres_fe.h"
#include "common.h" #include "common.h"
@ -880,16 +880,20 @@ SendQuery(const char *query)
/* If we made a temporary savepoint, possibly release/rollback */ /* If we made a temporary savepoint, possibly release/rollback */
if (on_error_rollback_savepoint) if (on_error_rollback_savepoint)
{ {
PGresult *svptres; const char *svptcmd;
transaction_status = PQtransactionStatus(pset.db); transaction_status = PQtransactionStatus(pset.db);
/* We always rollback on an error */
if (transaction_status == PQTRANS_INERROR) if (transaction_status == PQTRANS_INERROR)
svptres = PQexec(pset.db, "ROLLBACK TO pg_psql_temporary_savepoint"); {
/* If they are no longer in a transaction, then do nothing */ /* We always rollback on an error */
svptcmd = "ROLLBACK TO pg_psql_temporary_savepoint";
}
else if (transaction_status != PQTRANS_INTRANS) else if (transaction_status != PQTRANS_INTRANS)
svptres = NULL; {
/* If they are no longer in a transaction, then do nothing */
svptcmd = NULL;
}
else else
{ {
/* /*
@ -901,20 +905,27 @@ SendQuery(const char *query)
(strcmp(PQcmdStatus(results), "SAVEPOINT") == 0 || (strcmp(PQcmdStatus(results), "SAVEPOINT") == 0 ||
strcmp(PQcmdStatus(results), "RELEASE") == 0 || strcmp(PQcmdStatus(results), "RELEASE") == 0 ||
strcmp(PQcmdStatus(results), "ROLLBACK") == 0)) strcmp(PQcmdStatus(results), "ROLLBACK") == 0))
svptres = NULL; svptcmd = NULL;
else else
svptres = PQexec(pset.db, "RELEASE pg_psql_temporary_savepoint"); svptcmd = "RELEASE pg_psql_temporary_savepoint";
}
if (svptres && PQresultStatus(svptres) != PGRES_COMMAND_OK)
{
psql_error("%s", PQerrorMessage(pset.db));
PQclear(results);
PQclear(svptres);
ResetCancelConn();
return false;
} }
PQclear(svptres); if (svptcmd)
{
PGresult *svptres;
svptres = PQexec(pset.db, svptcmd);
if (PQresultStatus(svptres) != PGRES_COMMAND_OK)
{
psql_error("%s", PQerrorMessage(pset.db));
PQclear(svptres);
PQclear(results);
ResetCancelConn();
return false;
}
PQclear(svptres);
}
} }
PQclear(results); PQclear(results);

View File

@ -3,7 +3,7 @@
* *
* Copyright (c) 2000-2008, PostgreSQL Global Development Group * Copyright (c) 2000-2008, PostgreSQL Global Development Group
* *
* $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.170 2008/03/29 19:19:14 tgl Exp $ * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.171 2008/08/16 01:36:35 tgl Exp $
*/ */
/*---------------------------------------------------------------------- /*----------------------------------------------------------------------
@ -2577,11 +2577,11 @@ exec_query(const char *query)
result = PQexec(pset.db, query); result = PQexec(pset.db, query);
if (result != NULL && PQresultStatus(result) != PGRES_TUPLES_OK) if (PQresultStatus(result) != PGRES_TUPLES_OK)
{ {
#if 0 #if 0
psql_error("tab completion: %s failed - %s\n", psql_error("tab completion query failed: %s\nQuery was:\n%s\n",
query, PQresStatus(PQresultStatus(result))); PQerrorMessage(pset.db), query);
#endif #endif
PQclear(result); PQclear(result);
result = NULL; result = NULL;