postgres.c 49.3 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * postgres.c
4
 *	  POSTGRES C Backend Interface
5
 *
6
 * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
B
Add:  
Bruce Momjian 已提交
7
 * Portions Copyright (c) 1994, Regents of the University of California
8 9 10
 *
 *
 * IDENTIFICATION
11
 *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.242 2001/11/10 23:51:14 tgl Exp $
12 13
 *
 * NOTES
14 15
 *	  this is the "main" module of the postgres backend and
 *	  hence the main module of the "traffic cop".
16 17 18
 *
 *-------------------------------------------------------------------------
 */
B
Bruce Momjian 已提交
19

20 21
#include "postgres.h"

B
Bruce Momjian 已提交
22
#include <unistd.h>
23
#include <signal.h>
24 25
#include <time.h>
#include <sys/time.h>
B
Bruce Momjian 已提交
26 27
#include <sys/types.h>
#include <fcntl.h>
28
#include <sys/socket.h>
29
#include <errno.h>
30
#if HAVE_SYS_SELECT_H
31
#include <sys/select.h>
32
#endif
33
#ifdef HAVE_GETOPT_H
B
Bruce Momjian 已提交
34
#include <getopt.h>
35
#endif
36

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"
B
Bruce Momjian 已提交
44
#include "miscadmin.h"
45 46
#include "nodes/print.h"
#include "optimizer/cost.h"
47
#include "optimizer/planner.h"
48 49
#include "parser/analyze.h"
#include "parser/parse.h"
50
#include "parser/parser.h"
B
Bruce Momjian 已提交
51
#include "rewrite/rewriteHandler.h"
52 53
#include "tcop/fastpath.h"
#include "tcop/pquery.h"
B
Bruce Momjian 已提交
54
#include "tcop/tcopprot.h"
55
#include "tcop/utility.h"
56
#include "storage/proc.h"
57 58
#include "utils/exc.h"
#include "utils/guc.h"
59
#include "utils/memutils.h"
M
 
Marc G. Fournier 已提交
60
#include "utils/ps_status.h"
61
#ifdef MULTIBYTE
B
Bruce Momjian 已提交
62
#include "mb/pg_wchar.h"
63 64
#endif

65
#include "pgstat.h"
M
 
Marc G. Fournier 已提交
66

67
/* ----------------
68
 *		global variables
69 70
 * ----------------
 */
71

B
Bruce Momjian 已提交
72
extern int	optind;
73 74
extern char *optarg;

75
char	   *debug_query_string; /* used by pgmonitor */
76

77
/* Note: whereToSendOutput is initialized for the bootstrap/standalone case */
78
CommandDest whereToSendOutput = Debug;
79

B
Bruce Momjian 已提交
80
static bool dontExecute = false;
81

82
/* note: these declarations had better match tcopprot.h */
83
sigjmp_buf	Warn_restart;
84

85
bool		Warn_restart_ready = false;
86
bool		InError = false;
87

88
static bool EchoQuery = false;	/* default don't echo */
89

90
/* ----------------
91 92
 *		people who want to use EOF should #define DONTUSENEWLINE in
 *		tcop/tcopdebug.h
93 94 95
 * ----------------
 */
#ifndef TCOP_DONTUSENEWLINE
96
int			UseNewLine = 1;		/* Use newlines query delimiters (the
97 98
								 * default) */

99
#else
100
int			UseNewLine = 0;		/* Use EOF as query delimiters */
101
#endif   /* TCOP_DONTUSENEWLINE */
102 103 104 105

/*
** Flags for expensive function optimization -- JMH 3/9/92
*/
106
int			XfuncMode = 0;
107 108

/* ----------------------------------------------------------------
109
 *		decls for routines only used in this file
110 111
 * ----------------------------------------------------------------
 */
112 113 114
static int	InteractiveBackend(StringInfo inBuf);
static int	SocketBackend(StringInfo inBuf);
static int	ReadCommand(StringInfo inBuf);
115 116 117 118
static List *pg_parse_query(char *query_string, Oid *typev, int nargs);
static List *pg_analyze_and_rewrite(Node *parsetree);
static void start_xact_command(void);
static void finish_xact_command(void);
119 120
static void SigHupHandler(SIGNAL_ARGS);
static void FloatExceptionHandler(SIGNAL_ARGS);
121 122 123 124 125 126 127

/*
 * Flag to mark SIGHUP. Whenever the main loop comes around it
 * will reread the configuration file. (Better than doing the
 * reading in the signal handler, ey?)
 */
static volatile bool got_SIGHUP = false;
128 129 130


/* ----------------------------------------------------------------
131
 *		routines to obtain user input
132 133 134 135
 * ----------------------------------------------------------------
 */

/* ----------------
136 137
 *	InteractiveBackend() is called for user interactive connections
 *	the string entered by the user is placed in its parameter inBuf.
138
 *
139
 *	EOF is returned if end-of-file input is seen; time to shut down.
140 141 142
 * ----------------
 */

143
static int
144
InteractiveBackend(StringInfo inBuf)
145
{
146 147 148
	int			c;				/* character read from getc() */
	bool		end = false;	/* end-of-input flag */
	bool		backslashSeen = false;	/* have we seen a \ ? */
149

150 151
	/*
	 * display a prompt and obtain input from the user
152
	 */
153
	printf("backend> ");
154
	fflush(stdout);
155

156 157 158 159
	/* Reset inBuf to empty */
	inBuf->len = 0;
	inBuf->data[0] = '\0';

160 161 162 163
	for (;;)
	{
		if (UseNewLine)
		{
164 165 166
			/*
			 * if we are using \n as a delimiter, then read characters
			 * until the \n.
167 168 169 170 171 172 173
			 */
			while ((c = getc(stdin)) != EOF)
			{
				if (c == '\n')
				{
					if (backslashSeen)
					{
174 175 176
						/* discard backslash from inBuf */
						inBuf->data[--inBuf->len] = '\0';
						backslashSeen = false;
177 178 179 180 181
						continue;
					}
					else
					{
						/* keep the newline character */
182
						appendStringInfoChar(inBuf, '\n');
183 184 185 186 187 188 189 190
						break;
					}
				}
				else if (c == '\\')
					backslashSeen = true;
				else
					backslashSeen = false;

191
				appendStringInfoChar(inBuf, (char) c);
192 193 194 195 196 197 198
			}

			if (c == EOF)
				end = true;
		}
		else
		{
199 200
			/*
			 * otherwise read characters until EOF.
201 202
			 */
			while ((c = getc(stdin)) != EOF)
203
				appendStringInfoChar(inBuf, (char) c);
204

205
			if (inBuf->len == 0)
206 207 208 209
				end = true;
		}

		if (end)
210
			return EOF;
211

212 213
		/*
		 * otherwise we have a user query so process it.
214 215 216 217
		 */
		break;
	}

218 219
	/*
	 * if the query echo flag was given, print the query..
220 221
	 */
	if (EchoQuery)
222
		printf("query: %s\n", inBuf->data);
223
	fflush(stdout);
224

225
	return 'Q';
226 227 228
}

/* ----------------
229
 *	SocketBackend()		Is called for frontend-backend connections
230
 *
231 232
 *	If the input is a query (case 'Q') then the string entered by
 *	the user is placed in its parameter inBuf.
233
 *
234
 *	If the input is a fastpath function call (case 'F') then
235
 *	the function call is processed in HandleFunctionRequest()
236 237
 *	(now called from PostgresMain()).
 *
238
 *	EOF is returned if the connection is lost.
239 240 241
 * ----------------
 */

242
static int
243
SocketBackend(StringInfo inBuf)
244
{
245
	char		qtype;
246
	char		result = '\0';
247

248 249
	/*
	 * get input from the frontend
250
	 */
251 252
	qtype = '?';
	if (pq_getbytes(&qtype, 1) == EOF)
253
		return EOF;
254

255
	switch (qtype)
256
	{
257 258
			/*
			 * 'Q': user entered a query
259 260
			 */
		case 'Q':
261
			if (pq_getstr(inBuf))
262
				return EOF;
263 264
			result = 'Q';
			break;
265

266 267
			/*
			 * 'F':  calling user/system functions
268 269
			 */
		case 'F':
270
			if (pq_getstr(inBuf))
271
				return EOF;		/* ignore "string" at start of F message */
272 273
			result = 'F';
			break;
274

275 276
			/*
			 * 'X':  frontend is exiting
277 278 279 280
			 */
		case 'X':
			result = 'X';
			break;
281

282 283
			/*
			 * otherwise we got garbage from the frontend.
284
			 *
285 286
			 * XXX are we certain that we want to do an elog(FATAL) here?
			 * -cim 1/24/90
287 288
			 */
		default:
289
			elog(FATAL, "Socket command type %c unknown", qtype);
290
			break;
291 292
	}
	return result;
293 294 295
}

/* ----------------
296 297 298
 *		ReadCommand reads a command from either the frontend or
 *		standard input, places it in inBuf, and returns a char
 *		representing whether the string is a 'Q'uery or a 'F'astpath
299
 *		call.  EOF is returned if end of file.
300 301
 * ----------------
 */
