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);