diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 80966c3d9c443670ae1aea713752b6c2624f9b91..f41187c0504c38280678e3fb3477acfb0350cea4 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -7,7 +7,7 @@
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.40 1998/04/26 04:06:04 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.41 1998/05/19 18:05:44 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -312,8 +312,8 @@ BootstrapMain(int argc, char *argv[])
 	 */
 
 	/* Set defaults, to be overriden by explicit options below */
-	Quiet = 0;
-	Noversion = 0;
+	Quiet = false;
+	Noversion = false;
 	dbName = NULL;
 	DataDir = getenv("PGDATA"); /* Null if no PGDATA variable */
 
@@ -325,19 +325,19 @@ BootstrapMain(int argc, char *argv[])
 				DataDir = optarg;
 				break;
 			case 'd':
-				DebugMode = 1;	/* print out debugging info while parsing */
+				DebugMode = true;	/* print out debugging info while parsing */
 				break;
 			case 'C':
-				Noversion = 1;
+				Noversion = true;
 				break;
 			case 'F':
-				fsyncOff = 1;
+				fsyncOff = true;
 				break;
 			case 'O':
 				override = true;
 				break;
 			case 'Q':
-				Quiet = 1;
+				Quiet = true;
 				break;
 			case 'P':			/* specify port */
 				portFd = atoi(optarg);
diff --git a/src/backend/executor/execProcnode.c b/src/backend/executor/execProcnode.c
index f5842ecad32445073d833dbacd0aff2d6ea9615c..16309ff6336e371912c8afafc90066ae88118162 100644
--- a/src/backend/executor/execProcnode.c
+++ b/src/backend/executor/execProcnode.c
@@ -11,7 +11,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/executor/execProcnode.c,v 1.9 1998/02/26 04:31:11 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/executor/execProcnode.c,v 1.10 1998/05/19 18:05:45 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -74,6 +74,8 @@
  */
 #include "postgres.h"
 
+#include "miscadmin.h"
+#include "tcop/tcopprot.h"
 #include "executor/executor.h"
 #include "executor/nodeResult.h"
 #include "executor/nodeAppend.h"
@@ -233,6 +235,10 @@ ExecProcNode(Plan *node, Plan *parent)
 	 *	deal with NULL nodes..
 	 * ----------------
 	 */
+
+	if (QueryCancel)
+		CancelQuery();
+
 	if (node == NULL)
 		return NULL;
 
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c
index 41280c8bbc4ccd806d49f5642266b2fa9a246a7a..aa07c12279c0386b6f8143731e2c51b426550e64 100644
--- a/src/backend/libpq/pqcomm.c
+++ b/src/backend/libpq/pqcomm.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.40 1998/03/02 05:41:53 scrappy Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.41 1998/05/19 18:05:46 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -409,18 +409,15 @@ pq_sendoob(char *msg, int len)
 {
 	int			fd = fileno(Pfout);
 
-	return (send(fd, msg, len, MSG_OOB));
+	return send(fd, msg, len, MSG_OOB);
 }
 
 int
-pq_recvoob(char *msgPtr, int *lenPtr)
+pq_recvoob(char *msgPtr, int len)
 {
 	int			fd = fileno(Pfout);
-	int			len = 0;
 
-	len = recv(fd, msgPtr + len, *lenPtr, MSG_OOB);
-	*lenPtr = len;
-	return (len);
+	return recv(fd, msgPtr, len, MSG_OOB);
 }
 
 /* --------------------------------
@@ -523,7 +520,7 @@ pq_async_notify()
 	/* int len = sizeof(msg); */
 	int			len = 20;
 
-	if (pq_recvoob(msg, &len) >= 0)
+	if (pq_recvoob(msg, len) >= 0)
 	{
 		/* debugging */
 		printf("received notification: %s\n", msg);
diff --git a/src/backend/tcop/dest.c b/src/backend/tcop/dest.c
index 4340cac5bc1304ac70ac26e8514d77938c3e38c6..3f21bc481a292b17ebeabb209ed06da13e9936a0 100644
--- a/src/backend/tcop/dest.c
+++ b/src/backend/tcop/dest.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.19 1998/05/14 17:18:13 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/dest.c,v 1.20 1998/05/19 18:05:47 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -288,7 +288,8 @@ BeginCommand(char *pname,
 														 * oops.. */
 					pq_putint((int) attrs[i]->atttypid, sizeof(attrs[i]->atttypid));
 					pq_putint(attrs[i]->attlen, sizeof(attrs[i]->attlen));
-					pq_putint(attrs[i]->atttypmod, sizeof(attrs[i]->atttypmod));
+					if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 2)
+						pq_putint(attrs[i]->atttypmod, sizeof(attrs[i]->atttypmod));
 				}
 			}
 			break;
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 87e1bf9fe562f590d360e8d45738ba4a933f9e3c..991025e7444ba8713e0614d8673340b1c5cba81b 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.68 1998/05/06 23:50:19 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.69 1998/05/19 18:05:48 momjian Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -119,7 +119,7 @@ jmp_buf		Warn_restart;
 sigjmp_buf	Warn_restart;
 
 #endif							/* defined(nextstep) */