302
static int
303
ReadCommand(StringInfo inBuf)
304
{
305
	int			result;
306

307
	if (IsUnderPostmaster)
308
		result = SocketBackend(inBuf);
309
	else
310 311
		result = InteractiveBackend(inBuf);
	return result;
312 313
}

314 315 316 317 318 319

/*
 * Parse a query string and pass it through the rewriter.
 *
 * A list of Query nodes is returned, since the string might contain
 * multiple queries and/or the rewriter might expand one query to several.
320 321 322
 *
 * NOTE: this routine is no longer used for processing interactive queries,
 * but it is still needed for parsing of SQL function bodies.
323
 */
324
List *
B
Bruce Momjian 已提交
325
pg_parse_and_rewrite(char *query_string,		/* string to execute */
326
					 Oid *typev,	/* parameter types */
B
Bruce Momjian 已提交
327
					 int nargs) /* number of parameters */
328
{
329
	List	   *raw_parsetree_list;
330
	List	   *querytree_list;
331 332
	List	   *list_item;

333 334
	/*
	 * (1) parse the request string into a list of raw parse trees.
335 336 337
	 */
	raw_parsetree_list = pg_parse_query(query_string, typev, nargs);

338 339
	/*
	 * (2) Do parse analysis and rule rewrite.
340 341 342 343
	 */
	querytree_list = NIL;
	foreach(list_item, raw_parsetree_list)
	{
B
Bruce Momjian 已提交
344
		Node	   *parsetree = (Node *) lfirst(list_item);
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369

		querytree_list = nconc(querytree_list,
							   pg_analyze_and_rewrite(parsetree));
	}

	return querytree_list;
}

/*
 * Do raw parsing (only).
 *
 * A list of parsetrees is returned, since there might be multiple
 * commands in the given string.
 *
 * NOTE: for interactive queries, it is important to keep this routine
 * separate from the analysis & rewrite stages.  Analysis and rewriting
 * cannot be done in an aborted transaction, since they require access to
 * database tables.  So, we rely on the raw parser to determine whether
 * we've seen a COMMIT or ABORT command; when we are in abort state, other
 * commands are not processed any further than the raw parse stage.
 */
static List *
pg_parse_query(char *query_string, Oid *typev, int nargs)
{
	List	   *raw_parsetree_list;
370

371 372
	if (Debug_print_query)
		elog(DEBUG, "query: %s", query_string);
373

374 375 376 377 378 379
	if (Show_parser_stats)
		ResetUsage();

	raw_parsetree_list = parser(query_string, typev, nargs);

	if (Show_parser_stats)
380
		ShowUsage("PARSER STATISTICS");
381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401

	return raw_parsetree_list;
}

/*
 * Given a raw parsetree (gram.y output), perform parse analysis and
 * rule rewriting.
 *
 * A list of Query nodes is returned, since either the analyzer or the
 * rewriter might expand one query to several.
 *
 * NOTE: for reasons mentioned above, this must be separate from raw parsing.
 */
static List *
pg_analyze_and_rewrite(Node *parsetree)
{
	List	   *querytree_list;
	List	   *list_item;
	Query	   *querytree;
	List	   *new_list;

402 403
	/*
	 * (1) Perform parse analysis.
404
	 */
405
	if (Show_parser_stats)
406 407
		ResetUsage();

408
	querytree_list = parse_analyze(parsetree, NULL);
409

410
	if (Show_parser_stats)
411
	{
412
		ShowUsage("PARSE ANALYSIS STATISTICS");
413
		ResetUsage();
414 415
	}

416 417
	/*
	 * (2) Rewrite the queries, as necessary
418
	 *
419 420
	 * rewritten queries are collected in new_list.  Note there may be more
	 * or fewer than in the original list.
421
	 */
422
	new_list = NIL;
423
	foreach(list_item, querytree_list)
424
	{
425
		querytree = (Query *) lfirst(list_item);
426

427
		if (Debug_print_parse)
428
		{
429
			if (Debug_pretty_print)
B
Bruce Momjian 已提交
430
			{
431
				elog(DEBUG, "parse tree:");
J
Jan Wieck 已提交
432
				nodeDisplay(querytree);
B
Bruce Momjian 已提交
433 434
			}
			else
435
				elog(DEBUG, "parse tree: %s", nodeToString(querytree));
436
		}
437 438 439

		if (querytree->commandType == CMD_UTILITY)
		{
440 441
			/* don't rewrite utilities, just dump 'em into new_list */
			new_list = lappend(new_list, querytree);
442
		}
443
		else
444
		{
445
			/* rewrite regular queries */
446 447
			List	   *rewritten = QueryRewrite(querytree);

448
			new_list = nconc(new_list, rewritten);
449 450 451 452 453
		}
	}

	querytree_list = new_list;

454
	if (Show_parser_stats)
455
		ShowUsage("REWRITER STATISTICS");
456

457
#ifdef COPY_PARSE_PLAN_TREES
B
Bruce Momjian 已提交
458 459 460 461 462

	/*
	 * Optional debugging check: pass querytree output through
	 * copyObject()
	 */
463 464
	new_list = (List *) copyObject(querytree_list);
	/* This checks both copyObject() and the equal() routines... */
B
Bruce Momjian 已提交
465
	if (!equal(new_list, querytree_list))
466
		elog(NOTICE, "pg_analyze_and_rewrite: copyObject failed on parse tree");
467 468
	else
		querytree_list = new_list;
469 470
#endif

471
	if (Debug_print_rewritten)
472
	{
473
		if (Debug_pretty_print)
B
Bruce Momjian 已提交
474
		{
475
			elog(DEBUG, "rewritten parse tree:");
476
			foreach(list_item, querytree_list)
J
Jan Wieck 已提交
477
			{
478
				querytree = (Query *) lfirst(list_item);
479
				nodeDisplay(querytree);
J
Jan Wieck 已提交
480 481
				printf("\n");
			}
B
Bruce Momjian 已提交
482 483 484
		}
		else
		{
485
			elog(DEBUG, "rewritten parse tree:");
486
			foreach(list_item, querytree_list)
J
Jan Wieck 已提交
487
			{
488
				querytree = (Query *) lfirst(list_item);
489
				elog(DEBUG, "%s", nodeToString(querytree));
J
Jan Wieck 已提交
490
			}
491 492 493
		}
	}

494 495
	return querytree_list;
}
496 497


498 499 500 501 502
/* Generate a plan for a single query. */
Plan *
pg_plan_query(Query *querytree)
{
	Plan	   *plan;
503

504 505 506
	/* Utility commands have no plans. */
	if (querytree->commandType == CMD_UTILITY)
		return NULL;
507

508
	if (Show_planner_stats)
509
		ResetUsage();
510

511 512
	/* call that optimizer */
	plan = planner(querytree);
513

514
	if (Show_planner_stats)
515
		ShowUsage("PLANNER STATISTICS");
516

517 518 519
#ifdef COPY_PARSE_PLAN_TREES
	/* Optional debugging check: pass plan output through copyObject() */
	{
B
Bruce Momjian 已提交
520
		Plan	   *new_plan = (Plan *) copyObject(plan);
521

B
Bruce Momjian 已提交
522 523
		/*
		 * equal() currently does not have routines to compare Plan nodes,
524 525 526 527
		 * so don't try to test equality here.  Perhaps fix someday?
		 */
#ifdef NOT_USED
		/* This checks both copyObject() and the equal() routines... */
B
Bruce Momjian 已提交
528
		if (!equal(new_plan, plan))
529 530 531 532 533 534 535
			elog(NOTICE, "pg_plan_query: copyObject failed on plan tree");
		else
#endif
			plan = new_plan;
	}
#endif

536 537
	/*
	 * Print plan if debugging.
538
	 */
539
	if (Debug_print_plan)
540
	{
541
		if (Debug_pretty_print)
542
		{
543
			elog(DEBUG, "plan:");
544
			nodeDisplay(plan);
545 546
		}
		else
547
			elog(DEBUG, "plan: %s", nodeToString(plan));
548 549
	}

550
	return plan;
551 552
}

553

554
/* ----------------------------------------------------------------
555
 *		pg_exec_query_string()
556 557
 *
 *		Takes a querystring, runs the parser/utilities or
558 559 560 561
 *		parser/planner/executor over it as necessary.
 *
 * Assumptions:
 *
562
 * At call, we are not inside a transaction command.
563
 *
564
 * The CurrentMemoryContext after starting a transaction command must be
565
 * appropriate for execution of individual queries (typically this will be
B
Bruce Momjian 已提交
566
 * TransactionCommandContext).	Note that this routine resets that context
567 568
 * after each individual query, so don't store anything there that
 * must outlive the call!
569
 *
570 571
 * parse_context references a context suitable for holding the
 * parse/rewrite trees (typically this will be QueryContext).
572
 * This context *must* be longer-lived than the transaction context!
573 574 575 576 577 578 579
 * In fact, if the query string might contain BEGIN/COMMIT commands,
 * parse_context had better outlive TopTransactionContext!
 *
 * We could have hard-wired knowledge about QueryContext and
 * TransactionCommandContext into this routine, but it seems better
 * not to, in case callers from outside this module need to use some
 * other contexts.
580 581 582 583 584
 *
 * ----------------------------------------------------------------
 */

