aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1996-09-16 05:50:46 +0000
committerMarc G. Fournier <scrappy@hub.org>1996-09-16 05:50:46 +0000
commitbbebcb125e4f0593608bc4d9419ffc7933da147c (patch)
tree4683ac0d4ddbcfdf91b316e6cf5af70fe791b172 /src
parente3b41d40fae87d1e47c6157d42a588627c2dbfb0 (diff)
downloadpostgresql-bbebcb125e4f0593608bc4d9419ffc7933da147c.tar.gz
postgresql-bbebcb125e4f0593608bc4d9419ffc7933da147c.zip
Fixes:
Async notifies received while a backend is in the middle of a begin/end transaction block are lost by libpq when the final end command is issued. The bug is in the routine PQexec of libpq. The routine throws away any message from the backend when a message of type 'C' is received. This type of message is sent when the result of a portal query command with no tuples is returned. Unfortunately this is the case of the end command. As all async notification are sent only when the transaction is finished, if they are received in the middle of a transaction they are lost in the libpq library. I added some tracing code to PQexec and this is the output: Submitted by: Massimo Dal Zotto <dz@cs.unitn.it>
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/libpq/fe-exec.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c
index a1e0bee2402..07bed1c942b 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.17 1996/08/14 16:44:51 scrappy Exp $
+ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-exec.c,v 1.18 1996/09/16 05:50:46 scrappy Exp $
*
*-------------------------------------------------------------------------
*/
@@ -370,6 +370,10 @@ PQexec(PGconn* conn, const char* query)
PGnotify *newNotify;
FILE *pfin, *pfout, *pfdebug;
+#ifdef PQ_NOTIFY_PATCH
+ int isCommand = 0; /* DZ - 31-8-1996 */
+#endif
+
pname[0]='\0';
if (!conn) return NULL;
@@ -457,6 +461,13 @@ PQexec(PGconn* conn, const char* query)
clear = 0;
pqPuts("Q ",pfout,pfdebug); /* send an empty query */
+#ifdef PQ_NOTIFY_PATCH
+ /*
+ * Set a flag and process messages in the usual way because
+ * there may be async notifications pending. DZ - 31-8-1996
+ */
+ isCommand = 1;
+#else
while (!clear)
{
if (pqGets(buffer,ERROR_MSG_LENGTH,pfin,pfdebug) == 1)
@@ -466,6 +477,7 @@ PQexec(PGconn* conn, const char* query)
result = makeEmptyPGresult(conn,PGRES_COMMAND_OK);
strncpy(result->cmdStatus,cmdStatus, CMDSTATUS_LEN-1);
return result;
+#endif
}
break;
case 'E': /* error return */
@@ -482,6 +494,17 @@ PQexec(PGconn* conn, const char* query)
if ((c = pqGetc(pfin,pfdebug)) != '\0') {
fprintf(stderr,"error!, unexpected character %c following 'I'\n", c);
}
+#ifdef PQ_NOTIFY_PATCH
+ if (isCommand) {
+ /*
+ * If this is the result of a portal query command set the
+ * command status and message accordingly. DZ - 31-8-1996
+ */
+ result = makeEmptyPGresult(conn,PGRES_COMMAND_OK);
+ strncpy(result->cmdStatus,cmdStatus, CMDSTATUS_LEN-1);
+ return result;
+ }
+#endif
result = makeEmptyPGresult(conn, PGRES_EMPTY_QUERY);
return result;
}