-int			InError;
+bool			InError;
 
 extern int	NBuffers;
 
@@ -618,6 +618,9 @@ pg_exec_query_dest(char *query_string,	/* string to execute */
 	/* plan the queries */
 	plan_list = pg_parse_and_plan(query_string, typev, nargs, &querytree_list, dest);
 
+	if (QueryCancel)
+		CancelQuery();
+		
 	/* pg_parse_and_plan could have failed */
 	if (querytree_list == NULL)
 		return;
@@ -776,6 +779,26 @@ FloatExceptionHandler(SIGNAL_ARGS)
 }
 
 
+/* signal handler for query cancel */
+static void
+QueryCancelHandler(SIGNAL_ARGS)
+{
+	QueryCancel = true;
+}
+
+void
+CancelQuery(void)
+{
+	char dummy;
+
+	/* throw it away */
+	while (pq_recvoob(&dummy, 1) > 0)
+		;
+	/* QueryCancel reset in longjump after elog() call */
+	elog(ERROR, "Query was cancelled.");
+}
+
+
 static void
 usage(char *progname)
 {
@@ -819,11 +842,11 @@ usage(char *progname)
 int
 PostgresMain(int argc, char *argv[])
 {
-	int			flagC;
-	int			flagQ;
-	int			flagE;
-	int			flagEu;
-	int			flag;
+	bool			flagC = false,
+					flagQ = false,
+					flagE = false,
+					flagEu = false;
+	int				flag;
 
 	char	   *DBName = NULL;
 	int			errs = 0;
@@ -865,7 +888,7 @@ PostgresMain(int argc, char *argv[])
 	/*
 	 * Set default values.
 	 */
-	flagC = flagQ = flagE = flagEu = ShowStats = 0;
+	ShowStats = 0;
 	ShowParserStats = ShowPlannerStats = ShowExecutorStats = 0;
 #ifdef LOCK_MGR_DEBUG
 	lockDebug = 0;
@@ -928,14 +951,14 @@ PostgresMain(int argc, char *argv[])
 				 *	don't print version string (don't know why this is 'C' --mao)
 				 * ----------------
 				 */
-				flagC = 1;
+				flagC = true;
 				break;
 
 			case 'D':			/* PGDATA directory */
 				DataDir = optarg;
 
 			case 'd':			/* debug level */
-				flagQ = 0;
+				flagQ = false;
 				DebugLvl = (short) atoi(optarg);
 				if (DebugLvl > 1)
 					DebugPrintQuery = true;
@@ -952,7 +975,7 @@ PostgresMain(int argc, char *argv[])
 				 *	E - echo the query the user entered
 				 * ----------------
 				 */
-				flagE = 1;
+				flagE = true;
 				break;
 
 			case 'e':
@@ -960,7 +983,7 @@ PostgresMain(int argc, char *argv[])
 				 * Use european date formats.
 				 * --------------------------
 				 */
-				flagEu = 1;
+				flagEu = true;
 				break;
 
 			case 'F':
@@ -1064,7 +1087,7 @@ PostgresMain(int argc, char *argv[])
 				 *	Q - set Quiet mode (reduce debugging output)
 				 * ----------------
 				 */
-				flagQ = 1;
+				flagQ = true;
 				break;
 
 			case 'S':
@@ -1252,6 +1275,7 @@ PostgresMain(int argc, char *argv[])
 		}
 		pq_init(Portfd);
 		whereToSendOutput = Remote;
+		pq_regoob(QueryCancelHandler); /* we do it here so the backend it connected */	
 	}
 	else
 		whereToSendOutput = Debug;
@@ -1282,7 +1306,7 @@ PostgresMain(int argc, char *argv[])
 
 	if (sigsetjmp(Warn_restart, 1) != 0)
 	{
-		InError = 1;
+		InError = true;
 
 		time(&tim);
 
@@ -1292,8 +1316,10 @@ PostgresMain(int argc, char *argv[])
 		MemSet(parser_input, 0, MAX_PARSE_BUFFER);
 
 		AbortCurrentTransaction();
+
 	}
