aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>1996-11-20 22:35:19 +0000
committerBruce Momjian <bruce@momjian.us>1996-11-20 22:35:19 +0000
commit8299e75577645e420745ea48276b6e8e4ceeb138 (patch)
treea55bac7c91f6de05dc7ed5e5d9463b1d66f4ca20
parent6399c74f1742b8f639633b1ba9c4f2bbea9f06c3 (diff)
downloadpostgresql-8299e75577645e420745ea48276b6e8e4ceeb138.tar.gz
postgresql-8299e75577645e420745ea48276b6e8e4ceeb138.zip
following is a little fix for libpq.
PQexec handles the possibility of multiple results from one query by simply submitting an empty query after the first result and waiting for an 'I' message. Rules can generate errors with transaction abort after the first 'C' message was recieved (e.g. if a C-language function used in a rule calls elog(WARN, ...)). Thus we have to look for. Jan(wieck@sapserv.debis.de)
-rw-r--r--src/interfaces/libpq/fe-exec.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
index 07bed1c942b..c5668637f5f 100644
--- a/src/interfaces/libpq/fe-exec.c
+++ b/src/interfaces/libpq/fe-exec.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.18 1996/09/16 05:50:46 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.19 1996/11/20 22:35:19 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -363,7 +363,7 @@ PGresult*
PQexec(PGconn* conn, const char* query)
{
PGresult *result;
- int id, clear;
+ int id, clear, error;
char buffer[MAX_MESSAGE_LEN];
char cmdStatus[MAX_MESSAGE_LEN];
char pname[MAX_MESSAGE_LEN]; /* portal name */
@@ -459,6 +459,7 @@ PQexec(PGconn* conn, const char* query)
// until an 'I' is received.
*/
clear = 0;
+ error = 0;
pqPuts("Q ",pfout,pfdebug); /* send an empty query */
#ifdef PQ_NOTIFY_PATCH
@@ -472,8 +473,19 @@ PQexec(PGconn* conn, const char* query)
{
if (pqGets(buffer,ERROR_MSG_LENGTH,pfin,pfdebug) == 1)
clear = 1;
+ /*
+ // Rules can create error messages while we are waiting
+ // for the 'I'.
+ */
+ if (buffer[0] == 'E') {
+ strcpy(conn->errorMessage, &buffer[1]);
+ error++;
+ }
clear = (buffer[0] == 'I');
}
+ if (error) {
+ return (PGresult*)NULL;
+ }
result = makeEmptyPGresult(conn,PGRES_COMMAND_OK);
strncpy(result->cmdStatus,cmdStatus, CMDSTATUS_LEN-1);
return result;