void
B
Bruce Momjian 已提交
585 586 587 588
pg_exec_query_string(char *query_string,		/* string to execute */
					 CommandDest dest,	/* where results should go */
					 MemoryContext parse_context)		/* context for
														 * parsetrees */
589
{
590
	bool		xact_started;
591
	MemoryContext oldcontext;
592 593
	List	   *parsetree_list,
			   *parsetree_item;
594

595 596
	debug_query_string = query_string;	/* used by pgmonitor */

597
	/*
B
Bruce Momjian 已提交
598 599 600 601 602
	 * Start up a transaction command.	All queries generated by the
	 * query_string will be in this same command block, *unless* we find a
	 * BEGIN/COMMIT/ABORT statement; we have to force a new xact command
	 * after one of those, else bad things will happen in xact.c. (Note
	 * that this will possibly change current memory context.)
603 604 605 606 607
	 */
	start_xact_command();
	xact_started = true;

	/*
B
Bruce Momjian 已提交
608 609 610 611 612
	 * parse_context *must* be different from the execution memory
	 * context, else the context reset at the bottom of the loop will
	 * destroy the parsetree list.	(We really ought to check that
	 * parse_context isn't a child of CurrentMemoryContext either, but
	 * that would take more cycles than it's likely to be worth.)
613 614 615
	 */
	Assert(parse_context != CurrentMemoryContext);

616 617 618 619
	/*
	 * Switch to appropriate context for constructing parsetrees.
	 */
	oldcontext = MemoryContextSwitchTo(parse_context);
620

B
Bruce Momjian 已提交
621
	/*
B
Bruce Momjian 已提交
622 623
	 * Do basic parsing of the query or queries (this should be safe even
	 * if we are in aborted transaction state!)
624
	 */
625
	parsetree_list = pg_parse_query(query_string, NULL, 0);
626

627
	/*
628
	 * Switch back to execution context to enter the loop.
629 630 631 632
	 */
	MemoryContextSwitchTo(oldcontext);

	/*
633
	 * Run through the parsetree(s) and process each one.
634
	 */
635
	foreach(parsetree_item, parsetree_list)
636
	{
B
Bruce Momjian 已提交
637 638 639 640
		Node	   *parsetree = (Node *) lfirst(parsetree_item);
		bool		isTransactionStmt;
		List	   *querytree_list,
				   *querytree_item;
641

642 643
		/* Transaction control statements need some special handling */
		isTransactionStmt = IsA(parsetree, TransactionStmt);
644

645 646 647 648
		/*
		 * If we are in an aborted transaction, ignore all commands except
		 * COMMIT/ABORT.  It is important that this test occur before we
		 * try to do parse analysis, rewrite, or planning, since all those
B
Bruce Momjian 已提交
649 650 651
		 * phases try to do database accesses, which may fail in abort
		 * state. (It might be safe to allow some additional utility
		 * commands in this state, but not many...)
652 653
		 */
		if (IsAbortedTransactionBlockState())
654
		{
B
Bruce Momjian 已提交
655
			bool		allowit = false;
656

657 658 659 660 661 662 663 664 665 666 667 668 669 670
			if (isTransactionStmt)
			{
				TransactionStmt *stmt = (TransactionStmt *) parsetree;

				switch (stmt->command)
				{
					case COMMIT:
					case ROLLBACK:
						allowit = true;
						break;
					default:
						break;
				}
			}
671

B
Bruce Momjian 已提交
672
			if (!allowit)
673
			{
674 675 676
				/*
				 * the EndCommand() stuff is to tell the frontend that the
				 * command ended. -cim 6/1/90
677 678 679 680 681 682 683 684
				 */
				char	   *tag = "*ABORT STATE*";

				elog(NOTICE, "current transaction is aborted, "
					 "queries ignored until end of transaction block");

				EndCommand(tag, dest);

685 686
				/*
				 * We continue in the loop, on the off chance that there
687 688 689 690
				 * is a COMMIT or ROLLBACK utility command later in the
				 * query string.
				 */
				continue;
691
			}
692
		}
693

694
		/* Make sure we are in a transaction command */
B
Bruce Momjian 已提交
695
		if (!xact_started)
696 697 698 699
		{
			start_xact_command();
			xact_started = true;
		}
700

701
		/* If we got a cancel signal in parsing or prior command, quit */
702
		CHECK_FOR_INTERRUPTS();
703 704 705 706

		/*
		 * OK to analyze and rewrite this query.
		 *
B
Bruce Momjian 已提交
707 708
		 * Switch to appropriate context for constructing querytrees (again,
		 * these must outlive the execution context).
709 710
		 */
		oldcontext = MemoryContextSwitchTo(parse_context);
711

712
		querytree_list = pg_analyze_and_rewrite(parsetree);
V
Vadim B. Mikheev 已提交
713

714 715 716 717 718 719 720 721 722 723 724 725
		/*
		 * Switch back to execution context for planning and execution.
		 */
		MemoryContextSwitchTo(oldcontext);

		/*
		 * Inner loop handles the individual queries generated from a
		 * single parsetree by analysis and rewrite.
		 */
		foreach(querytree_item, querytree_list)
		{
			Query	   *querytree = (Query *) lfirst(querytree_item);
726

727
			/* Make sure we are in a transaction command */
B
Bruce Momjian 已提交
728
			if (!xact_started)
729
			{
730 731 732 733
				start_xact_command();
				xact_started = true;
			}

B
Bruce Momjian 已提交
734 735 736 737
			/*
			 * If we got a cancel signal in analysis or prior command,
			 * quit
			 */
738
			CHECK_FOR_INTERRUPTS();
739 740 741

			if (querytree->commandType == CMD_UTILITY)
			{
742 743
				/*
				 * process utility functions (create, destroy, etc..)
744 745 746 747 748 749 750
				 */
				if (Debug_print_query)
					elog(DEBUG, "ProcessUtility: %s", query_string);
				else if (DebugLvl > 1)
					elog(DEBUG, "ProcessUtility");

				ProcessUtility(querytree->utilityStmt, dest);
751 752 753
			}
			else
			{
754 755
				/*
				 * process a plannable query.
756 757 758 759 760 761
				 */
				Plan	   *plan;

				plan = pg_plan_query(querytree);

				/* if we got a cancel signal whilst planning, quit */
762
				CHECK_FOR_INTERRUPTS();
763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785

				/* Initialize snapshot state for query */
				SetQuerySnapshot();

				/*
				 * execute the plan
				 */
				if (Show_executor_stats)
					ResetUsage();

				if (dontExecute)
				{
					/* don't execute it, just show the query plan */
					print_plan(plan, querytree);
				}
				else
				{
					if (DebugLvl > 1)
						elog(DEBUG, "ProcessQuery");
					ProcessQuery(querytree, plan, dest);
				}

				if (Show_executor_stats)
786
					ShowUsage("EXECUTOR STATISTICS");
787
			}
788

789 790 791
			/*
			 * In a query block, we want to increment the command counter
			 * between queries so that the effects of early queries are
B
Bruce Momjian 已提交
792 793
			 * visible to subsequent ones.	In particular we'd better do
			 * so before checking constraints.
794 795 796 797 798
			 */
			if (!isTransactionStmt)
				CommandCounterIncrement();

			/*
B
Bruce Momjian 已提交
799 800
			 * Clear the execution context to recover temporary memory
			 * used by the query.  NOTE: if query string contains
801
			 * BEGIN/COMMIT transaction commands, execution context may
B
Bruce Momjian 已提交
802 803
			 * now be different from what we were originally passed; so be
			 * careful to clear current context not "oldcontext".
804 805 806 807 808 809
			 */
			Assert(parse_context != CurrentMemoryContext);

			MemoryContextResetAndDeleteChildren(CurrentMemoryContext);

			/*
B
Bruce Momjian 已提交
810 811 812
			 * If this was a transaction control statement, commit it and
			 * arrange to start a new xact command for the next command
			 * (if any).
813 814
			 */
			if (isTransactionStmt)
815
			{
816 817
				finish_xact_command();
				xact_started = false;
818 819
			}

B
Bruce Momjian 已提交
820 821 822
		}						/* end loop over queries generated from a
								 * parsetree */
	}							/* end loop over parsetrees */
823 824 825 826 827 828

	/*
	 * Close down transaction statement, if one is open.
	 */
	if (xact_started)
		finish_xact_command();
829

830
	debug_query_string = NULL;	/* used by pgmonitor */
831 832
}

833 834 835 836 837 838 839 840 841 842 843 844 845 846
/*
 * Convenience routines for starting/committing a single command.
 */
static void
start_xact_command(void)
{
	if (DebugLvl >= 1)
		elog(DEBUG, "StartTransactionCommand");
	StartTransactionCommand();
}