-	InError = 0;
+
+	InError = false;
 
 	/* ----------------
 	 *	POSTGRES main processing loop begins here
@@ -1302,7 +1328,7 @@ PostgresMain(int argc, char *argv[])
 	if (IsUnderPostmaster == false)
 	{
 		puts("\nPOSTGRES backend interactive interface");
-		puts("$Revision: 1.68 $ $Date: 1998/05/06 23:50:19 $");
+		puts("$Revision: 1.69 $ $Date: 1998/05/19 18:05:48 $");
 	}
 
 	/* ----------------
@@ -1329,6 +1355,9 @@ PostgresMain(int argc, char *argv[])
 		MemSet(parser_input, 0, MAX_PARSE_BUFFER);
 
 		firstchar = ReadCommand(parser_input);
+
+		QueryCancel = false;
+
 		/* process the command */
 		switch (firstchar)
 		{
diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c
index 63fd69b10afda1b7968e200a4b03032265ccd432..fdbae14e99b4061c9fd82ee3b955b68ca6c4ac43 100644
--- a/src/backend/utils/error/elog.c
+++ b/src/backend/utils/error/elog.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.27 1998/02/26 04:37:34 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/error/elog.c,v 1.28 1998/05/19 18:05:50 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -175,7 +175,7 @@ elog(int lev, const char *fmt,...)
 
 	if (lev == ERROR)
 	{
-		extern int	InError;
+		extern bool	InError;
 
 		ProcReleaseSpins(NULL); /* get rid of spinlocks we hold */
 		if (!InError)
diff --git a/src/backend/utils/init/globals.c b/src/backend/utils/init/globals.c
index 55ec93cc75d642db35c41f02332ed5db83775951..f58a75ec8570fe3dec7046a35247fa712b5685b9 100644
--- a/src/backend/utils/init/globals.c
+++ b/src/backend/utils/init/globals.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/utils/init/globals.c,v 1.21 1998/02/26 04:37:56 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/utils/init/globals.c,v 1.22 1998/05/19 18:05:51 momjian Exp $
  *
  * NOTES
  *	  Globals used all over the place should be declared here and not
@@ -37,8 +37,10 @@
 
 ProtocolVersion FrontendProtocol = PG_PROTOCOL_LATEST;
 int			Portfd = -1;
-int			Noversion = 0;
-int			Quiet = 1;
+
+bool		Noversion = false;
+bool		Quiet = false;
+bool		QueryCancel = false;
 
 int			MyProcPid;
 
diff --git a/src/include/libpq/libpq.h b/src/include/libpq/libpq.h
index 0893b646fb1dd2e321f7d8717b9c3f15fc72eb58..6768626f988a615d829585e7bacf6d249d224669 100644
--- a/src/include/libpq/libpq.h
+++ b/src/include/libpq/libpq.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq.h,v 1.13 1998/03/02 05:42:06 scrappy Exp $
+ * $Id: libpq.h,v 1.14 1998/05/19 18:05:55 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -269,7 +269,7 @@ extern void pq_putstr(char *s);
 extern void pq_putnchar(char *s, int n);
 extern void pq_putint(int i, int b);
 extern int	pq_sendoob(char *msg, int len);
-extern int	pq_recvoob(char *msgPtr, int *lenPtr);
+extern int	pq_recvoob(char *msgPtr, int len);
 extern int	pq_getinaddr(struct sockaddr_in * sin, char *host, int port);
 extern int	pq_getinserv(struct sockaddr_in * sin, char *host, char *serv);
 extern int
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h
index f2b26d3bd1b0f63a26071be286853cc2afa14806..f5da6e628ab7501197ea7cee1db0eba19f1535fb 100644
--- a/src/include/miscadmin.h
+++ b/src/include/miscadmin.h
@@ -11,7 +11,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: miscadmin.h,v 1.22 1998/04/05 21:04:50 momjian Exp $
+ * $Id: miscadmin.h,v 1.23 1998/05/19 18:05:52 momjian Exp $
  *
  * NOTES
  *	  some of the information in this file will be moved to
@@ -35,8 +35,9 @@ extern int	PostmasterMain(int argc, char *argv[]);
  * from utils/init/globals.c
  */
 extern int	Portfd;
-extern int	Noversion;
-extern int	Quiet;
+extern bool	Noversion;
+extern bool	Quiet;
+extern bool	QueryCancel;
 extern char *DataDir;
 
 extern int	MyProcPid;
diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h
index 0e2706f05da9051ac456625d6fb2a383a89e2f08..dbd9fdba740bafa9bbdaee02eeee6a00affa28f7 100644
--- a/src/include/tcop/tcopprot.h
+++ b/src/include/tcop/tcopprot.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: tcopprot.h,v 1.11 1998/02/26 04:43:41 momjian Exp $
+ * $Id: tcopprot.h,v 1.12 1998/05/19 18:05:58 momjian Exp $
  *
  * OLD COMMENTS
  *	  This file was created so that other c files could get the two
@@ -34,6 +34,7 @@ pg_exec_query_dest(char *query_string, char **argv, Oid *typev,
 
 extern void handle_warn(SIGNAL_ARGS);
 extern void die(SIGNAL_ARGS);
+extern void CancelQuery(void);
 extern int	PostgresMain(int argc, char *argv[]);
 extern void ResetUsage(void);
 extern void ShowUsage(void);