1 /*-------------------------------------------------------------------------
4 * POSTGRES C Backend Interface
6 * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.258 2002/03/21 16:01:25 tgl Exp $
14 * this is the "main" module of the postgres backend and
15 * hence the main module of the "traffic cop".
17 *-------------------------------------------------------------------------
26 #include <sys/types.h>
28 #include <sys/socket.h>
31 #include <sys/select.h>
37 #include "access/xlog.h"
38 #include "commands/async.h"
39 #include "commands/trigger.h"
40 #include "commands/variable.h"
41 #include "libpq/libpq.h"
42 #include "libpq/pqformat.h"
43 #include "libpq/pqsignal.h"
44 #include "miscadmin.h"
45 #include "nodes/print.h"
46 #include "optimizer/cost.h"
47 #include "optimizer/planner.h"
48 #include "parser/analyze.h"
49 #include "parser/parse.h"
50 #include "parser/parser.h"
51 #include "rewrite/rewriteHandler.h"
52 #include "tcop/fastpath.h"
53 #include "tcop/pquery.h"
54 #include "tcop/tcopprot.h"
55 #include "tcop/utility.h"
56 #include "storage/proc.h"
57 #include "utils/exc.h"
58 #include "utils/guc.h"
59 #include "utils/memutils.h"
60 #include "utils/ps_status.h"
62 #include "mb/pg_wchar.h"
76 char *debug_query_string; /* used by pgmonitor */
78 /* Note: whereToSendOutput is initialized for the bootstrap/standalone case */
79 CommandDest whereToSendOutput = Debug;
81 static bool dontExecute = false;
83 /* note: these declarations had better match tcopprot.h */
84 sigjmp_buf Warn_restart;
86 bool Warn_restart_ready = false;
89 static bool EchoQuery = false; /* default don't echo */
92 * Flag to mark SIGHUP. Whenever the main loop comes around it
93 * will reread the configuration file. (Better than doing the
94 * reading in the signal handler, ey?)
96 static volatile bool got_SIGHUP = false;
99 * people who want to use EOF should #define DONTUSENEWLINE in
103 #ifndef TCOP_DONTUSENEWLINE
104 int UseNewLine = 1; /* Use newlines query delimiters (the
108 int UseNewLine = 0; /* Use EOF as query delimiters */
109 #endif /* TCOP_DONTUSENEWLINE */
112 ** Flags for expensive function optimization -- JMH 3/9/92
116 /* ----------------------------------------------------------------
117 * decls for routines only used in this file
118 * ----------------------------------------------------------------
120 static int InteractiveBackend(StringInfo inBuf);
121 static int SocketBackend(StringInfo inBuf);
122 static int ReadCommand(StringInfo inBuf);
123 static List *pg_parse_query(char *query_string, Oid *typev, int nargs);
124 static List *pg_analyze_and_rewrite(Node *parsetree);
125 static void start_xact_command(void);
126 static void finish_xact_command(void);
127 static void SigHupHandler(SIGNAL_ARGS);
128 static void FloatExceptionHandler(SIGNAL_ARGS);
129 static const char *CreateCommandTag(Node *parsetree);
132 /* ----------------------------------------------------------------
133 * routines to obtain user input
134 * ----------------------------------------------------------------
138 * InteractiveBackend() is called for user interactive connections
139 * the string entered by the user is placed in its parameter inBuf.
141 * EOF is returned if end-of-file input is seen; time to shut down.
146 InteractiveBackend(StringInfo inBuf)
148 int c; /* character read from getc() */
149 bool end = false; /* end-of-input flag */
150 bool backslashSeen = false; /* have we seen a \ ? */
153 * display a prompt and obtain input from the user
158 /* Reset inBuf to empty */
160 inBuf->data[0] = '\0';
167 * if we are using \n as a delimiter, then read characters
170 while ((c = getc(stdin)) != EOF)
176 /* discard backslash from inBuf */
177 inBuf->data[--inBuf->len] = '\0';
178 backslashSeen = false;
183 /* keep the newline character */
184 appendStringInfoChar(inBuf, '\n');
189 backslashSeen = true;
191 backslashSeen = false;
193 appendStringInfoChar(inBuf, (char) c);
202 * otherwise read characters until EOF.
204 while ((c = getc(stdin)) != EOF)
205 appendStringInfoChar(inBuf, (char) c);
215 * otherwise we have a user query so process it.
221 * if the query echo flag was given, print the query..
224 printf("query: %s\n", inBuf->data);
231 * SocketBackend() Is called for frontend-backend connections
233 * If the input is a query (case 'Q') then the string entered by
234 * the user is placed in its parameter inBuf.
236 * If the input is a fastpath function call (case 'F') then
237 * the function call is processed in HandleFunctionRequest()
238 * (now called from PostgresMain()).
240 * EOF is returned if the connection is lost.
245 SocketBackend(StringInfo inBuf)
250 * get input from the frontend
252 qtype = pq_getbyte();
257 /* frontend disconnected */
261 * 'Q': user entered a query
264 if (pq_getstr(inBuf))
269 * 'F': calling user/system functions
272 if (pq_getstr(inBuf))
273 return EOF; /* ignore "string" at start of F message */
277 * 'X': frontend is exiting
283 * otherwise we got garbage from the frontend.
285 * XXX are we certain that we want to do an elog(FATAL) here?
289 elog(FATAL, "Socket command type %c unknown", qtype);
297 * ReadCommand reads a command from either the frontend or
298 * standard input, places it in inBuf, and returns a char
299 * representing whether the string is a 'Q'uery or a 'F'astpath
300 * call. EOF is returned if end of file.
304 ReadCommand(StringInfo inBuf)
308 if (IsUnderPostmaster)
309 result = SocketBackend(inBuf);
311 result = InteractiveBackend(inBuf);
317 * Parse a query string and pass it through the rewriter.
319 * A list of Query nodes is returned, since the string might contain
320 * multiple queries and/or the rewriter might expand one query to several.
322 * NOTE: this routine is no longer used for processing interactive queries,
323 * but it is still needed for parsing of SQL function bodies.
326 pg_parse_and_rewrite(char *query_string, /* string to execute */
327 Oid *typev, /* parameter types */
328 int nargs) /* number of parameters */
330 List *raw_parsetree_list;
331 List *querytree_list;
335 * (1) parse the request string into a list of raw parse trees.
337 raw_parsetree_list = pg_parse_query(query_string, typev, nargs);
340 * (2) Do parse analysis and rule rewrite.
342 querytree_list = NIL;
343 foreach(list_item, raw_parsetree_list)
345 Node *parsetree = (Node *) lfirst(list_item);
347 querytree_list = nconc(querytree_list,
348 pg_analyze_and_rewrite(parsetree));
351 return querytree_list;
355 * Do raw parsing (only).
357 * A list of parsetrees is returned, since there might be multiple
358 * commands in the given string.
360 * NOTE: for interactive queries, it is important to keep this routine
361 * separate from the analysis & rewrite stages. Analysis and rewriting
362 * cannot be done in an aborted transaction, since they require access to
363 * database tables. So, we rely on the raw parser to determine whether
364 * we've seen a COMMIT or ABORT command; when we are in abort state, other
365 * commands are not processed any further than the raw parse stage.
368 pg_parse_query(char *query_string, Oid *typev, int nargs)
370 List *raw_parsetree_list;
372 if (Debug_print_query)
373 elog(LOG, "query: %s", query_string);
375 if (Show_parser_stats)
378 raw_parsetree_list = parser(query_string, typev, nargs);
380 if (Show_parser_stats)
381 ShowUsage("PARSER STATISTICS");
383 return raw_parsetree_list;
387 * Given a raw parsetree (gram.y output), perform parse analysis and
390 * A list of Query nodes is returned, since either the analyzer or the
391 * rewriter might expand one query to several.
393 * NOTE: for reasons mentioned above, this must be separate from raw parsing.
396 pg_analyze_and_rewrite(Node *parsetree)
398 List *querytree_list;
404 * (1) Perform parse analysis.
406 if (Show_parser_stats)
409 querytree_list = parse_analyze(parsetree, NULL);
411 if (Show_parser_stats)
413 ShowUsage("PARSE ANALYSIS STATISTICS");
418 * (2) Rewrite the queries, as necessary
420 * rewritten queries are collected in new_list. Note there may be more
421 * or fewer than in the original list.
424 foreach(list_item, querytree_list)
426 querytree = (Query *) lfirst(list_item);
428 if (Debug_print_parse)
430 if (Debug_pretty_print)
432 elog(LOG, "parse tree:");
433 nodeDisplay(querytree);
436 elog(LOG, "parse tree: %s", nodeToString(querytree));
439 if (querytree->commandType == CMD_UTILITY)
441 /* don't rewrite utilities, just dump 'em into new_list */
442 new_list = lappend(new_list, querytree);
446 /* rewrite regular queries */
447 List *rewritten = QueryRewrite(querytree);
449 new_list = nconc(new_list, rewritten);
453 querytree_list = new_list;
455 if (Show_parser_stats)
456 ShowUsage("REWRITER STATISTICS");
458 #ifdef COPY_PARSE_PLAN_TREES
461 * Optional debugging check: pass querytree output through
464 new_list = (List *) copyObject(querytree_list);
465 /* This checks both copyObject() and the equal() routines... */
466 if (!equal(new_list, querytree_list))
467 elog(WARNING, "pg_analyze_and_rewrite: copyObject failed on parse tree");
469 querytree_list = new_list;
472 if (Debug_print_rewritten)
474 if (Debug_pretty_print)
476 elog(LOG, "rewritten parse tree:");
477 foreach(list_item, querytree_list)
479 querytree = (Query *) lfirst(list_item);
480 nodeDisplay(querytree);
486 elog(LOG, "rewritten parse tree:");
487 foreach(list_item, querytree_list)
489 querytree = (Query *) lfirst(list_item);
490 elog(LOG, "%s", nodeToString(querytree));
495 return querytree_list;
499 /* Generate a plan for a single query. */
501 pg_plan_query(Query *querytree)
505 /* Utility commands have no plans. */
506 if (querytree->commandType == CMD_UTILITY)
509 if (Show_planner_stats)
512 /* call that optimizer */
513 plan = planner(querytree);
515 if (Show_planner_stats)
516 ShowUsage("PLANNER STATISTICS");
518 #ifdef COPY_PARSE_PLAN_TREES
519 /* Optional debugging check: pass plan output through copyObject() */
521 Plan *new_plan = (Plan *) copyObject(plan);
524 * equal() currently does not have routines to compare Plan nodes,
525 * so don't try to test equality here. Perhaps fix someday?
528 /* This checks both copyObject() and the equal() routines... */
529 if (!equal(new_plan, plan))
530 elog(WARNING, "pg_plan_query: copyObject failed on plan tree");
538 * Print plan if debugging.
540 if (Debug_print_plan)
542 if (Debug_pretty_print)
548 elog(LOG, "plan: %s", nodeToString(plan));
555 /* ----------------------------------------------------------------
556 * pg_exec_query_string()
558 * Takes a querystring, runs the parser/utilities or
559 * parser/planner/executor over it as necessary.
563 * At call, we are not inside a transaction command.
565 * The CurrentMemoryContext after starting a transaction command must be
566 * appropriate for execution of individual queries (typically this will be
567 * TransactionCommandContext). Note that this routine resets that context
568 * after each individual query, so don't store anything there that
569 * must outlive the call!
571 * parse_context references a context suitable for holding the
572 * parse/rewrite trees (typically this will be QueryContext).
573 * This context *must* be longer-lived than the transaction context!
574 * In fact, if the query string might contain BEGIN/COMMIT commands,
575 * parse_context had better outlive TopTransactionContext!
577 * We could have hard-wired knowledge about QueryContext and
578 * TransactionCommandContext into this routine, but it seems better
579 * not to, in case callers from outside this module need to use some
582 * ----------------------------------------------------------------
586 pg_exec_query_string(char *query_string, /* string to execute */
587 CommandDest dest, /* where results should go */
588 MemoryContext parse_context) /* context for
592 MemoryContext oldcontext;
593 List *parsetree_list,
596 debug_query_string = query_string; /* used by pgmonitor */
599 * Start up a transaction command. All queries generated by the
600 * query_string will be in this same command block, *unless* we find a
601 * BEGIN/COMMIT/ABORT statement; we have to force a new xact command
602 * after one of those, else bad things will happen in xact.c. (Note
603 * that this will possibly change current memory context.)
605 start_xact_command();
609 * parse_context *must* be different from the execution memory
610 * context, else the context reset at the bottom of the loop will
611 * destroy the parsetree list. (We really ought to check that
612 * parse_context isn't a child of CurrentMemoryContext either, but
613 * that would take more cycles than it's likely to be worth.)
615 Assert(parse_context != CurrentMemoryContext);
618 * Switch to appropriate context for constructing parsetrees.
620 oldcontext = MemoryContextSwitchTo(parse_context);
623 * Do basic parsing of the query or queries (this should be safe even
624 * if we are in aborted transaction state!)
626 parsetree_list = pg_parse_query(query_string, NULL, 0);
629 * Switch back to execution context to enter the loop.
631 MemoryContextSwitchTo(oldcontext);
634 * Run through the parsetree(s) and process each one.
636 foreach(parsetree_item, parsetree_list)
638 Node *parsetree = (Node *) lfirst(parsetree_item);
639 bool isTransactionStmt;
640 const char *commandTag;
641 char completionTag[COMPLETION_TAG_BUFSIZE];
642 List *querytree_list,
645 /* Transaction control statements need some special handling */
646 isTransactionStmt = IsA(parsetree, TransactionStmt);
649 * First we set the command-completion tag to the main query
650 * (as opposed to each of the others that may be generated by
651 * analyze and rewrite). Also set ps_status and do any special
652 * start-of-SQL-command processing needed by the destination.
654 commandTag = CreateCommandTag(parsetree);
656 set_ps_display(commandTag);
658 BeginCommand(commandTag, dest);
661 * If we are in an aborted transaction, ignore all commands except
662 * COMMIT/ABORT. It is important that this test occur before we
663 * try to do parse analysis, rewrite, or planning, since all those
664 * phases try to do database accesses, which may fail in abort
665 * state. (It might be safe to allow some additional utility
666 * commands in this state, but not many...)
668 if (IsAbortedTransactionBlockState())
670 bool allowit = false;
672 if (isTransactionStmt)
674 TransactionStmt *stmt = (TransactionStmt *) parsetree;
676 switch (stmt->command)
689 elog(WARNING, "current transaction is aborted, "
690 "queries ignored until end of transaction block");
693 * We need to emit a command-complete report to the client,
694 * even though we didn't process the query.
697 commandTag = "*ABORT STATE*";
699 EndCommand(commandTag, dest);
702 * We continue in the loop, on the off chance that there
703 * is a COMMIT or ROLLBACK utility command later in the
710 /* Make sure we are in a transaction command */
713 start_xact_command();
717 /* If we got a cancel signal in parsing or prior command, quit */
718 CHECK_FOR_INTERRUPTS();
721 * OK to analyze and rewrite this query.
723 * Switch to appropriate context for constructing querytrees (again,
724 * these must outlive the execution context).
726 oldcontext = MemoryContextSwitchTo(parse_context);
728 querytree_list = pg_analyze_and_rewrite(parsetree);
731 * Switch back to execution context for planning and execution.
733 MemoryContextSwitchTo(oldcontext);
736 * Inner loop handles the individual queries generated from a
737 * single parsetree by analysis and rewrite.
739 foreach(querytree_item, querytree_list)
741 Query *querytree = (Query *) lfirst(querytree_item);
743 /* Make sure we are in a transaction command */
746 start_xact_command();
751 * If we got a cancel signal in analysis or prior command,
754 CHECK_FOR_INTERRUPTS();
756 if (querytree->commandType == CMD_UTILITY)
759 * process utility functions (create, destroy, etc..)
761 if (Debug_print_query)
762 elog(LOG, "ProcessUtility: %s", query_string);
763 else elog(DEBUG2, "ProcessUtility");
765 if (querytree->originalQuery)
767 /* utility statement can override default tag string */
768 ProcessUtility(querytree->utilityStmt, dest,
770 if (completionTag[0])
771 commandTag = completionTag;
775 /* utility added by rewrite cannot override tag */
776 ProcessUtility(querytree->utilityStmt, dest, NULL);
782 * process a plannable query.
786 plan = pg_plan_query(querytree);
788 /* if we got a cancel signal whilst planning, quit */
789 CHECK_FOR_INTERRUPTS();
791 /* Initialize snapshot state for query */
797 if (Show_executor_stats)
802 /* don't execute it, just show the query plan */
803 print_plan(plan, querytree);
807 elog(DEBUG2, "ProcessQuery");
809 if (querytree->originalQuery)
811 /* original stmt can override default tag string */
812 ProcessQuery(querytree, plan, dest, completionTag);
813 commandTag = completionTag;
817 /* stmt added by rewrite cannot override tag */
818 ProcessQuery(querytree, plan, dest, NULL);
822 if (Show_executor_stats)
823 ShowUsage("EXECUTOR STATISTICS");
827 * In a query block, we want to increment the command counter
828 * between queries so that the effects of early queries are
829 * visible to subsequent ones. In particular we'd better do
830 * so before checking constraints.
832 if (!isTransactionStmt)
833 CommandCounterIncrement();
836 * Clear the execution context to recover temporary memory
837 * used by the query. NOTE: if query string contains
838 * BEGIN/COMMIT transaction commands, execution context may
839 * now be different from what we were originally passed; so be
840 * careful to clear current context not "oldcontext".
842 Assert(parse_context != CurrentMemoryContext);
844 MemoryContextResetAndDeleteChildren(CurrentMemoryContext);
847 * If this was a transaction control statement, commit it and
848 * arrange to start a new xact command for the next command
851 if (isTransactionStmt)
853 finish_xact_command();
854 xact_started = false;
857 } /* end loop over queries generated from a
861 * If this is the last parsetree of the query string, close down
862 * transaction statement before reporting command-complete. This is
863 * so that any end-of-transaction errors are reported before the
864 * command-complete message is issued, to avoid confusing clients
865 * who will expect either a command-complete message or an error,
866 * not one and then the other. But for compatibility with
867 * historical Postgres behavior, we do not force a transaction
868 * boundary between queries appearing in a single query string.
870 if (lnext(parsetree_item) == NIL && xact_started)
872 finish_xact_command();
873 xact_started = false;
877 * It is possible that the original query was removed due to
878 * a DO INSTEAD rewrite rule. In that case we will still have
879 * the default completion tag, which is fine for most purposes,
880 * but it may confuse clients if it's INSERT/UPDATE/DELETE.
881 * Clients expect those tags to have counts after them (cf.
884 if (strcmp(commandTag, "INSERT") == 0)
885 commandTag = "INSERT 0 0";
886 else if (strcmp(commandTag, "UPDATE") == 0)
887 commandTag = "UPDATE 0";
888 else if (strcmp(commandTag, "DELETE") == 0)
889 commandTag = "DELETE 0";
892 * Tell client that we're done with this query. Note we emit
893 * exactly one EndCommand report for each raw parsetree, thus
894 * one for each SQL command the client sent, regardless of
895 * rewriting. (But a command aborted by error will not send
896 * an EndCommand report at all.)
898 EndCommand(commandTag, dest);
899 } /* end loop over parsetrees */
902 * Close down transaction statement, if one is open.
903 * (Note that this will only happen if the querystring was empty.)
906 finish_xact_command();
908 debug_query_string = NULL; /* used by pgmonitor */
912 * Convenience routines for starting/committing a single command.
915 start_xact_command(void)
917 elog(DEBUG1, "StartTransactionCommand");
918 StartTransactionCommand();
922 finish_xact_command(void)
924 /* Invoke IMMEDIATE constraint triggers */
925 DeferredTriggerEndQuery();
927 /* Now commit the command */
928 elog(DEBUG1, "CommitTransactionCommand");
930 CommitTransactionCommand();
932 #ifdef SHOW_MEMORY_STATS
933 /* Print mem stats at each commit for leak tracking */
935 MemoryContextStats(TopMemoryContext);
940 /* --------------------------------
941 * signal handler routines used in PostgresMain()
942 * --------------------------------
946 * quickdie() occurs when signalled SIGQUIT by the postmaster.
948 * Some backend has bought the farm,
949 * so we need to stop what we're doing and exit.
952 quickdie(SIGNAL_ARGS)
954 PG_SETMASK(&BlockSig);
955 elog(WARNING, "Message from PostgreSQL backend:"
956 "\n\tThe Postmaster has informed me that some other backend"
957 "\n\tdied abnormally and possibly corrupted shared memory."
958 "\n\tI have rolled back the current transaction and am"
959 "\n\tgoing to terminate your database system connection and exit."
960 "\n\tPlease reconnect to the database system and repeat your query.");
963 * DO NOT proc_exit() -- we're here because shared memory may be
964 * corrupted, so we don't want to try to clean up our transaction.
965 * Just nail the windows shut and get out of town.
967 * Note we do exit(1) not exit(0). This is to force the postmaster into
968 * a system reset cycle if some idiot DBA sends a manual SIGQUIT to a
969 * random backend. This is necessary precisely because we don't clean
970 * up our shared memory state.
977 * Shutdown signal from postmaster: abort transaction and exit
978 * at soonest convenient time
983 int save_errno = errno;
985 /* Don't joggle the elbow of proc_exit */
986 if (!proc_exit_inprogress)
988 InterruptPending = true;
989 ProcDiePending = true;
992 * If it's safe to interrupt, and we're waiting for input or a
993 * lock, service the interrupt immediately
995 if (ImmediateInterruptOK && InterruptHoldoffCount == 0 &&
996 CritSectionCount == 0)
998 /* bump holdoff count to make ProcessInterrupts() a no-op */
999 /* until we are done getting ready for it */
1000 InterruptHoldoffCount++;
1001 DisableNotifyInterrupt();
1002 /* Make sure HandleDeadLock won't run while shutting down... */
1004 InterruptHoldoffCount--;
1005 ProcessInterrupts();
1013 * Timeout or shutdown signal from postmaster during client authentication.
1016 * XXX: possible future improvement: try to send a message indicating
1017 * why we are disconnecting. Problem is to be sure we don't block while
1018 * doing so, nor mess up the authentication message exchange.
1021 authdie(SIGNAL_ARGS)
1027 * Query-cancel signal from postmaster: abort current transaction
1028 * at soonest convenient time
1031 QueryCancelHandler(SIGNAL_ARGS)
1033 int save_errno = errno;
1036 * Don't joggle the elbow of proc_exit, nor an already-in-progress
1039 if (!proc_exit_inprogress && !InError)
1041 InterruptPending = true;
1042 QueryCancelPending = true;
1045 * If it's safe to interrupt, and we're waiting for a lock,
1046 * service the interrupt immediately. No point in interrupting if
1047 * we're waiting for input, however.
1049 if (ImmediateInterruptOK && InterruptHoldoffCount == 0 &&
1050 CritSectionCount == 0)
1052 /* bump holdoff count to make ProcessInterrupts() a no-op */
1053 /* until we are done getting ready for it */
1054 InterruptHoldoffCount++;
1055 if (LockWaitCancel())
1057 DisableNotifyInterrupt();
1058 InterruptHoldoffCount--;
1059 ProcessInterrupts();
1062 InterruptHoldoffCount--;
1069 /* signal handler for floating point exception */
1071 FloatExceptionHandler(SIGNAL_ARGS)
1073 elog(ERROR, "floating point exception!"
1074 " The last floating point operation either exceeded legal ranges"
1075 " or was a divide by zero");
1078 /* SIGHUP: set flag to re-read config file at next convenient time */
1080 SigHupHandler(SIGNAL_ARGS)
1087 * ProcessInterrupts: out-of-line portion of CHECK_FOR_INTERRUPTS() macro
1089 * If an interrupt condition is pending, and it's safe to service it,
1090 * then clear the flag and accept the interrupt. Called only when
1091 * InterruptPending is true.
1094 ProcessInterrupts(void)
1096 /* OK to accept interrupt now? */
1097 if (InterruptHoldoffCount != 0 || CritSectionCount != 0)
1099 InterruptPending = false;
1102 ProcDiePending = false;
1103 QueryCancelPending = false; /* ProcDie trumps QueryCancel */
1104 ImmediateInterruptOK = false; /* not idle anymore */
1105 elog(FATAL, "This connection has been terminated by the administrator.");
1107 if (QueryCancelPending)
1109 QueryCancelPending = false;
1110 ImmediateInterruptOK = false; /* not idle anymore */
1111 elog(ERROR, "Query was cancelled.");
1113 /* If we get here, do nothing (probably, QueryCancelPending was reset) */
1118 usage(char *progname)
1120 printf("%s is the PostgreSQL stand-alone backend. It is not\nintended to be used by normal users.\n\n", progname);
1122 printf("Usage:\n %s [options...] [dbname]\n\n", progname);
1123 printf("Options:\n");
1124 #ifdef USE_ASSERT_CHECKING
1125 printf(" -A 1|0 enable/disable run-time assert checking\n");
1127 printf(" -B NBUFFERS number of shared buffers (default %d)\n", DEF_NBUFFERS);
1128 printf(" -c NAME=VALUE set run-time parameter\n");
1129 printf(" -d 1-5,0 debugging level (0 is off)\n");
1130 printf(" -D DATADIR database directory\n");
1131 printf(" -e use European date format\n");
1132 printf(" -E echo query before execution\n");
1133 printf(" -F turn fsync off\n");
1134 printf(" -N do not use newline as interactive query delimiter\n");
1135 printf(" -o FILENAME send stdout and stderr to given file\n");
1136 printf(" -P disable system indexes\n");
1137 printf(" -s show statistics after each query\n");
1138 printf(" -S SORT-MEM set amount of memory for sorts (in kbytes)\n");
1139 printf("Developer options:\n");
1140 printf(" -f [s|i|n|m|h] forbid use of some plan types\n");
1141 printf(" -i do not execute queries\n");
1142 printf(" -O allow system table structure changes\n");
1143 printf(" -t [pa|pl|ex] show timings after each query\n");
1144 printf(" -W NUM wait NUM seconds to allow attach from a debugger\n");
1145 printf("\nReport bugs to <pgsql-bugs@postgresql.org>.\n");
1150 /* ----------------------------------------------------------------
1152 * postgres main loop -- all backends, interactive or otherwise start here
1154 * argc/argv are the command line arguments to be used. (When being forked
1155 * by the postmaster, these are not the original argv array of the process.)
1156 * username is the (possibly authenticated) PostgreSQL user name to be used
1158 * ----------------------------------------------------------------
1161 PostgresMain(int argc, char *argv[], const char *username)
1165 const char *DBName = NULL;
1169 GucSource gucsource;
1173 StringInfo parser_input;
1175 char *potential_DataDir = NULL;
1178 * Catch standard options before doing much else. This even works on
1179 * systems without getopt_long.
1181 if (!IsUnderPostmaster && argc > 1)
1183 if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
1188 if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
1190 puts("postgres (PostgreSQL) " PG_VERSION);
1196 * Fire up essential subsystems: error and memory management
1198 * If we are running under the postmaster, this is done already.
1200 if (!IsUnderPostmaster)
1202 EnableExceptionHandling(true);
1203 MemoryContextInit();
1206 set_ps_display("startup");
1208 SetProcessingMode(InitProcessing);
1211 * Set default values for command-line options.
1216 if (!IsUnderPostmaster)
1218 ResetAllOptions(true);
1219 potential_DataDir = getenv("PGDATA");
1222 /* Check for PGDATESTYLE environment variable */
1223 set_default_datestyle();
1226 * parse command line arguments
1228 * There are now two styles of command line layout for the backend:
1230 * For interactive use (not started from postmaster) the format is
1231 * postgres [switches] [databasename]
1232 * If the databasename is omitted it is taken to be the user name.
1234 * When started from the postmaster, the format is
1235 * postgres [secure switches] -p databasename [insecure switches]
1236 * Switches appearing after -p came from the client (via "options"
1237 * field of connection request). For security reasons we restrict
1238 * what these switches can do.
1242 /* all options are allowed until '-p' */
1244 ctx = PGC_POSTMASTER;
1245 gucsource = PGC_S_ARGV; /* initial switches came from command line */
1247 while ((flag = getopt(argc, argv, "A:B:c:CD:d:Eef:FiNOPo:p:S:st:v:W:x:-:")) != -1)
1251 #ifdef USE_ASSERT_CHECKING
1252 SetConfigOption("debug_assertions", optarg, ctx, gucsource);
1254 elog(WARNING, "Assert checking is not compiled in");
1261 * specify the size of buffer pool
1263 SetConfigOption("shared_buffers", optarg, ctx, gucsource);
1269 * don't print version string
1274 case 'D': /* PGDATA directory */
1276 potential_DataDir = optarg;
1279 case 'd': /* debug level */
1281 /* Set server debugging level. */
1282 if (atoi(optarg) != 0)
1284 char *debugstr = palloc(strlen("debug") + strlen(optarg) + 1);
1286 sprintf(debugstr, "debug%s", optarg);
1287 SetConfigOption("server_min_messages", debugstr, ctx, gucsource);
1290 * -d is not the same as setting client_min_messages
1291 * because it enables other output options.
1293 if (atoi(optarg) >= 1)
1294 SetConfigOption("log_connections", "true", ctx, gucsource);
1295 if (atoi(optarg) >= 2)
1296 SetConfigOption("debug_print_query", "true", ctx, gucsource);
1297 if (atoi(optarg) >= 3)
1298 SetConfigOption("debug_print_parse", "true", ctx, gucsource);
1299 if (atoi(optarg) >= 4)
1300 SetConfigOption("debug_print_plan", "true", ctx, gucsource);
1301 if (atoi(optarg) >= 5)
1302 SetConfigOption("debug_print_rewritten", "true", ctx, gucsource);
1306 * -d 0 allows user to prevent postmaster debug from
1307 * propogating to backend.
1309 SetConfigOption("server_min_messages", "notice", PGC_POSTMASTER, PGC_S_ARGV);
1316 * E - echo the query the user entered
1324 * Use european date formats.
1334 SetConfigOption("fsync", "false", ctx, gucsource);
1340 * f - forbid generation of certain plans
1345 case 's': /* seqscan */
1346 tmp = "enable_seqscan";
1348 case 'i': /* indexscan */
1349 tmp = "enable_indexscan";
1351 case 't': /* tidscan */
1352 tmp = "enable_tidscan";
1354 case 'n': /* nestloop */
1355 tmp = "enable_nestloop";
1357 case 'm': /* mergejoin */
1358 tmp = "enable_mergejoin";
1360 case 'h': /* hashjoin */
1361 tmp = "enable_hashjoin";
1367 SetConfigOption(tmp, "false", ctx, gucsource);
1377 * N - Don't use newline as a query delimiter
1385 * allow system table structure modifications
1387 if (secure) /* XXX safe to allow from client??? */
1388 allowSystemTableMods = true;
1394 * ignore system indexes
1396 if (secure) /* XXX safe to allow from client??? */
1397 IgnoreSystemIndexes(true);
1403 * o - send output (stdout and stderr) to the given file
1406 StrNCpy(OutputFileName, optarg, MAXPGPATH);
1412 * p - special flag passed if backend was forked by a
1417 DBName = strdup(optarg);
1418 secure = false; /* subsequent switches are NOT
1421 gucsource = PGC_S_CLIENT;
1428 * S - amount of sort memory to use in 1k bytes
1430 SetConfigOption("sort_mem", optarg, ctx, gucsource);
1436 * s - report usage statistics (timings) after each query
1438 SetConfigOption("show_query_stats", "true", ctx, gucsource);
1443 * tell postgres to report usage statistics (timings) for
1446 * -tpa[rser] = print stats for parser time of each query
1447 * -tpl[anner] = print stats for planner time of each query
1448 * -te[xecutor] = print stats for executor time of each query
1449 * caution: -s can not be used together with -t.
1456 if (optarg[1] == 'a')
1457 tmp = "show_parser_stats";
1458 else if (optarg[1] == 'l')
1459 tmp = "show_planner_stats";
1464 tmp = "show_executor_stats";
1471 SetConfigOption(tmp, "true", ctx, gucsource);
1476 FrontendProtocol = (ProtocolVersion) atoi(optarg);
1482 * wait N seconds to allow attach from a debugger
1484 sleep(atoi(optarg));
1488 #ifdef NOT_USED /* planner/xfunc.h */
1491 * control joey hellerstein's expensive function
1496 elog(WARNING, "only one -x flag is allowed");
1500 if (strcmp(optarg, "off") == 0)
1501 XfuncMode = XFUNC_OFF;
1502 else if (strcmp(optarg, "nor") == 0)
1503 XfuncMode = XFUNC_NOR;
1504 else if (strcmp(optarg, "nopull") == 0)
1505 XfuncMode = XFUNC_NOPULL;
1506 else if (strcmp(optarg, "nopm") == 0)
1507 XfuncMode = XFUNC_NOPM;
1508 else if (strcmp(optarg, "pullall") == 0)
1509 XfuncMode = XFUNC_PULLALL;
1510 else if (strcmp(optarg, "wait") == 0)
1511 XfuncMode = XFUNC_WAIT;
1514 elog(WARNING, "use -x {off,nor,nopull,nopm,pullall,wait}");
1526 ParseLongOption(optarg, &name, &value);
1530 elog(ERROR, "--%s requires argument", optarg);
1532 elog(ERROR, "-c %s requires argument", optarg);
1535 SetConfigOption(name, value, ctx, gucsource);
1548 * Post-processing for command line options.
1550 if (Show_query_stats &&
1551 (Show_parser_stats || Show_planner_stats || Show_executor_stats))
1553 elog(WARNING, "Query statistics are disabled because parser, planner, or executor statistics are on.");
1554 SetConfigOption("show_query_stats", "false", ctx, gucsource);
1557 if (!IsUnderPostmaster)
1559 if (!potential_DataDir)
1561 fprintf(stderr, "%s does not know where to find the database system "
1562 "data. You must specify the directory that contains the "
1563 "database system either by specifying the -D invocation "
1564 "option or by setting the PGDATA environment variable.\n\n",
1568 SetDataDir(potential_DataDir);
1573 * Set up signal handlers and masks.
1575 * Note that postmaster blocked all signals before forking child process,
1576 * so there is no race condition whereby we might receive a signal
1577 * before we have set up the handler.
1579 * Also note: it's best not to use any signals that are SIG_IGNored in
1580 * the postmaster. If such a signal arrives before we are able to
1581 * change the handler to non-SIG_IGN, it'll get dropped. Instead,
1582 * make a dummy handler in the postmaster to reserve the signal.
1583 * (Of course, this isn't an issue for signals that are locally generated,
1584 * such as SIGALRM and SIGPIPE.)
1587 pqsignal(SIGHUP, SigHupHandler); /* set flag to read config file */
1588 pqsignal(SIGINT, QueryCancelHandler); /* cancel current query */
1589 pqsignal(SIGTERM, die); /* cancel current query and exit */
1590 pqsignal(SIGQUIT, quickdie); /* hard crash time */
1591 pqsignal(SIGALRM, HandleDeadLock); /* check for deadlock after
1595 * Ignore failure to write to frontend. Note: if frontend closes
1596 * connection, we will notice it and exit cleanly when control next
1597 * returns to outer loop. This seems safer than forcing exit in the
1598 * midst of output during who-knows-what operation...
1600 pqsignal(SIGPIPE, SIG_IGN);
1601 pqsignal(SIGUSR1, SIG_IGN); /* this signal available for use */
1603 pqsignal(SIGUSR2, Async_NotifyHandler); /* flush also sinval cache */
1604 pqsignal(SIGFPE, FloatExceptionHandler);
1607 * Reset some signals that are accepted by postmaster but not by
1610 pqsignal(SIGCHLD, SIG_DFL); /* system() requires this on some
1615 /* We allow SIGQUIT (quickdie) at all times */
1616 #ifdef HAVE_SIGPROCMASK
1617 sigdelset(&BlockSig, SIGQUIT);
1619 BlockSig &= ~(sigmask(SIGQUIT));
1622 PG_SETMASK(&BlockSig); /* block everything except SIGQUIT */
1625 if (IsUnderPostmaster)
1627 /* noninteractive case: nothing should be left after switches */
1628 if (errs || argc != optind || DBName == NULL)
1630 elog(WARNING, "%s: invalid command line arguments\nTry -? for help.",
1632 proc_exit(0); /* not 1, that causes system-wide
1639 /* interactive case: database name can be last arg on command line */
1640 if (errs || argc - optind > 1)
1642 elog(WARNING, "%s: invalid command line arguments\nTry -? for help.",
1646 else if (argc - optind == 1)
1647 DBName = argv[optind];
1648 else if ((DBName = username) == NULL)
1650 elog(WARNING, "%s: user name undefined and no database specified",
1656 * On some systems our dynloader code needs the executable's
1657 * pathname. (If under postmaster, this was done already.)
1659 if (FindExec(pg_pathname, argv[0], "postgres") < 0)
1660 elog(FATAL, "%s: could not locate executable, bailing out...",
1664 * Validate we have been given a reasonable-looking DataDir (if
1665 * under postmaster, assume postmaster did this already).
1667 ValidatePgVersion(DataDir);
1670 * Create lockfile for data directory.
1672 if (!CreateDataDirLockFile(DataDir, false))
1679 * Start up xlog for standalone backend, and register to have it
1680 * closed down at exit.
1683 on_shmem_exit(ShutdownXLOG, 0);
1687 * Set up additional info.
1695 * General initialization.
1697 * NOTE: if you are tempted to add code in this vicinity, consider
1698 * putting it inside InitPostgres() instead. In particular, anything
1699 * that involves database access should be there, not here.
1701 elog(DEBUG2, "InitPostgres");
1702 InitPostgres(DBName, username);
1704 SetProcessingMode(NormalProcessing);
1707 * Send this backend's cancellation info to the frontend.
1709 if (whereToSendOutput == Remote &&
1710 PG_PROTOCOL_MAJOR(FrontendProtocol) >= 2)
1714 pq_beginmessage(&buf);
1715 pq_sendbyte(&buf, 'K');
1716 pq_sendint(&buf, (int32) MyProcPid, sizeof(int32));
1717 pq_sendint(&buf, (int32) MyCancelKey, sizeof(int32));
1718 pq_endmessage(&buf);
1719 /* Need not flush since ReadyForQuery will do it. */
1722 if (!IsUnderPostmaster)
1724 puts("\nPOSTGRES backend interactive interface ");
1725 puts("$Revision: 1.258 $ $Date: 2002/03/21 16:01:25 $\n");
1729 * Create the memory context we will use in the main loop.
1731 * QueryContext is reset once per iteration of the main loop, ie, upon
1732 * completion of processing of each supplied query string. It can
1733 * therefore be used for any data that should live just as long as the
1734 * query string --- parse trees, for example.
1736 QueryContext = AllocSetContextCreate(TopMemoryContext,
1738 ALLOCSET_DEFAULT_MINSIZE,
1739 ALLOCSET_DEFAULT_INITSIZE,
1740 ALLOCSET_DEFAULT_MAXSIZE);
1743 * Tell the statistics collector that we're alive and
1744 * to which database we belong.
1750 * POSTGRES main processing loop begins here
1752 * If an exception is encountered, processing resumes here so we abort
1753 * the current transaction and start a new one.
1756 if (sigsetjmp(Warn_restart, 1) != 0)
1759 * NOTE: if you are tempted to add more code in this if-block,
1760 * consider the probability that it should be in
1761 * AbortTransaction() instead.
1763 * Make sure we're not interrupted while cleaning up. Also forget
1764 * any pending QueryCancel request, since we're aborting anyway.
1765 * Force InterruptHoldoffCount to a known state in case we elog'd
1766 * from inside a holdoff section.
1768 ImmediateInterruptOK = false;
1769 QueryCancelPending = false;
1770 InterruptHoldoffCount = 1;
1771 CritSectionCount = 0; /* should be unnecessary, but... */
1772 debug_query_string = NULL; /* used by pgmonitor */
1775 * Make sure we are in a valid memory context during recovery.
1777 * We use ErrorContext in hopes that it will have some free space
1778 * even if we're otherwise up against it...
1780 MemoryContextSwitchTo(ErrorContext);
1782 /* Do the recovery */
1783 elog(DEBUG1, "AbortCurrentTransaction");
1784 AbortCurrentTransaction();
1787 * Now return to normal top-level context and clear ErrorContext
1790 MemoryContextSwitchTo(TopMemoryContext);
1791 MemoryContextResetAndDeleteChildren(ErrorContext);
1794 * Clear flag to indicate that we got out of error recovery mode
1795 * successfully. (Flag was set in elog.c before longjmp().)
1800 * Exit interrupt holdoff section we implicitly established above.
1802 RESUME_INTERRUPTS();
1805 Warn_restart_ready = true; /* we can now handle elog(ERROR) */
1807 PG_SETMASK(&UnBlockSig);
1810 * Non-error queries loop here.
1816 * Release storage left over from prior query cycle, and create a
1817 * new query input buffer in the cleared QueryContext.
1819 MemoryContextSwitchTo(QueryContext);
1820 MemoryContextResetAndDeleteChildren(QueryContext);
1822 parser_input = makeStringInfo();
1825 * (1) tell the frontend we're ready for a new query.
1827 * Note: this includes fflush()'ing the last of the prior output.
1829 ReadyForQuery(whereToSendOutput);
1832 * Tell the statistics collector what we've collected
1836 pgstat_report_tabstat();
1838 if (IsTransactionBlock())
1840 set_ps_display("idle in transaction");
1841 pgstat_report_activity("<IDLE> in transaction");
1845 set_ps_display("idle");
1846 pgstat_report_activity("<IDLE>");
1850 * (2) deal with pending asynchronous NOTIFY from other backends,
1851 * and enable async.c's signal handler to execute NOTIFY directly.
1852 * Then set up other stuff needed before blocking for input.
1854 QueryCancelPending = false; /* forget any earlier CANCEL
1857 EnableNotifyInterrupt();
1859 /* Allow "die" interrupt to be processed while waiting */
1860 ImmediateInterruptOK = true;
1861 /* and don't forget to detect one that already arrived */
1862 QueryCancelPending = false;
1863 CHECK_FOR_INTERRUPTS();
1866 * (3) read a command (loop blocks here)
1868 firstchar = ReadCommand(parser_input);
1871 * (4) disable async signal conditions again.
1873 ImmediateInterruptOK = false;
1874 QueryCancelPending = false; /* forget any CANCEL signal */
1876 DisableNotifyInterrupt();
1879 * (5) check for any other interesting events that happened while
1885 ProcessConfigFile(PGC_SIGHUP);
1889 * (6) process the command.
1894 * 'F' indicates a fastpath call.
1898 * Tell the collector what we're doing
1901 pgstat_report_activity("<FASTPATH> function call");
1903 /* start an xact for this function invocation */
1904 start_xact_command();
1906 if (HandleFunctionRequest() == EOF)
1908 /* lost frontend connection during F message input */
1910 * Reset whereToSendOutput to prevent elog from attempting
1911 * to send any more messages to client.
1913 if (whereToSendOutput == Remote)
1914 whereToSendOutput = None;
1919 /* commit the function-invocation transaction */
1920 finish_xact_command();
1924 * 'Q' indicates a user query
1927 if (strspn(parser_input->data, " \t\r\n") == parser_input->len)
1930 * if there is nothing in the input buffer, don't
1931 * bother trying to parse and execute anything; just
1932 * send back a quick NullCommand response.
1934 if (IsUnderPostmaster)
1935 NullCommand(Remote);
1940 * otherwise, process the input string.
1942 * Note: transaction command start/end is now done within
1943 * pg_exec_query_string(), not here.
1945 if (Show_query_stats)
1948 pgstat_report_activity(parser_input->data);
1950 pg_exec_query_string(parser_input->data,
1954 if (Show_query_stats)
1955 ShowUsage("QUERY STATISTICS");
1960 * 'X' means that the frontend is closing down the socket.
1961 * EOF means unexpected loss of frontend connection.
1962 * Either way, perform normal shutdown.
1967 * Reset whereToSendOutput to prevent elog from attempting
1968 * to send any more messages to client.
1970 if (whereToSendOutput == Remote)
1971 whereToSendOutput = None;
1974 * NOTE: if you are tempted to add more code here, DON'T!
1975 * Whatever you had in mind to do should be set up as an
1976 * on_proc_exit or on_shmem_exit callback, instead.
1977 * Otherwise it will fail to be called during other
1978 * backend-shutdown scenarios.
1983 elog(ERROR, "unknown frontend message was received");
1986 #ifdef MEMORY_CONTEXT_CHECKING
1989 * Check all memory after each backend loop. This is a rather
1990 * weird place to do it, perhaps.
1992 MemoryContextCheck(TopMemoryContext);
1994 } /* end of input-reading loop */
1996 /* can't get here because the above loop never exits */
1999 return 1; /* keep compiler quiet */
2002 #ifndef HAVE_GETRUSAGE
2003 #include "rusagestub.h"
2005 #include <sys/resource.h>
2006 #endif /* HAVE_GETRUSAGE */
2008 struct rusage Save_r;
2009 struct timeval Save_t;
2016 getrusage(RUSAGE_SELF, &Save_r);
2017 gettimeofday(&Save_t, &tz);
2019 /* ResetTupleCount(); */
2023 ShowUsage(const char *title)
2026 struct timeval user,
2028 struct timeval elapse_t;
2033 getrusage(RUSAGE_SELF, &r);
2034 gettimeofday(&elapse_t, &tz);
2035 memcpy((char *) &user, (char *) &r.ru_utime, sizeof(user));
2036 memcpy((char *) &sys, (char *) &r.ru_stime, sizeof(sys));
2037 if (elapse_t.tv_usec < Save_t.tv_usec)
2040 elapse_t.tv_usec += 1000000;
2042 if (r.ru_utime.tv_usec < Save_r.ru_utime.tv_usec)
2044 r.ru_utime.tv_sec--;
2045 r.ru_utime.tv_usec += 1000000;
2047 if (r.ru_stime.tv_usec < Save_r.ru_stime.tv_usec)
2049 r.ru_stime.tv_sec--;
2050 r.ru_stime.tv_usec += 1000000;
2054 * the only stats we don't show here are for memory usage -- i can't
2055 * figure out how to interpret the relevant fields in the rusage
2056 * struct, and they change names across o/s platforms, anyway. if you
2057 * can figure out what the entries mean, you can somehow extract
2058 * resident set size, shared text size, and unshared data and stack
2061 initStringInfo(&str);
2063 appendStringInfo(&str, "! system usage stats:\n");
2064 appendStringInfo(&str,
2065 "!\t%ld.%06ld elapsed %ld.%06ld user %ld.%06ld system sec\n",
2066 (long int) elapse_t.tv_sec - Save_t.tv_sec,
2067 (long int) elapse_t.tv_usec - Save_t.tv_usec,
2068 (long int) r.ru_utime.tv_sec - Save_r.ru_utime.tv_sec,
2069 (long int) r.ru_utime.tv_usec - Save_r.ru_utime.tv_usec,
2070 (long int) r.ru_stime.tv_sec - Save_r.ru_stime.tv_sec,
2071 (long int) r.ru_stime.tv_usec - Save_r.ru_stime.tv_usec);
2072 appendStringInfo(&str,
2073 "!\t[%ld.%06ld user %ld.%06ld sys total]\n",
2074 (long int) user.tv_sec,
2075 (long int) user.tv_usec,
2076 (long int) sys.tv_sec,
2077 (long int) sys.tv_usec);
2078 /* BeOS has rusage but only has some fields, and not these... */
2079 #if defined(HAVE_GETRUSAGE)
2080 appendStringInfo(&str,
2081 "!\t%ld/%ld [%ld/%ld] filesystem blocks in/out\n",
2082 r.ru_inblock - Save_r.ru_inblock,
2083 /* they only drink coffee at dec */
2084 r.ru_oublock - Save_r.ru_oublock,
2085 r.ru_inblock, r.ru_oublock);
2086 appendStringInfo(&str,
2087 "!\t%ld/%ld [%ld/%ld] page faults/reclaims, %ld [%ld] swaps\n",
2088 r.ru_majflt - Save_r.ru_majflt,
2089 r.ru_minflt - Save_r.ru_minflt,
2090 r.ru_majflt, r.ru_minflt,
2091 r.ru_nswap - Save_r.ru_nswap,
2093 appendStringInfo(&str,
2094 "!\t%ld [%ld] signals rcvd, %ld/%ld [%ld/%ld] messages rcvd/sent\n",
2095 r.ru_nsignals - Save_r.ru_nsignals,
2097 r.ru_msgrcv - Save_r.ru_msgrcv,
2098 r.ru_msgsnd - Save_r.ru_msgsnd,
2099 r.ru_msgrcv, r.ru_msgsnd);
2100 appendStringInfo(&str,
2101 "!\t%ld/%ld [%ld/%ld] voluntary/involuntary context switches\n",
2102 r.ru_nvcsw - Save_r.ru_nvcsw,
2103 r.ru_nivcsw - Save_r.ru_nivcsw,
2104 r.ru_nvcsw, r.ru_nivcsw);
2105 #endif /* HAVE_GETRUSAGE */
2107 bufusage = ShowBufferUsage();
2108 appendStringInfo(&str, "! postgres usage stats:\n%s", bufusage);
2111 /* remove trailing newline */
2112 if (str.data[str.len-1] == '\n')
2113 str.data[--str.len] = '\0';
2115 elog(LOG, "%s\n%s", title, str.data);
2122 assertEnable(int val)
2124 assert_enabled = val;
2128 #ifdef ASSERT_CHECKING_TEST
2136 /* val != 0 should be trapped by previous Assert */
2137 elog(DEBUG3, "Assert test successful (val = %d)", val);
2140 elog(DEBUG3, "Assert checking is disabled (val = %d)", val);
2149 /* ----------------------------------------------------------------
2152 * utility to get a string representation of the
2153 * command operation.
2154 * ----------------------------------------------------------------
2157 CreateCommandTag(Node *parsetree)
2161 switch (nodeTag(parsetree))
2179 case T_TransactionStmt:
2181 TransactionStmt *stmt = (TransactionStmt *) parsetree;
2183 switch (stmt->command)
2204 case T_ClosePortalStmt:
2210 FetchStmt *stmt = (FetchStmt *) parsetree;
2211 tag = (stmt->ismove) ? "MOVE" : "FETCH";
2215 case T_CreateDomainStmt:
2216 tag = "CREATE DOMAIN";
2219 case T_CreateSchemaStmt:
2231 case T_TruncateStmt:
2247 case T_AlterTableStmt:
2253 GrantStmt *stmt = (GrantStmt *) parsetree;
2254 tag = (stmt->is_grant) ? "GRANT" : "REVOKE";
2262 case T_ViewStmt: /* CREATE VIEW */
2266 case T_ProcedureStmt: /* CREATE FUNCTION */
2270 case T_IndexStmt: /* CREATE INDEX */
2274 case T_RuleStmt: /* CREATE RULE */
2278 case T_CreateSeqStmt:
2282 case T_RemoveAggrStmt:
2286 case T_RemoveFuncStmt:
2290 case T_RemoveOperStmt:
2295 tag = "CREATE VERSION";
2298 case T_CreatedbStmt:
2299 tag = "CREATE DATABASE";
2302 case T_AlterDatabaseSetStmt:
2303 tag = "ALTER DATABASE";
2307 tag = "DROP DATABASE";
2318 case T_UnlistenStmt:
2331 if (((VacuumStmt *) parsetree)->vacuum)
2343 tag = "EXECUTE RECIPE";
2347 case T_VariableSetStmt:
2348 tag = "SET VARIABLE";
2351 case T_VariableShowStmt:
2352 tag = "SHOW VARIABLE";
2355 case T_VariableResetStmt:
2356 tag = "RESET VARIABLE";
2359 case T_CreateTrigStmt:
2363 case T_DropTrigStmt:
2367 case T_CreatePLangStmt:
2371 case T_DropPLangStmt:
2375 case T_CreateUserStmt:
2376 tag = "CREATE USER";
2379 case T_AlterUserStmt:
2383 case T_AlterUserSetStmt:
2387 case T_DropUserStmt:
2395 case T_ConstraintsSetStmt:
2396 tag = "SET CONSTRAINTS";
2399 case T_CreateGroupStmt:
2400 tag = "CREATE GROUP";
2403 case T_AlterGroupStmt:
2404 tag = "ALTER GROUP";
2407 case T_DropGroupStmt:
2411 case T_CheckPointStmt:
2420 elog(LOG, "CreateCommandTag: unknown parse node type %d",
2421 nodeTag(parsetree));