static void
finish_xact_command(void)
{
847 848 849 850
	/* Invoke IMMEDIATE constraint triggers */
	DeferredTriggerEndQuery();

	/* Now commit the command */
851 852
	if (DebugLvl >= 1)
		elog(DEBUG, "CommitTransactionCommand");
853

854
	CommitTransactionCommand();
855

856
#ifdef SHOW_MEMORY_STATS
857
	/* Print mem stats at each commit for leak tracking */
858 859 860 861 862 863
	if (ShowStats)
		MemoryContextStats(TopMemoryContext);
#endif
}


864
/* --------------------------------
865
 *		signal handler routines used in PostgresMain()
866 867 868
 * --------------------------------
 */

869
/*
T
Tom Lane 已提交
870
 * quickdie() occurs when signalled SIGQUIT by the postmaster.
871 872 873 874
 *
 * Some backend has bought the farm,
 * so we need to stop what we're doing and exit.
 */
T
Tom Lane 已提交
875
void
876
quickdie(SIGNAL_ARGS)
877
{
878
	PG_SETMASK(&BlockSig);
879
	elog(NOTICE, "Message from PostgreSQL backend:"
880
		 "\n\tThe Postmaster has informed me that some other backend"
881
		 "\n\tdied abnormally and possibly corrupted shared memory."
882
		 "\n\tI have rolled back the current transaction and am"
883
	   "\n\tgoing to terminate your database system connection and exit."
884
	"\n\tPlease reconnect to the database system and repeat your query.");
885

886
	/*
887 888 889 890
	 * DO NOT proc_exit() -- we're here because shared memory may be
	 * corrupted, so we don't want to try to clean up our transaction.
	 * Just nail the windows shut and get out of town.
	 *
B
Bruce Momjian 已提交
891 892 893 894
	 * Note we do exit(1) not exit(0).	This is to force the postmaster into
	 * a system reset cycle if some idiot DBA sends a manual SIGQUIT to a
	 * random backend.	This is necessary precisely because we don't clean
	 * up our shared memory state.
895 896
	 */

897
	exit(1);
898 899
}

900
/*
901 902
 * Shutdown signal from postmaster: abort transaction and exit
 * at soonest convenient time
903
 */
904
void
905
die(SIGNAL_ARGS)
906
{
907 908 909
	int			save_errno = errno;

	/* Don't joggle the elbow of proc_exit */
B
Bruce Momjian 已提交
910
	if (!proc_exit_inprogress)
911
	{
912
		InterruptPending = true;
913
		ProcDiePending = true;
B
Bruce Momjian 已提交
914

915
		/*
B
Bruce Momjian 已提交
916 917
		 * If it's safe to interrupt, and we're waiting for input or a
		 * lock, service the interrupt immediately
918
		 */
919 920
		if (ImmediateInterruptOK && InterruptHoldoffCount == 0 &&
			CritSectionCount == 0)
921
		{
922 923 924
			/* bump holdoff count to make ProcessInterrupts() a no-op */
			/* until we are done getting ready for it */
			InterruptHoldoffCount++;
925
			DisableNotifyInterrupt();
926 927
			/* Make sure HandleDeadLock won't run while shutting down... */
			LockWaitCancel();
928
			InterruptHoldoffCount--;
929 930
			ProcessInterrupts();
		}
931
	}
932 933

	errno = save_errno;
934 935
}

936
/*
937
 * Timeout or shutdown signal from postmaster during client authentication.
938
 * Simply exit(0).
939 940 941
 *
 * XXX: possible future improvement: try to send a message indicating
 * why we are disconnecting.  Problem is to be sure we don't block while
942
 * doing so, nor mess up the authentication message exchange.
943 944 945 946 947 948 949
 */
void
authdie(SIGNAL_ARGS)
{
	exit(0);
}

950
/*
951 952
 * Query-cancel signal from postmaster: abort current transaction
 * at soonest convenient time
953
 */
954
static void
955
QueryCancelHandler(SIGNAL_ARGS)
956
{
957 958
	int			save_errno = errno;

B
Bruce Momjian 已提交
959 960 961 962
	/*
	 * Don't joggle the elbow of proc_exit, nor an already-in-progress
	 * abort
	 */
963
	if (!proc_exit_inprogress && !InError)
964
	{
965 966
		InterruptPending = true;
		QueryCancelPending = true;
B
Bruce Momjian 已提交
967

968
		/*
969
		 * If it's safe to interrupt, and we're waiting for a lock,
B
Bruce Momjian 已提交
970 971
		 * service the interrupt immediately.  No point in interrupting if
		 * we're waiting for input, however.
972
		 */
973
		if (ImmediateInterruptOK && InterruptHoldoffCount == 0 &&
974
			CritSectionCount == 0)
975
		{
976 977 978 979 980 981
			/* bump holdoff count to make ProcessInterrupts() a no-op */
			/* until we are done getting ready for it */
			InterruptHoldoffCount++;
			if (LockWaitCancel())
			{
				DisableNotifyInterrupt();
T
Tom Lane 已提交
982
				InterruptHoldoffCount--;
983 984 985 986
				ProcessInterrupts();
			}
			else
				InterruptHoldoffCount--;
987
		}
988 989
	}

990
	errno = save_errno;
991 992
}

993 994 995 996 997 998 999 1000 1001
/* signal handler for floating point exception */
static void
FloatExceptionHandler(SIGNAL_ARGS)
{
	elog(ERROR, "floating point exception!"
		 " The last floating point operation either exceeded legal ranges"
		 " or was a divide by zero");
}

1002
/* SIGHUP: set flag to re-read config file at next convenient time */
1003
static void
1004
SigHupHandler(SIGNAL_ARGS)
1005
{
1006
	got_SIGHUP = true;
1007 1008
}

1009

1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
/*
 * ProcessInterrupts: out-of-line portion of CHECK_FOR_INTERRUPTS() macro
 *
 * If an interrupt condition is pending, and it's safe to service it,
 * then clear the flag and accept the interrupt.  Called only when
 * InterruptPending is true.
 */
void
ProcessInterrupts(void)
{
1020 1021
	/* OK to accept interrupt now? */
	if (InterruptHoldoffCount != 0 || CritSectionCount != 0)
1022 1023 1024 1025 1026
		return;
	InterruptPending = false;
	if (ProcDiePending)
	{
		ProcDiePending = false;
B
Bruce Momjian 已提交
1027 1028
		QueryCancelPending = false;		/* ProcDie trumps QueryCancel */
		ImmediateInterruptOK = false;	/* not idle anymore */
B
Bruce Momjian 已提交
1029
		elog(FATAL, "This connection has been terminated by the administrator.");
1030 1031 1032 1033
	}
	if (QueryCancelPending)
	{
		QueryCancelPending = false;
B
Bruce Momjian 已提交
1034
		ImmediateInterruptOK = false;	/* not idle anymore */
1035 1036 1037 1038 1039
		elog(ERROR, "Query was cancelled.");
	}
	/* If we get here, do nothing (probably, QueryCancelPending was reset) */
}

1040

1041 1042
static void
usage(char *progname)
1043
{
1044 1045 1046 1047
	printf("%s is the PostgreSQL stand-alone backend.  It is not\nintended to be used by normal users.\n\n", progname);

	printf("Usage:\n  %s [options...] [dbname]\n\n", progname);
	printf("Options:\n");
M
 
Marc G. Fournier 已提交
1048
#ifdef USE_ASSERT_CHECKING
1049
	printf("  -A 1|0          enable/disable run-time assert checking\n");
M
 
Marc G. Fournier 已提交
1050
#endif
1051 1052 1053 1054 1055 1056 1057 1058 1059
	printf("  -B NBUFFERS     number of shared buffers (default %d)\n", DEF_NBUFFERS);
	printf("  -c NAME=VALUE   set run-time parameter\n");
	printf("  -d 1-5          debugging level\n");
	printf("  -D DATADIR      database directory\n");
	printf("  -e              use European date format\n");
	printf("  -E              echo query before execution\n");
	printf("  -F              turn fsync off\n");
	printf("  -N              do not use newline as interactive query delimiter\n");
	printf("  -o FILENAME     send stdout and stderr to given file\n");
B
Bruce Momjian 已提交
1060
	printf("  -P              disable system indexes\n");
1061 1062 1063 1064 1065 1066 1067 1068 1069
	printf("  -s              show statistics after each query\n");
	printf("  -S SORT-MEM     set amount of memory for sorts (in kbytes)\n");
	printf("Developer options:\n");
	printf("  -f [s|i|n|m|h]  forbid use of some plan types\n");
	printf("  -i              do not execute queries\n");
	printf("  -O              allow system table structure changes\n");
	printf("  -t [pa|pl|ex]   show timings after each query\n");
	printf("  -W NUM          wait NUM seconds to allow attach from a debugger\n");
	printf("\nReport bugs to <pgsql-bugs@postgresql.org>.\n");
1070 1071
}

1072 1073


