@ -497,6 +497,33 @@ AcceptResult(const PGresult *result)
}
}
/*
* ClearOrSaveResult
*
* If the result represents an error , remember it for possible display by
* \ errverbose . Otherwise , just PQclear ( ) it .
*/
static void
ClearOrSaveResult ( PGresult * result )
{
if ( result )
{
switch ( PQresultStatus ( result ) )
{
case PGRES_NONFATAL_ERROR :
case PGRES_FATAL_ERROR :
if ( pset . last_error_result )
PQclear ( pset . last_error_result ) ;
pset . last_error_result = result ;
break ;
default :
PQclear ( result ) ;
break ;
}
}
}
/*
/*
* PSQLexec
* PSQLexec
@ -548,7 +575,7 @@ PSQLexec(const char *query)
if ( ! AcceptResult ( res ) )
if ( ! AcceptResult ( res ) )
{
{
PQclear ( res ) ;
ClearOrSaveResult ( res ) ;
res = NULL ;
res = NULL ;
}
}
@ -590,7 +617,7 @@ PSQLexecWatch(const char *query, const printQueryOpt *opt)
if ( ! AcceptResult ( res ) )
if ( ! AcceptResult ( res ) )
{
{
PQclear ( res ) ;
ClearOrSaveResult ( res ) ;
return 0 ;
return 0 ;
}
}
@ -1077,11 +1104,11 @@ SendQuery(const char *query)
if ( PQresultStatus ( results ) ! = PGRES_COMMAND_OK )
if ( PQresultStatus ( results ) ! = PGRES_COMMAND_OK )
{
{
psql_error ( " %s " , PQerrorMessage ( pset . db ) ) ;
psql_error ( " %s " , PQerrorMessage ( pset . db ) ) ;
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
ResetCancelConn ( ) ;
ResetCancelConn ( ) ;
goto sendquery_cleanup ;
goto sendquery_cleanup ;
}
}
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
transaction_status = PQtransactionStatus ( pset . db ) ;
transaction_status = PQtransactionStatus ( pset . db ) ;
}
}
@ -1102,11 +1129,11 @@ SendQuery(const char *query)
if ( PQresultStatus ( results ) ! = PGRES_COMMAND_OK )
if ( PQresultStatus ( results ) ! = PGRES_COMMAND_OK )
{
{
psql_error ( " %s " , PQerrorMessage ( pset . db ) ) ;
psql_error ( " %s " , PQerrorMessage ( pset . db ) ) ;
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
ResetCancelConn ( ) ;
ResetCancelConn ( ) ;
goto sendquery_cleanup ;
goto sendquery_cleanup ;
}
}
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
on_error_rollback_savepoint = true ;
on_error_rollback_savepoint = true ;
}
}
}
}
@ -1202,7 +1229,7 @@ SendQuery(const char *query)
if ( PQresultStatus ( svptres ) ! = PGRES_COMMAND_OK )
if ( PQresultStatus ( svptres ) ! = PGRES_COMMAND_OK )
{
{
psql_error ( " %s " , PQerrorMessage ( pset . db ) ) ;
psql_error ( " %s " , PQerrorMessage ( pset . db ) ) ;
PQclear ( svptres ) ;
ClearOrSaveResult ( svptres ) ;
OK = false ;
OK = false ;
PQclear ( results ) ;
PQclear ( results ) ;
@ -1213,7 +1240,7 @@ SendQuery(const char *query)
}
}
}
}
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
/* Possible microtiming output */
/* Possible microtiming output */
if ( pset . timing )
if ( pset . timing )
@ -1299,7 +1326,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec)
results = PQexec ( pset . db , " BEGIN " ) ;
results = PQexec ( pset . db , " BEGIN " ) ;
OK = AcceptResult ( results ) & &
OK = AcceptResult ( results ) & &
( PQresultStatus ( results ) = = PGRES_COMMAND_OK ) ;
( PQresultStatus ( results ) = = PGRES_COMMAND_OK ) ;
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
if ( ! OK )
if ( ! OK )
return false ;
return false ;
started_txn = true ;
started_txn = true ;
@ -1313,7 +1340,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec)
results = PQexec ( pset . db , buf . data ) ;
results = PQexec ( pset . db , buf . data ) ;
OK = AcceptResult ( results ) & &
OK = AcceptResult ( results ) & &
( PQresultStatus ( results ) = = PGRES_COMMAND_OK ) ;
( PQresultStatus ( results ) = = PGRES_COMMAND_OK ) ;
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
termPQExpBuffer ( & buf ) ;
termPQExpBuffer ( & buf ) ;
if ( ! OK )
if ( ! OK )
goto cleanup ;
goto cleanup ;
@ -1384,7 +1411,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec)
OK = AcceptResult ( results ) ;
OK = AcceptResult ( results ) ;
Assert ( ! OK ) ;
Assert ( ! OK ) ;
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
break ;
break ;
}
}
@ -1392,7 +1419,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec)
{
{
/* StoreQueryTuple will complain if not exactly one row */
/* StoreQueryTuple will complain if not exactly one row */
OK = StoreQueryTuple ( results ) ;
OK = StoreQueryTuple ( results ) ;
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
break ;
break ;
}
}
@ -1415,7 +1442,7 @@ ExecQueryUsingCursor(const char *query, double *elapsed_msec)
printQuery ( results , & my_popt , fout , is_pager , pset . logfile ) ;
printQuery ( results , & my_popt , fout , is_pager , pset . logfile ) ;
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
/* after the first result set, disallow header decoration */
/* after the first result set, disallow header decoration */
my_popt . topt . start_table = false ;
my_popt . topt . start_table = false ;
@ -1473,14 +1500,14 @@ cleanup:
OK = AcceptResult ( results ) & &
OK = AcceptResult ( results ) & &
( PQresultStatus ( results ) = = PGRES_COMMAND_OK ) ;
( PQresultStatus ( results ) = = PGRES_COMMAND_OK ) ;
}
}
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
if ( started_txn )
if ( started_txn )
{
{
results = PQexec ( pset . db , OK ? " COMMIT " : " ROLLBACK " ) ;
results = PQexec ( pset . db , OK ? " COMMIT " : " ROLLBACK " ) ;
OK & = AcceptResult ( results ) & &
OK & = AcceptResult ( results ) & &
( PQresultStatus ( results ) = = PGRES_COMMAND_OK ) ;
( PQresultStatus ( results ) = = PGRES_COMMAND_OK ) ;
PQclear ( results ) ;
ClearOrSaveResult ( results ) ;
}
}
if ( pset . timing )
if ( pset . timing )