1074
/* ----------------------------------------------------------------
1075
 * PostgresMain
B
Bruce Momjian 已提交
1076
 *	   postgres main loop -- all backends, interactive or otherwise start here
1077
 *
1078 1079 1080 1081
 * argc/argv are the command line arguments to be used.  (When being forked
 * by the postmaster, these are not the original argv array of the process.)
 * username is the (possibly authenticated) PostgreSQL user name to be used
 * for the session.
1082 1083 1084
 * ----------------------------------------------------------------
 */
int
1085
PostgresMain(int argc, char *argv[], const char *username)
1086
{
1087
	int			flag;
1088

B
Bruce Momjian 已提交
1089
	const char *DBName = NULL;
1090
	bool		secure;
1091
	int			errs = 0;
1092
	GucContext	ctx;
1093
	char	   *tmp;
1094

1095
	int			firstchar;
1096
	StringInfo	parser_input;
M
 
Marc G. Fournier 已提交
1097

B
Bruce Momjian 已提交
1098
	char	   *potential_DataDir = NULL;
1099

1100
	/*
B
Bruce Momjian 已提交
1101 1102
	 * Catch standard options before doing much else.  This even works on
	 * systems without getopt_long.
1103 1104 1105
	 */
	if (!IsUnderPostmaster && argc > 1)
	{
B
Bruce Momjian 已提交
1106
		if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
1107 1108 1109 1110
		{
			usage(argv[0]);
			exit(0);
		}
B
Bruce Momjian 已提交
1111
		if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
1112 1113 1114 1115
		{
			puts("postgres (PostgreSQL) " PG_VERSION);
			exit(0);
		}
B
Bruce Momjian 已提交
1116
	}
1117

1118 1119 1120 1121 1122
	/*
	 * Fire up essential subsystems: error and memory management
	 *
	 * If we are running under the postmaster, this is done already.
	 */
1123
	if (!IsUnderPostmaster)
1124 1125 1126 1127 1128
	{
		EnableExceptionHandling(true);
		MemoryContextInit();
	}

1129 1130
	set_ps_display("startup");

1131 1132
	SetProcessingMode(InitProcessing);

1133
	/*
1134
	 * Set default values for command-line options.
1135
	 */
1136 1137
	Noversion = false;
	EchoQuery = false;
1138 1139 1140

	if (!IsUnderPostmaster)
	{
1141
		ResetAllOptions(true);
1142
		potential_DataDir = getenv("PGDATA");
1143
	}
1144

1145 1146
	/* Check for PGDATESTYLE environment variable */
	set_default_datestyle();
1147

1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164
	/* ----------------
	 *	parse command line arguments
	 *
	 *	There are now two styles of command line layout for the backend:
	 *
	 *	For interactive use (not started from postmaster) the format is
	 *		postgres [switches] [databasename]
	 *	If the databasename is omitted it is taken to be the user name.
	 *
	 *	When started from the postmaster, the format is
	 *		postgres [secure switches] -p databasename [insecure switches]
	 *	Switches appearing after -p came from the client (via "options"
	 *	field of connection request).  For security reasons we restrict
	 *	what these switches can do.
	 * ----------------
	 */

1165 1166 1167 1168
	/* all options are allowed until '-p' */
	secure = true;
	ctx = PGC_POSTMASTER;

1169
	while ((flag = getopt(argc, argv, "A:B:c:CD:d:Eef:FiNOPo:p:S:st:v:W:x:-:")) != EOF)
1170 1171
		switch (flag)
		{
M
 
Marc G. Fournier 已提交
1172 1173
			case 'A':
#ifdef USE_ASSERT_CHECKING
1174
				SetConfigOption("debug_assertions", optarg, ctx, true);
M
 
Marc G. Fournier 已提交
1175
#else
1176
				elog(NOTICE, "Assert checking is not compiled in");
M
 
Marc G. Fournier 已提交
1177 1178
#endif
				break;
1179

1180
			case 'B':
1181 1182 1183

				/*
				 * specify the size of buffer pool
1184
				 */
1185
				SetConfigOption("shared_buffers", optarg, ctx, true);
1186
				break;
1187

1188
			case 'C':
1189 1190 1191

				/*
				 * don't print version string
1192
				 */
1193
				Noversion = true;
1194
				break;
1195

1196
			case 'D':			/* PGDATA directory */
1197
				if (secure)
1198
					potential_DataDir = optarg;
M
 
Marc G. Fournier 已提交
1199
				break;
1200

1201
			case 'd':			/* debug level */
1202 1203
				SetConfigOption("debug_level", optarg, ctx, true);
				if (DebugLvl >= 1)
1204
					SetConfigOption("log_connections", "true", ctx, true);
M
 
Marc G. Fournier 已提交
1205
				if (DebugLvl >= 2)
1206
					SetConfigOption("debug_print_query", "true", ctx, true);
M
 
Marc G. Fournier 已提交
1207
				if (DebugLvl >= 3)
1208
					SetConfigOption("debug_print_parse", "true", ctx, true);
B
Bruce Momjian 已提交
1209
				if (DebugLvl >= 4)
1210
					SetConfigOption("debug_print_plan", "true", ctx, true);
J
Jan Wieck 已提交
1211
				if (DebugLvl >= 5)
1212
					SetConfigOption("debug_print_rewritten", "true", ctx, true);
1213
				break;
1214 1215

			case 'E':
1216 1217 1218

				/*
				 * E - echo the query the user entered
1219
				 */
1220
				EchoQuery = true;
1221
				break;
1222 1223

			case 'e':
1224 1225

				/*
1226 1227
				 * Use european date formats.
				 */
1228
				EuroDates = true;
1229
				break;
1230 1231

			case 'F':
1232 1233 1234

				/*
				 * turn off fsync
1235
				 */
1236
				SetConfigOption("fsync", "false", ctx, true);
1237
				break;
1238 1239

			case 'f':
1240 1241 1242

				/*
				 * f - forbid generation of certain plans
1243
				 */
1244
				tmp = NULL;
1245 1246 1247
				switch (optarg[0])
				{
					case 's':	/* seqscan */
1248
						tmp = "enable_seqscan";
1249 1250
						break;
					case 'i':	/* indexscan */
1251
						tmp = "enable_indexscan";
1252 1253
						break;
					case 't':	/* tidscan */
1254
						tmp = "enable_tidscan";
1255 1256
						break;
					case 'n':	/* nestloop */
1257
						tmp = "enable_nestloop";
1258 1259
						break;
					case 'm':	/* mergejoin */
1260
						tmp = "enable_mergejoin";
1261 1262
						break;
					case 'h':	/* hashjoin */
1263
						tmp = "enable_hashjoin";
1264 1265 1266 1267
						break;
					default:
						errs++;
				}
1268 1269
				if (tmp)
					SetConfigOption(tmp, "false", ctx, true);
1270 1271
				break;

1272
			case 'i':
1273
				dontExecute = true;
1274
				break;
1275

1276
			case 'N':
1277 1278 1279

				/*
				 * N - Don't use newline as a query delimiter
1280 1281 1282
				 */
				UseNewLine = 0;
				break;
1283

1284
			case 'O':
1285 1286 1287

				/*
				 * allow system table structure modifications
1288
				 */
1289 1290
				if (secure)		/* XXX safe to allow from client??? */
					allowSystemTableMods = true;
1291 1292
				break;

H
Hiroshi Inoue 已提交
1293
			case 'P':
1294 1295 1296

				/*
				 * ignore system indexes
H
Hiroshi Inoue 已提交
1297 1298 1299 1300 1301
				 */
				if (secure)		/* XXX safe to allow from client??? */
					IgnoreSystemIndexes(true);
				break;

T
Tom Lane 已提交
1302
			case 'o':
1303 1304 1305

				/*
				 * o - send output (stdout and stderr) to the given file
T
Tom Lane 已提交
1306
				 */
1307 1308
				if (secure)
					StrNCpy(OutputFileName, optarg, MAXPGPATH);
T
Tom Lane 已提交
1309 1310
				break;

1311
			case 'p':
1312 1313 1314 1315

				/*
				 * p - special flag passed if backend was forked by a
				 * postmaster.
1316
				 */
1317 1318
				if (secure)
				{
1319
					DBName = strdup(optarg);
B
Bruce Momjian 已提交
1320 1321
					secure = false;		/* subsequent switches are NOT
										 * secure */
1322
					ctx = PGC_BACKEND;
1323
				}
1324
				break;
1325

1326
			case 'S':
1327 1328 1329

				/*
				 * S - amount of sort memory to use in 1k bytes
1330
				 */
1331
				SetConfigOption("sort_mem", optarg, ctx, true);
1332
				break;
1333 1334

			case 's':
1335 1336 1337

				/*
				 * s - report usage statistics (timings) after each query
1338
				 */
1339
				SetConfigOption("show_query_stats", "true", ctx, true);
M
 
Marc G. Fournier 已提交
1340 1341
				break;

1342
			case 't':
1343
				/* ---------------
1344 1345 1346 1347 1348 1349 1350 1351 1352
				 *	tell postgres to report usage statistics (timings) for
				 *	each query
				 *
				 *	-tpa[rser] = print stats for parser time of each query
				 *	-tpl[anner] = print stats for planner time of each query
				 *	-te[xecutor] = print stats for executor time of each query
				 *	caution: -s can not be used together with -t.
				 * ----------------
				 */
1353
				tmp = NULL;
1354 1355 1356 1357
				switch (optarg[0])
				{
					case 'p':
						if (optarg[1] == 'a')
1358
							tmp = "show_parser_stats";
1359
						else if (optarg[1] == 'l')
1360
							tmp = "show_planner_stats";
1361 1362 1363 1364
						else
							errs++;
						break;
					case 'e':
1365
						tmp = "show_executor_stats";
1366 1367 1368 1369 1370
						break;
					default:
						errs++;
						break;
				}
1371 1372
				if (tmp)
					SetConfigOption(tmp, "true", ctx, true);
1373 1374
				break;

1375
			case 'v':
1376 1377
				if (secure)
					FrontendProtocol = (ProtocolVersion) atoi(optarg);
1378 1379
				break;

M
 
Marc G. Fournier 已提交
1380
			case 'W':
1381 1382 1383

				/*
				 * wait N seconds to allow attach from a debugger
M
 
Marc G. Fournier 已提交
1384 1385 1386 1387
				 */
				sleep(atoi(optarg));
				break;

1388
			case 'x':
B
Bruce Momjian 已提交
1389
#ifdef NOT_USED					/* planner/xfunc.h */
1390 1391 1392 1393 1394 1395 1396

				/*
				 * control joey hellerstein's expensive function
				 * optimization
				 */
				if (XfuncMode != 0)
				{
1397
					elog(NOTICE, "only one -x flag is allowed");
1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414
					errs++;
					break;
				}
				if (strcmp(optarg, "off") == 0)
					XfuncMode = XFUNC_OFF;
				else if (strcmp(optarg, "nor") == 0)
					XfuncMode = XFUNC_NOR;
				else if (strcmp(optarg, "nopull") == 0)
					XfuncMode = XFUNC_NOPULL;
				else if (strcmp(optarg, "nopm") == 0)
					XfuncMode = XFUNC_NOPM;
				else if (strcmp(optarg, "pullall") == 0)
					XfuncMode = XFUNC_PULLALL;
				else if (strcmp(optarg, "wait") == 0)
					XfuncMode = XFUNC_WAIT;
				else
				{
1415
					elog(NOTICE, "use -x {off,nor,nopull,nopm,pullall,wait}");
1416 1417
					errs++;
				}
1418
#endif
1419
				break;
1420

1421
			case 'c':
1422
			case '-':
1423
				{
B
Bruce Momjian 已提交
1424 1425
					char	   *name,
							   *value;
1426

B
Bruce Momjian 已提交
1427 1428 1429 1430 1431 1432 1433 1434 1435
					ParseLongOption(optarg, &name, &value);
					if (!value)
					{
						if (flag == '-')
							elog(ERROR, "--%s requires argument", optarg);
						else
							elog(ERROR, "-c %s requires argument", optarg);
					}

1436
					SetConfigOption(name, value, ctx, true);
B
Bruce Momjian 已提交
1437 1438 1439 1440 1441
					free(name);
					if (value)
						free(value);
					break;
				}
1442

1443 1444
			default:
				errs++;
T
Tom Lane 已提交
1445
				break;
1446 1447
		}

1448 1449 1450
	/*
	 * Post-processing for command line options.
	 */
1451 1452
	if (Show_query_stats &&
		(Show_parser_stats || Show_planner_stats || Show_executor_stats))
1453
	{
1454
		elog(NOTICE, "Query statistics are disabled because parser, planner, or executor statistics are on.");
1455
		SetConfigOption("show_query_stats", "false", ctx, true);
1456 1457
	}

1458
	if (!IsUnderPostmaster)
1459
	{
1460 1461 1462
		if (!potential_DataDir)
		{
			fprintf(stderr, "%s does not know where to find the database system "
1463 1464 1465
			   "data.  You must specify the directory that contains the "
				"database system either by specifying the -D invocation "
			 "option or by setting the PGDATA environment variable.\n\n",
1466 1467 1468 1469
					argv[0]);
			proc_exit(1);
		}
		SetDataDir(potential_DataDir);
1470
	}
1471
	Assert(DataDir);
1472 1473

	/*
1474
	 * Set up signal handlers and masks.
1475
	 *
1476
	 * Note that postmaster blocked all signals before forking child process,
B
Bruce Momjian 已提交
1477 1478
	 * so there is no race condition whereby we might receive a signal
	 * before we have set up the handler.
T
Tom Lane 已提交
1479 1480
	 *
	 * Also note: it's best not to use any signals that are SIG_IGNored in
B
Bruce Momjian 已提交
1481 1482 1483 1484
	 * the postmaster.	If such a signal arrives before we are able to
	 * change the handler to non-SIG_IGN, it'll get dropped.  If
	 * necessary, make a dummy handler in the postmaster to reserve the
	 * signal.
1485
	 */
1486

1487
	pqsignal(SIGHUP, SigHupHandler);	/* set flag to read config file */
B
Bruce Momjian 已提交
1488
	pqsignal(SIGINT, QueryCancelHandler);		/* cancel current query */
1489
	pqsignal(SIGTERM, die);		/* cancel current query and exit */
1490
	pqsignal(SIGQUIT, quickdie);	/* hard crash time */
B
Bruce Momjian 已提交
1491 1492
	pqsignal(SIGALRM, HandleDeadLock);	/* check for deadlock after
										 * timeout */
1493 1494 1495 1496 1497

	/*
	 * Ignore failure to write to frontend. Note: if frontend closes
	 * connection, we will notice it and exit cleanly when control next
	 * returns to outer loop.  This seems safer than forcing exit in the
1498 1499 1500
	 * midst of output during who-knows-what operation...
	 */
	pqsignal(SIGPIPE, SIG_IGN);
B
Bruce Momjian 已提交
1501
	pqsignal(SIGUSR1, SIG_IGN); /* this signal available for use */
1502

1503
	pqsignal(SIGUSR2, Async_NotifyHandler);		/* flush also sinval cache */
1504
	pqsignal(SIGFPE, FloatExceptionHandler);
1505 1506

	/*
B
Bruce Momjian 已提交
1507 1508
	 * Reset some signals that are accepted by postmaster but not by
	 * backend
1509
	 */
1510 1511
	pqsignal(SIGCHLD, SIG_DFL); /* system() requires this on some
								 * platforms */
1512 1513 1514
	pqsignal(SIGTTIN, SIG_DFL);
	pqsignal(SIGTTOU, SIG_DFL);
	pqsignal(SIGCONT, SIG_DFL);
1515
	pqsignal(SIGWINCH, SIG_DFL);
1516

1517 1518
	pqinitmask();

T
Tom Lane 已提交
1519
	/* We allow SIGQUIT (quickdie) at all times */
1520
#ifdef HAVE_SIGPROCMASK
T
Tom Lane 已提交
1521
	sigdelset(&BlockSig, SIGQUIT);
1522
#else
T
Tom Lane 已提交
1523
	BlockSig &= ~(sigmask(SIGQUIT));
1524 1525
#endif

T
Tom Lane 已提交
1526
	PG_SETMASK(&BlockSig);		/* block everything except SIGQUIT */
1527

1528

1529
	if (IsUnderPostmaster)
1530
	{
1531 1532 1533
		/* noninteractive case: nothing should be left after switches */
		if (errs || argc != optind || DBName == NULL)
		{
1534 1535
			elog(NOTICE, "%s: invalid command line arguments\nTry -? for help.",
				 argv[0]);
B
Bruce Momjian 已提交
1536 1537
			proc_exit(0);		/* not 1, that causes system-wide
								 * restart... */
1538
		}
1539
		BaseInit();
1540
	}
1541
	else
1542
	{
1543 1544 1545
		/* interactive case: database name can be last arg on command line */
		if (errs || argc - optind > 1)
		{
1546 1547
			elog(NOTICE, "%s: invalid command line arguments\nTry -? for help.",
				 argv[0]);
1548
			proc_exit(1);
1549 1550 1551
		}
		else if (argc - optind == 1)
			DBName = argv[optind];
1552
		else if ((DBName = username) == NULL)
1553
		{
1554 1555
			elog(NOTICE, "%s: user name undefined and no database specified\n",
				 argv[0]);
1556
			proc_exit(1);
1557
		}
1558

1559 1560 1561 1562 1563 1564 1565 1566
		/*
		 * On some systems our dynloader code needs the executable's
		 * pathname.  (If under postmaster, this was done already.)
		 */
		if (FindExec(pg_pathname, argv[0], "postgres") < 0)
			elog(FATAL, "%s: could not locate executable, bailing out...",
				 argv[0]);

1567
		/*
1568 1569
		 * Validate we have been given a reasonable-looking DataDir (if
		 * under postmaster, assume postmaster did this already).
1570 1571 1572
		 */
		ValidatePgVersion(DataDir);

1573
		/*
1574
		 * Create lockfile for data directory.
1575
		 */
B
Bruce Momjian 已提交
1576
		if (!CreateDataDirLockFile(DataDir, false))
1577
			proc_exit(1);
1578

1579
		XLOGPathInit();
1580
		BaseInit();
1581 1582 1583 1584 1585

		/*
		 * Start up xlog for standalone backend, and register to have it
		 * closed down at exit.
		 */
1586
		StartupXLOG();
1587
		on_shmem_exit(ShutdownXLOG, 0);
1588 1589
	}

1590 1591 1592 1593 1594 1595 1596 1597
	/*
	 * Set up additional info.
	 */

#ifdef CYR_RECODE
	SetCharSet();
#endif

1598
	/*
1599 1600 1601 1602 1603
	 * General initialization.
	 *
	 * NOTE: if you are tempted to add code in this vicinity, consider
	 * putting it inside InitPostgres() instead.  In particular, anything
	 * that involves database access should be there, not here.
1604
	 */
1605 1606
	if (DebugLvl > 1)
		elog(DEBUG, "InitPostgres");
1607
	InitPostgres(DBName, username);
1608

1609
	SetProcessingMode(NormalProcessing);
1610

1611 1612
	/*
	 * Send this backend's cancellation info to the frontend.
1613
	 */
M
 
Marc G. Fournier 已提交
1614 1615 1616
	if (whereToSendOutput == Remote &&
		PG_PROTOCOL_MAJOR(FrontendProtocol) >= 2)
	{
1617
		StringInfoData buf;
B
Bruce Momjian 已提交
1618

1619 1620 1621 1622 1623
		pq_beginmessage(&buf);
		pq_sendbyte(&buf, 'K');
		pq_sendint(&buf, (int32) MyProcPid, sizeof(int32));
		pq_sendint(&buf, (int32) MyCancelKey, sizeof(int32));
		pq_endmessage(&buf);
M
 
Marc G. Fournier 已提交
1624 1625 1626
		/* Need not flush since ReadyForQuery will do it. */
	}

1627 1628 1629
	if (!IsUnderPostmaster)
	{
		puts("\nPOSTGRES backend interactive interface ");
1630
		puts("$Revision: 1.242 $ $Date: 2001/11/10 23:51:14 $\n");
1631 1632
	}

1633 1634 1635
	/*
	 * Create the memory context we will use in the main loop.
	 *
B
Bruce Momjian 已提交
1636 1637 1638 1639
	 * QueryContext is reset once per iteration of the main loop, ie, upon
	 * completion of processing of each supplied query string. It can
	 * therefore be used for any data that should live just as long as the
	 * query string --- parse trees, for example.
1640 1641 1642 1643 1644 1645 1646
	 */
	QueryContext = AllocSetContextCreate(TopMemoryContext,
										 "QueryContext",
										 ALLOCSET_DEFAULT_MINSIZE,
										 ALLOCSET_DEFAULT_INITSIZE,
										 ALLOCSET_DEFAULT_MAXSIZE);

1647 1648 1649 1650 1651 1652 1653
	/* ----------
	 * Tell the statistics collector that we're alive and
	 * to which database we belong.
	 * ----------
	 */
	pgstat_bestart();

1654 1655
	/*
	 * POSTGRES main processing loop begins here
1656
	 *
1657 1658
	 * If an exception is encountered, processing resumes here so we abort
	 * the current transaction and start a new one.
1659 1660 1661 1662
	 */

	if (sigsetjmp(Warn_restart, 1) != 0)
	{
1663
		/*
1664
		 * NOTE: if you are tempted to add more code in this if-block,
B
Bruce Momjian 已提交
1665 1666
		 * consider the probability that it should be in
		 * AbortTransaction() instead.
1667
		 *
1668 1669
		 * Make sure we're not interrupted while cleaning up.  Also forget
		 * any pending QueryCancel request, since we're aborting anyway.
1670 1671
		 * Force InterruptHoldoffCount to a known state in case we elog'd
		 * from inside a holdoff section.
1672 1673 1674
		 */
		ImmediateInterruptOK = false;
		QueryCancelPending = false;
1675 1676
		InterruptHoldoffCount = 1;
		CritSectionCount = 0;	/* should be unnecessary, but... */
1677
		debug_query_string = NULL;		/* used by pgmonitor */
1678 1679

		/*
1680 1681 1682 1683 1684 1685
		 * Make sure we are in a valid memory context during recovery.
		 *
		 * We use ErrorContext in hopes that it will have some free space
		 * even if we're otherwise up against it...
		 */
		MemoryContextSwitchTo(ErrorContext);
1686

1687
		/* Do the recovery */
1688 1689
		if (DebugLvl >= 1)
			elog(DEBUG, "AbortCurrentTransaction");
1690
		AbortCurrentTransaction();
1691 1692

		/*
1693 1694
		 * Now return to normal top-level context and clear ErrorContext
		 * for next time.
1695 1696 1697
		 */
		MemoryContextSwitchTo(TopMemoryContext);
		MemoryContextResetAndDeleteChildren(ErrorContext);
1698 1699 1700 1701 1702

		/*
		 * Clear flag to indicate that we got out of error recovery mode
		 * successfully.  (Flag was set in elog.c before longjmp().)
		 */
1703
		InError = false;
1704 1705

		/*
1706
		 * Exit interrupt holdoff section we implicitly established above.
1707 1708
		 * (This could result in accepting a cancel or die interrupt.)
		 */
1709
		RESUME_INTERRUPTS();
1710
	}
1711

1712 1713
	Warn_restart_ready = true;	/* we can now handle elog(ERROR) */

1714
	PG_SETMASK(&UnBlockSig);
1715

1716 1717
	/*
	 * Non-error queries loop here.
1718 1719 1720 1721
	 */

	for (;;)
	{
1722
		/*
B
Bruce Momjian 已提交
1723 1724
		 * Release storage left over from prior query cycle, and create a
		 * new query input buffer in the cleared QueryContext.
1725 1726 1727 1728 1729
		 */
		MemoryContextSwitchTo(QueryContext);
		MemoryContextResetAndDeleteChildren(QueryContext);

		parser_input = makeStringInfo();
1730

1731 1732
		/*
		 * (1) tell the frontend we're ready for a new query.
1733
		 *
1734
		 * Note: this includes fflush()'ing the last of the prior output.
B
Bruce Momjian 已提交
1735
		 */
1736
		ReadyForQuery(whereToSendOutput);
B
Bruce Momjian 已提交
1737

1738 1739 1740 1741 1742 1743 1744
		/* ----------
		 * Tell the statistics collector what we've collected
		 * so far.
		 * ----------
		 */
		pgstat_report_tabstat();

1745
		if (IsTransactionBlock())
1746
		{
1747
			set_ps_display("idle in transaction");
1748 1749
			pgstat_report_activity("<IDLE> in transaction");
		}
1750
		else
1751
		{
1752
			set_ps_display("idle");
1753 1754
			pgstat_report_activity("<IDLE>");
		}
1755

1756 1757 1758 1759
		/*
		 * (2) deal with pending asynchronous NOTIFY from other backends,
		 * and enable async.c's signal handler to execute NOTIFY directly.
		 * Then set up other stuff needed before blocking for input.
1760
		 */
B
Bruce Momjian 已提交
1761 1762
		QueryCancelPending = false;		/* forget any earlier CANCEL
										 * signal */
1763 1764 1765

		EnableNotifyInterrupt();

1766 1767 1768 1769 1770 1771
		/* Allow "die" interrupt to be processed while waiting */
		ImmediateInterruptOK = true;
		/* and don't forget to detect one that already arrived */
		QueryCancelPending = false;
		CHECK_FOR_INTERRUPTS();

1772 1773
		/*
		 * (3) read a command (loop blocks here)
1774
		 */
1775
		firstchar = ReadCommand(parser_input);
1776

1777 1778
		/*
		 * (4) disable async signal conditions again.
1779
		 */
1780
		ImmediateInterruptOK = false;
B
Bruce Momjian 已提交
1781
		QueryCancelPending = false;		/* forget any CANCEL signal */
1782

1783 1784
		DisableNotifyInterrupt();

1785 1786 1787
		/*
		 * (5) check for any other interesting events that happened while
		 * we slept.
1788 1789 1790 1791 1792 1793 1794
		 */
		if (got_SIGHUP)
		{
			got_SIGHUP = false;
			ProcessConfigFile(PGC_SIGHUP);
		}

1795 1796
		/*
		 * (6) process the command.
1797
		 */
1798 1799
		switch (firstchar)
		{
1800 1801
				/*
				 * 'F' indicates a fastpath call.
1802
				 */
1803
			case 'F':
1804 1805 1806 1807 1808 1809
				/* ----------
				 * Tell the collector what we're doing
				 * ----------
				 */
				pgstat_report_activity("<FASTPATH> function call");

1810
				/* start an xact for this function invocation */
1811
				start_xact_command();
1812

1813 1814 1815
				if (HandleFunctionRequest() == EOF)
				{
					/* lost frontend connection during F message input */
1816
					proc_exit(0);
1817
				}
1818 1819 1820

				/* commit the function-invocation transaction */
				finish_xact_command();
1821
				break;
1822

1823 1824
				/*
				 * 'Q' indicates a user query
1825 1826
				 */
			case 'Q':
1827
				if (strspn(parser_input->data, " \t\r\n") == parser_input->len)
1828
				{
1829 1830 1831 1832
					/*
					 * if there is nothing in the input buffer, don't
					 * bother trying to parse and execute anything; just
					 * send back a quick NullCommand response.
1833
					 */
1834 1835
					if (IsUnderPostmaster)
						NullCommand(Remote);
1836 1837 1838
				}
				else
				{
1839 1840
					/*
					 * otherwise, process the input string.
1841
					 *
1842 1843
					 * Note: transaction command start/end is now done within
					 * pg_exec_query_string(), not here.
1844
					 */
1845
					if (Show_query_stats)
1846 1847
						ResetUsage();

1848 1849
					pgstat_report_activity(parser_input->data);

1850 1851 1852
					pg_exec_query_string(parser_input->data,
										 whereToSendOutput,
										 QueryContext);
1853

1854
					if (Show_query_stats)
1855
						ShowUsage("QUERY STATISTICS");
1856 1857 1858 1859
				}
				break;

				/* ----------------
1860 1861 1862
				 *	'X' means that the frontend is closing down the socket.
				 *	EOF means unexpected loss of frontend connection.
				 *	Either way, perform normal shutdown.
1863 1864 1865
				 * ----------------
				 */
			case 'X':
1866
			case EOF:
B
Bruce Momjian 已提交
1867

1868 1869
				/*
				 * NOTE: if you are tempted to add more code here, DON'T!
B
Bruce Momjian 已提交
1870 1871
				 * Whatever you had in mind to do should be set up as an
				 * on_proc_exit or on_shmem_exit callback, instead.
1872 1873 1874 1875
				 * Otherwise it will fail to be called during other
				 * backend-shutdown scenarios.
				 */
				proc_exit(0);
1876 1877

			default:
M
 
Marc G. Fournier 已提交
1878
				elog(ERROR, "unknown frontend message was received");
1879 1880
		}

1881
#ifdef MEMORY_CONTEXT_CHECKING
B
Bruce Momjian 已提交
1882

1883
		/*
1884 1885
		 * Check all memory after each backend loop.  This is a rather
		 * weird place to do it, perhaps.
1886
		 */
B
Bruce Momjian 已提交
1887
		MemoryContextCheck(TopMemoryContext);
1888
#endif
1889
	}							/* end of input-reading loop */
1890

1891 1892
	/* can't get here because the above loop never exits */
	Assert(false);
1893

1894
	return 1;					/* keep compiler quiet */
1895 1896
}

1897
#ifndef HAVE_GETRUSAGE
B
Bruce Momjian 已提交
1898 1899
#include "rusagestub.h"
#else
1900
#include <sys/resource.h>
1901
#endif   /* HAVE_GETRUSAGE */
1902

1903 1904
struct rusage Save_r;
struct timeval Save_t;
1905 1906

void
1907
ResetUsage(void)
1908
{
1909 1910 1911 1912 1913 1914
	struct timezone tz;

	getrusage(RUSAGE_SELF, &Save_r);
	gettimeofday(&Save_t, &tz);
	ResetBufferUsage();
/*	  ResetTupleCount(); */
1915 1916 1917
}

void
1918
ShowUsage(const char *title)
1919
{
1920
	StringInfoData str;
1921 1922 1923
	struct timeval user,
				sys;
	struct timeval elapse_t;
1924
	struct timezone tz;
1925
	struct rusage r;
1926
	char *bufusage;
1927 1928 1929

	getrusage(RUSAGE_SELF, &r);
	gettimeofday(&elapse_t, &tz);
1930 1931
	memcpy((char *) &user, (char *) &r.ru_utime, sizeof(user));
	memcpy((char *) &sys, (char *) &r.ru_stime, sizeof(sys));
1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955
	if (elapse_t.tv_usec < Save_t.tv_usec)
	{
		elapse_t.tv_sec--;
		elapse_t.tv_usec += 1000000;
	}
	if (r.ru_utime.tv_usec < Save_r.ru_utime.tv_usec)
	{
		r.ru_utime.tv_sec--;
		r.ru_utime.tv_usec += 1000000;
	}
	if (r.ru_stime.tv_usec < Save_r.ru_stime.tv_usec)
	{
		r.ru_stime.tv_sec--;
		r.ru_stime.tv_usec += 1000000;
	}

	/*
	 * the only stats we don't show here are for memory usage -- i can't
	 * figure out how to interpret the relevant fields in the rusage
	 * struct, and they change names across o/s platforms, anyway. if you
	 * can figure out what the entries mean, you can somehow extract
	 * resident set size, shared text size, and unshared data and stack
	 * sizes.
	 */
1956
	initStringInfo(&str);
1957

1958 1959
	appendStringInfo(&str, "! system usage stats:\n");
	appendStringInfo(&str,
1960 1961 1962 1963 1964 1965 1966
			"!\t%ld.%06ld elapsed %ld.%06ld user %ld.%06ld system sec\n",
			(long int) elapse_t.tv_sec - Save_t.tv_sec,
			(long int) elapse_t.tv_usec - Save_t.tv_usec,
			(long int) r.ru_utime.tv_sec - Save_r.ru_utime.tv_sec,
			(long int) r.ru_utime.tv_usec - Save_r.ru_utime.tv_usec,
			(long int) r.ru_stime.tv_sec - Save_r.ru_stime.tv_sec,
			(long int) r.ru_stime.tv_usec - Save_r.ru_stime.tv_usec);
1967
	appendStringInfo(&str,
1968 1969 1970 1971 1972
			"!\t[%ld.%06ld user %ld.%06ld sys total]\n",
			(long int) user.tv_sec,
			(long int) user.tv_usec,
			(long int) sys.tv_sec,
			(long int) sys.tv_usec);
1973
/* BeOS has rusage but only has some fields, and not these... */
1974
#if defined(HAVE_GETRUSAGE)
1975
	appendStringInfo(&str,
1976 1977 1978 1979 1980
			"!\t%ld/%ld [%ld/%ld] filesystem blocks in/out\n",
			r.ru_inblock - Save_r.ru_inblock,
	/* they only drink coffee at dec */
			r.ru_oublock - Save_r.ru_oublock,
			r.ru_inblock, r.ru_oublock);
1981
	appendStringInfo(&str,
1982 1983 1984 1985 1986 1987
		  "!\t%ld/%ld [%ld/%ld] page faults/reclaims, %ld [%ld] swaps\n",
			r.ru_majflt - Save_r.ru_majflt,
			r.ru_minflt - Save_r.ru_minflt,
			r.ru_majflt, r.ru_minflt,
			r.ru_nswap - Save_r.ru_nswap,
			r.ru_nswap);
1988
	appendStringInfo(&str,
1989 1990 1991 1992 1993 1994
	 "!\t%ld [%ld] signals rcvd, %ld/%ld [%ld/%ld] messages rcvd/sent\n",
			r.ru_nsignals - Save_r.ru_nsignals,
			r.ru_nsignals,
			r.ru_msgrcv - Save_r.ru_msgrcv,
			r.ru_msgsnd - Save_r.ru_msgsnd,
			r.ru_msgrcv, r.ru_msgsnd);
1995
	appendStringInfo(&str,
1996 1997 1998 1999
		 "!\t%ld/%ld [%ld/%ld] voluntary/involuntary context switches\n",
			r.ru_nvcsw - Save_r.ru_nvcsw,
			r.ru_nivcsw - Save_r.ru_nivcsw,
			r.ru_nvcsw, r.ru_nivcsw);
2000
#endif   /* HAVE_GETRUSAGE */
2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012

	bufusage = ShowBufferUsage();
	appendStringInfo(&str, "! postgres usage stats:\n%s", bufusage);
	pfree(bufusage);

	/* remove trailing newline */
	if (str.data[str.len-1] == '\n')
		str.data[--str.len] = '\0';

	elog(DEBUG, "%s\n%s", title, str.data);

	pfree(str.data);
2013
}
M
 
Marc G. Fournier 已提交
2014

2015 2016
#ifdef NOT_USED
static int
M
 
Marc G. Fournier 已提交
2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028
assertEnable(int val)
{
	assert_enabled = val;
	return val;
}

#ifdef ASSERT_CHECKING_TEST
int
assertTest(int val)
{
	Assert(val == 0);

2029 2030
	if (assert_enabled)
	{
M
 
Marc G. Fournier 已提交
2031 2032 2033
		/* val != 0 should be trapped by previous Assert */
		elog(NOTICE, "Assert test successfull (val = %d)", val);
	}
2034 2035
	else
		elog(NOTICE, "Assert checking is disabled (val = %d)", val);
M
 
Marc G. Fournier 已提交
2036 2037 2038 2039

	return val;
}
#endif
2040

M
 
Marc G. Fournier 已提交
2041
#endif