postgres.c 48.7 KB
Newer Older
1 2
/*-------------------------------------------------------------------------
 *
3
 * postgres.c
4
 *	  POSTGRES C Backend Interface
5
 *
B
Add:  
Bruce Momjian 已提交
6 7
 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
 * 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.196 2000/12/18 17:33:41 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
M
 
Marc G. Fournier 已提交
33 34 35
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
36
#ifdef HAVE_GETOPT_H
B
Bruce Momjian 已提交
37
#include <getopt.h>
38
#endif
39

40
#include "access/xlog.h"
41
#include "commands/async.h"
42
#include "commands/trigger.h"
43
#include "commands/variable.h"
44
#include "libpq/libpq.h"
45
#include "libpq/pqformat.h"
46
#include "libpq/pqsignal.h"
B
Bruce Momjian 已提交
47
#include "miscadmin.h"
48 49
#include "nodes/print.h"
#include "optimizer/cost.h"
50
#include "optimizer/planner.h"
51 52
#include "parser/analyze.h"
#include "parser/parse.h"
53
#include "parser/parser.h"
B
Bruce Momjian 已提交
54
#include "rewrite/rewriteHandler.h"
55 56
#include "tcop/fastpath.h"
#include "tcop/pquery.h"
B
Bruce Momjian 已提交
57
#include "tcop/tcopprot.h"
58
#include "tcop/utility.h"
59
#include "storage/proc.h"
60 61
#include "utils/exc.h"
#include "utils/guc.h"
62
#include "utils/memutils.h"
M
 
Marc G. Fournier 已提交
63
#include "utils/ps_status.h"
64
#ifdef MULTIBYTE
B
Bruce Momjian 已提交
65
#include "mb/pg_wchar.h"
66 67
#endif

M
 
Marc G. Fournier 已提交
68

69
/* ----------------
70
 *		global variables
71 72
 * ----------------
 */
73

74 75 76
extern int optind;
extern char *optarg;

77
/*
78
 * for ps display
79 80 81 82 83 84
 */
bool HostnameLookup;
bool ShowPortNumber;

bool Log_connections = false;

85
CommandDest whereToSendOutput = Debug;
86

87

88
extern void HandleDeadLock(SIGNAL_ARGS);
89

90
static bool	dontExecute = false;
91

92
/* note: these declarations had better match tcopprot.h */
B
Bruce Momjian 已提交
93
DLLIMPORT sigjmp_buf Warn_restart;
94

95
bool		Warn_restart_ready = false;
96
bool		InError = false;
97
bool		ProcDiePending = false;
98

99
static bool EchoQuery = false;	/* default don't echo */
100
char		pg_pathname[MAXPGPATH];
101
FILE	   *StatFp = NULL;
102

103
/* ----------------
104 105
 *		people who want to use EOF should #define DONTUSENEWLINE in
 *		tcop/tcopdebug.h
106 107 108
 * ----------------
 */
#ifndef TCOP_DONTUSENEWLINE
109
int			UseNewLine = 1;		/* Use newlines query delimiters (the
110 111
								 * default) */

112
#else
113
int			UseNewLine = 0;		/* Use EOF as query delimiters */
114

115
#endif	 /* TCOP_DONTUSENEWLINE */
116 117 118 119

/*
** Flags for expensive function optimization -- JMH 3/9/92
*/
120
int			XfuncMode = 0;
121 122

/* ----------------------------------------------------------------
123
 *		decls for routines only used in this file
124 125
 * ----------------------------------------------------------------
 */
126 127 128
static int	InteractiveBackend(StringInfo inBuf);
static int	SocketBackend(StringInfo inBuf);
static int	ReadCommand(StringInfo inBuf);
129 130 131 132
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);
133 134 135
static void SigHupHandler(SIGNAL_ARGS);
static void FloatExceptionHandler(SIGNAL_ARGS);
static void quickdie(SIGNAL_ARGS);
136 137 138 139 140 141 142

/*
 * 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;
143 144 145


/* ----------------------------------------------------------------
146
 *		routines to obtain user input
147 148 149 150
 * ----------------------------------------------------------------
 */

/* ----------------
151 152
 *	InteractiveBackend() is called for user interactive connections
 *	the string entered by the user is placed in its parameter inBuf.
153
 *
154
 *	EOF is returned if end-of-file input is seen; time to shut down.
155 156 157
 * ----------------
 */

158
static int
159
InteractiveBackend(StringInfo inBuf)
160
{
161 162 163
	int			c;				/* character read from getc() */
	bool		end = false;	/* end-of-input flag */
	bool		backslashSeen = false;	/* have we seen a \ ? */
164 165 166 167 168

	/* ----------------
	 *	display a prompt and obtain input from the user
	 * ----------------
	 */
169
	printf("backend> ");
170
	fflush(stdout);
171

172 173 174 175
	/* Reset inBuf to empty */
	inBuf->len = 0;
	inBuf->data[0] = '\0';

176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
	for (;;)
	{
		if (UseNewLine)
		{
			/* ----------------
			 *	if we are using \n as a delimiter, then read
			 *	characters until the \n.
			 * ----------------
			 */
			while ((c = getc(stdin)) != EOF)
			{
				if (c == '\n')
				{
					if (backslashSeen)
					{
191 192 193
						/* discard backslash from inBuf */
						inBuf->data[--inBuf->len] = '\0';
						backslashSeen = false;
194 195 196 197 198
						continue;
					}
					else
					{
						/* keep the newline character */
199
						appendStringInfoChar(inBuf, '\n');
200 201 202 203 204 205 206 207
						break;
					}
				}
				else if (c == '\\')
					backslashSeen = true;
				else
					backslashSeen = false;

208
				appendStringInfoChar(inBuf, (char) c);
209 210 211 212 213 214 215 216 217 218 219 220
			}

			if (c == EOF)
				end = true;
		}
		else
		{
			/* ----------------
			 *	otherwise read characters until EOF.
			 * ----------------
			 */
			while ((c = getc(stdin)) != EOF)
221
				appendStringInfoChar(inBuf, (char) c);
222

223
			if (inBuf->len == 0)
224 225 226 227
				end = true;
		}

		if (end)
228
			return EOF;
229 230 231 232 233 234 235 236 237 238 239 240 241

		/* ----------------
		 *	otherwise we have a user query so process it.
		 * ----------------
		 */
		break;
	}

	/* ----------------
	 *	if the query echo flag was given, print the query..
	 * ----------------
	 */
	if (EchoQuery)
242
		printf("query: %s\n", inBuf->data);
243
	fflush(stdout);
244

245
	return 'Q';
246 247 248
}

/* ----------------
249
 *	SocketBackend()		Is called for frontend-backend connections
250
 *
251 252
 *	If the input is a query (case 'Q') then the string entered by
 *	the user is placed in its parameter inBuf.
253
 *
254
 *	If the input is a fastpath function call (case 'F') then
255
 *	the function call is processed in HandleFunctionRequest()
256 257
 *	(now called from PostgresMain()).
 *
258
 *	EOF is returned if the connection is lost.
259 260 261
 * ----------------
 */

262
static int
263
SocketBackend(StringInfo inBuf)
264
{
265
	char		qtype;
266
	char		result = '\0';
267 268 269 270 271

	/* ----------------
	 *	get input from the frontend
	 * ----------------
	 */
272 273
	qtype = '?';
	if (pq_getbytes(&qtype, 1) == EOF)
274
		return EOF;
275

276
	switch (qtype)
277
	{
278 279 280 281 282
			/* ----------------
			 *	'Q': user entered a query
			 * ----------------
			 */
		case 'Q':
283
			if (pq_getstr(inBuf))
284
				return EOF;
285 286
			result = 'Q';
			break;
287

288 289 290 291 292
			/* ----------------
			 *	'F':  calling user/system functions
			 * ----------------
			 */
		case 'F':
293
			if (pq_getstr(inBuf))
294
				return EOF;		/* ignore "string" at start of F message */
295 296
			result = 'F';
			break;
297

298 299 300 301 302 303 304
			/* ----------------
			 *	'X':  frontend is exiting
			 * ----------------
			 */
		case 'X':
			result = 'X';
			break;
305

306 307 308 309 310 311 312 313
			/* ----------------
			 *	otherwise we got garbage from the frontend.
			 *
			 *	XXX are we certain that we want to do an elog(FATAL) here?
			 *		-cim 1/24/90
			 * ----------------
			 */
		default:
314
			elog(FATAL, "Socket command type %c unknown", qtype);
315
			break;
316 317
	}
	return result;
318 319 320
}

/* ----------------
321 322 323
 *		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
324
 *		call.  EOF is returned if end of file.
325 326
 * ----------------
 */
327
static int
328
ReadCommand(StringInfo inBuf)
329
{
330
	int			result;
331

332
	if (IsUnderPostmaster)
333
		result = SocketBackend(inBuf);
334
	else
335 336
		result = InteractiveBackend(inBuf);
	return result;
337 338
}

339 340 341 342 343 344

/*
 * 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.
345 346 347
 *
 * NOTE: this routine is no longer used for processing interactive queries,
 * but it is still needed for parsing of SQL function bodies.
348
 */
349
List *
350 351 352
pg_parse_and_rewrite(char *query_string,	/* string to execute */
					 Oid *typev,			/* parameter types */
					 int nargs)				/* number of parameters */
353
{
354
	List	   *raw_parsetree_list;
355
	List	   *querytree_list;
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
	List	   *list_item;

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

	/* ----------------
	 *	(2) Do parse analysis and rule rewrite.
	 * ----------------
	 */
	querytree_list = NIL;
	foreach(list_item, raw_parsetree_list)
	{
		Node   *parsetree = (Node *) lfirst(list_item);

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

398 399
	if (Debug_print_query)
		elog(DEBUG, "query: %s", query_string);
400

401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431
	if (Show_parser_stats)
		ResetUsage();

	raw_parsetree_list = parser(query_string, typev, nargs);

	if (Show_parser_stats)
	{
		fprintf(StatFp, "PARSER STATISTICS\n");
		ShowUsage();
	}

	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;

432
	/* ----------------
433
	 *	(1) Perform parse analysis.
434 435
	 * ----------------
	 */
436
	if (Show_parser_stats)
437 438
		ResetUsage();

439
	querytree_list = parse_analyze(parsetree, NULL);
440

441
	if (Show_parser_stats)
442
	{
443
		fprintf(StatFp, "PARSE ANALYSIS STATISTICS\n");
444
		ShowUsage();
445
		ResetUsage();
446 447 448
	}

	/* ----------------
449
	 *	(2) Rewrite the queries, as necessary
450
	 *
B
Bruce Momjian 已提交
451 452
	 *	rewritten queries are collected in new_list.  Note there may be
	 *	more or fewer than in the original list.
453 454
	 * ----------------
	 */
455
	new_list = NIL;
456
	foreach(list_item, querytree_list)
457
	{
458
		querytree = (Query *) lfirst(list_item);
459

460
		if (Debug_print_parse)
461
		{
462
			if (Debug_pretty_print)
B
Bruce Momjian 已提交
463
			{
464
				elog(DEBUG, "parse tree:");
J
Jan Wieck 已提交
465
				nodeDisplay(querytree);
B
Bruce Momjian 已提交
466 467
			}
			else
468
				elog(DEBUG, "parse tree: %s", nodeToString(querytree));
469
		}
470 471 472

		if (querytree->commandType == CMD_UTILITY)
		{
473 474
			/* don't rewrite utilities, just dump 'em into new_list */
			new_list = lappend(new_list, querytree);
475
		}
476
		else
477
		{
478
			/* rewrite regular queries */
479 480
			List	   *rewritten = QueryRewrite(querytree);

481
			new_list = nconc(new_list, rewritten);
482 483 484 485 486
		}
	}

	querytree_list = new_list;

487 488 489 490 491 492
	if (Show_parser_stats)
	{
		fprintf(StatFp, "REWRITER STATISTICS\n");
		ShowUsage();
	}

493
#ifdef COPY_PARSE_PLAN_TREES
494
	/* Optional debugging check: pass querytree output through copyObject() */
495 496 497
	new_list = (List *) copyObject(querytree_list);
	/* This checks both copyObject() and the equal() routines... */
	if (! equal(new_list, querytree_list))
498
		elog(NOTICE, "pg_analyze_and_rewrite: copyObject failed on parse tree");
499 500
	else
		querytree_list = new_list;
501 502
#endif

503
	if (Debug_print_rewritten)
504
	{
505
		if (Debug_pretty_print)
B
Bruce Momjian 已提交
506
		{
507
			elog(DEBUG, "rewritten parse tree:");
508
			foreach(list_item, querytree_list)
J
Jan Wieck 已提交
509
			{
510
				querytree = (Query *) lfirst(list_item);
511
				nodeDisplay(querytree);
J
Jan Wieck 已提交
512 513
				printf("\n");
			}
B
Bruce Momjian 已提交
514 515 516
		}
		else
		{
517
			elog(DEBUG, "rewritten parse tree:");
518
			foreach(list_item, querytree_list)
J
Jan Wieck 已提交
519
			{
520
				querytree = (Query *) lfirst(list_item);
521
				elog(DEBUG, "%s", nodeToString(querytree));
J
Jan Wieck 已提交
522
			}
523 524 525
		}
	}

526 527
	return querytree_list;
}
528 529


530 531 532 533 534
/* Generate a plan for a single query. */
Plan *
pg_plan_query(Query *querytree)
{
	Plan	   *plan;
535

536 537 538
	/* Utility commands have no plans. */
	if (querytree->commandType == CMD_UTILITY)
		return NULL;
539

540
	if (Show_planner_stats)
541
		ResetUsage();
542

543 544
	/* call that optimizer */
	plan = planner(querytree);
545

546
	if (Show_planner_stats)
547
	{
548
		fprintf(stderr, "PLANNER STATISTICS\n");
549 550
		ShowUsage();
	}
551

552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569
#ifdef COPY_PARSE_PLAN_TREES
	/* Optional debugging check: pass plan output through copyObject() */
	{
		Plan   *new_plan = (Plan *) copyObject(plan);

		/* equal() currently does not have routines to compare Plan nodes,
		 * so don't try to test equality here.  Perhaps fix someday?
		 */
#ifdef NOT_USED
		/* This checks both copyObject() and the equal() routines... */
		if (! equal(new_plan, plan))
			elog(NOTICE, "pg_plan_query: copyObject failed on plan tree");
		else
#endif
			plan = new_plan;
	}
#endif

570 571 572 573
	/* ----------------
	 *	Print plan if debugging.
	 * ----------------
	 */
574
	if (Debug_print_plan)
575
	{
576
		if (Debug_pretty_print)
577
		{
578
			elog(DEBUG, "plan:");
579
			nodeDisplay(plan);
580 581
		}
		else
582
			elog(DEBUG, "plan: %s", nodeToString(plan));
583 584
	}

585
	return plan;
586 587
}

588

589
/* ----------------------------------------------------------------
590
 *		pg_exec_query_string()
591 592
 *
 *		Takes a querystring, runs the parser/utilities or
593 594 595 596
 *		parser/planner/executor over it as necessary.
 *
 * Assumptions:
 *
597
 * At call, we are not inside a transaction command.
598
 *
599
 * The CurrentMemoryContext after starting a transaction command must be
600 601 602 603
 * appropriate for execution of individual queries (typically this will be
 * TransactionCommandContext).  Note that this routine resets that context
 * after each individual query, so don't store anything there that
 * must outlive the call!
604
 *
605 606
 * parse_context references a context suitable for holding the
 * parse/rewrite trees (typically this will be QueryContext).
607
 * This context *must* be longer-lived than the transaction context!
608 609 610 611 612 613 614
 * 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.
615 616 617 618 619
 *
 * ----------------------------------------------------------------
 */

void
620 621 622
pg_exec_query_string(char *query_string,	/* string to execute */
					 CommandDest dest,		/* where results should go */
					 MemoryContext parse_context) /* context for parsetrees */
623
{
624
	bool		xact_started;
625
	MemoryContext oldcontext;
626 627
	List	   *parsetree_list,
			   *parsetree_item;
628

629
	/*
630 631 632 633
	 * 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.
634
	 * (Note that this will possibly change current memory context.)
635 636 637 638 639 640 641 642 643 644
	 */
	start_xact_command();
	xact_started = true;

	/*
	 * 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.)
645 646 647
	 */
	Assert(parse_context != CurrentMemoryContext);

648 649 650 651
	/*
	 * Switch to appropriate context for constructing parsetrees.
	 */
	oldcontext = MemoryContextSwitchTo(parse_context);
652

B
Bruce Momjian 已提交
653
	/*
654 655
	 * Do basic parsing of the query or queries (this should be safe
	 * even if we are in aborted transaction state!)
656
	 */
657
	parsetree_list = pg_parse_query(query_string, NULL, 0);
658

659
	/*
660
	 * Switch back to execution context to enter the loop.
661 662 663 664
	 */
	MemoryContextSwitchTo(oldcontext);

	/*
665
	 * Run through the parsetree(s) and process each one.
666
	 */
667
	foreach(parsetree_item, parsetree_list)
668
	{
669 670 671 672
		Node   *parsetree = (Node *) lfirst(parsetree_item);
		bool	isTransactionStmt;
		List   *querytree_list,
			   *querytree_item;
673

674 675
		/* Transaction control statements need some special handling */
		isTransactionStmt = IsA(parsetree, TransactionStmt);
676

677 678 679 680 681 682 683 684 685
		/*
		 * 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
		 * 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...)
		 */
		if (IsAbortedTransactionBlockState())
686
		{
687
			bool	allowit = false;
688

689 690 691 692 693 694 695 696 697 698 699 700 701 702
			if (isTransactionStmt)
			{
				TransactionStmt *stmt = (TransactionStmt *) parsetree;

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

704
			if (! allowit)
705
			{
706 707 708 709 710 711 712 713 714 715 716 717
				/* ----------------
				 *	 the EndCommand() stuff is to tell the frontend
				 *	 that the command ended. -cim 6/1/90
				 * ----------------
				 */
				char	   *tag = "*ABORT STATE*";

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

				EndCommand(tag, dest);

718 719
				/*
				 * We continue in the loop, on the off chance that there
720 721 722 723
				 * is a COMMIT or ROLLBACK utility command later in the
				 * query string.
				 */
				continue;
724
			}
725
		}
726

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

734 735 736 737 738 739 740 741 742 743 744
		/* If we got a cancel signal in parsing or prior command, quit */
		if (QueryCancel)
			CancelQuery();

		/*
		 * OK to analyze and rewrite this query.
		 *
		 * Switch to appropriate context for constructing querytrees
		 * (again, these must outlive the execution context).
		 */
		oldcontext = MemoryContextSwitchTo(parse_context);
745

746
		querytree_list = pg_analyze_and_rewrite(parsetree);
V
Vadim B. Mikheev 已提交
747

748 749 750 751 752 753 754 755 756 757 758 759
		/*
		 * 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);
760

761 762
			/* Make sure we are in a transaction command */
			if (! xact_started)
763
			{
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783
				start_xact_command();
				xact_started = true;
			}

			/* If we got a cancel signal in analysis or prior command, quit */
			if (QueryCancel)
				CancelQuery();

			if (querytree->commandType == CMD_UTILITY)
			{
				/* ----------------
				 *	 process utility functions (create, destroy, etc..)
				 * ----------------
				 */
				if (Debug_print_query)
					elog(DEBUG, "ProcessUtility: %s", query_string);
				else if (DebugLvl > 1)
					elog(DEBUG, "ProcessUtility");

				ProcessUtility(querytree->utilityStmt, dest);
784 785 786
			}
			else
			{
787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824
				/* ----------------
				 *	 process a plannable query.
				 * ----------------
				 */
				Plan	   *plan;

				plan = pg_plan_query(querytree);

				/* if we got a cancel signal whilst planning, quit */
				if (QueryCancel)
					CancelQuery();

				/* 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)
				{
					fprintf(stderr, "EXECUTOR STATISTICS\n");
					ShowUsage();
				}
825
			}
826

827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852
			/*
			 * In a query block, we want to increment the command counter
			 * between queries so that the effects of early queries are
			 * visible to subsequent ones.  In particular we'd better
			 * do so before checking constraints.
			 */
			if (!isTransactionStmt)
				CommandCounterIncrement();

			/*
			 * Clear the execution context to recover temporary
			 * memory used by the query.  NOTE: if query string contains
			 * BEGIN/COMMIT transaction commands, execution context may
			 * now be different from what we were originally passed;
			 * so be careful to clear current context not "oldcontext".
			 */
			Assert(parse_context != CurrentMemoryContext);

			MemoryContextResetAndDeleteChildren(CurrentMemoryContext);

			/*
			 * If this was a transaction control statement, commit it
			 * and arrange to start a new xact command for the next
			 * command (if any).
			 */
			if (isTransactionStmt)
853
			{
854 855
				finish_xact_command();
				xact_started = false;
856 857
			}

858 859 860 861 862 863 864 865
		} /* end loop over queries generated from a parsetree */
	} /* end loop over parsetrees */

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

868 869 870 871 872 873 874 875 876 877 878 879 880 881
/*
 * 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)
{
882 883 884 885
	/* Invoke IMMEDIATE constraint triggers */
	DeferredTriggerEndQuery();

	/* Now commit the command */
886 887 888 889
	if (DebugLvl >= 1)
		elog(DEBUG, "CommitTransactionCommand");
	set_ps_display("commit");	/* XXX probably the wrong place to do this */
	CommitTransactionCommand();
890

891
#ifdef SHOW_MEMORY_STATS
892
	/* Print mem stats at each commit for leak tracking */
893 894 895 896 897 898
	if (ShowStats)
		MemoryContextStats(TopMemoryContext);
#endif
}


899
/* --------------------------------
900
 *		signal handler routines used in PostgresMain()
901
 *
B
Bruce Momjian 已提交
902
 *		handle_warn() catches SIGQUIT.	It forces control back to the main
903 904 905
 *		loop, just as if an internal error (elog(ERROR,...)) had occurred.
 *		elog() used to actually use kill(2) to induce a SIGQUIT to get here!
 *		But that's not 100% reliable on some systems, so now it does its own
B
Bruce Momjian 已提交
906
 *		siglongjmp() instead.
907
 *		We still provide the signal catcher so that an error quit can be
B
Bruce Momjian 已提交
908
 *		forced externally.	This should be done only with great caution,
909 910
 *		however, since an asynchronous signal could leave the system in
 *		who-knows-what inconsistent state.
911
 *
912 913 914
 *		quickdie() occurs when signalled by the postmaster.
 *		Some backend has bought the farm,
 *		so we need to stop what we're doing and exit.
915
 *
916
 *		die() performs an orderly cleanup via proc_exit()
917 918 919 920
 * --------------------------------
 */

void
921
handle_warn(SIGNAL_ARGS)
922
{
923 924
	/* Don't joggle the elbow of a critical section */
	if (CritSectionCount > 0)
925 926 927 928
	{
		QueryCancel = true;
		return;
	}
929
	siglongjmp(Warn_restart, 1);
930 931
}

932
static void
933
quickdie(SIGNAL_ARGS)
934
{
935
	PG_SETMASK(&BlockSig);
936
	elog(NOTICE, "Message from PostgreSQL backend:"
937 938 939 940 941
		 "\n\tThe Postmaster has informed me that some other backend"
		 " died abnormally and possibly corrupted shared memory."
		 "\n\tI have rolled back the current transaction and am"
		 " going to terminate your database system connection and exit."
	"\n\tPlease reconnect to the database system and repeat your query.");
942

943 944

	/*
945
	 * DO NOT proc_exit(0) -- we're here because shared memory may be
946 947 948 949
	 * corrupted, so we don't want to flush any shared state to stable
	 * storage.  Just nail the windows shut and get out of town.
	 */

950
	exit(1);
951 952
}

953 954 955
/*
 * Abort transaction and exit
 */
956
void
957
die(SIGNAL_ARGS)
958
{
959
	PG_SETMASK(&BlockSig);
960

961 962
	/* Don't joggle the elbow of a critical section */
	if (CritSectionCount > 0)
963
	{
964
		QueryCancel = true;
965
		ProcDiePending = true;
966 967
		return;
	}
968 969
	/* Don't joggle the elbow of proc_exit, either */
	if (proc_exit_inprogress)
970
		return;
971
	elog(FATAL, "The system is shutting down");
972 973 974
}

/* signal handler for floating point exception */
975
static void
976
FloatExceptionHandler(SIGNAL_ARGS)
977
{
978
	elog(ERROR, "floating point exception!"
979 980
		 " The last floating point operation either exceeded legal ranges"
		 " or was a divide by zero");
981 982
}

M
 
Marc G. Fournier 已提交
983
/* signal handler for query cancel signal from postmaster */
984
static void
985
QueryCancelHandler(SIGNAL_ARGS)
986
{
987 988
	int			save_errno = errno;

989
	QueryCancel = true;
990
	LockWaitCancel();
991
	errno = save_errno;
992 993 994 995 996
}

void
CancelQuery(void)
{
B
Bruce Momjian 已提交
997

998 999
	/*
	 * QueryCancel flag will be reset in main loop, which we reach by
M
 
Marc G. Fournier 已提交
1000 1001
	 * longjmp from elog().
	 */
1002 1003 1004
	elog(ERROR, "Query was cancelled.");
}

1005
static void
1006
SigHupHandler(SIGNAL_ARGS)
1007
{
1008
	got_SIGHUP = true;
1009 1010
}

1011

1012

1013 1014
static void
usage(char *progname)
1015
{
1016 1017 1018 1019
	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 已提交
1020
#ifdef USE_ASSERT_CHECKING
1021
	printf("  -A 1|0          enable/disable run-time assert checking\n");
M
 
Marc G. Fournier 已提交
1022
#endif
1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042
	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");
    printf("  -P              disable system indexes\n");
	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("  -L              turn off locking\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");
1043 1044
}

1045 1046


1047
/* ----------------------------------------------------------------
1048 1049
 * PostgresMain
 *     postgres main loop -- all backends, interactive or otherwise start here
1050
 *
1051 1052 1053 1054 1055
 * 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.
 * real_argc/real_argv point to the original argv array, which is needed by
 * `ps' display on some platforms. username is the (possibly authenticated)
 * PostgreSQL user name to be used for the session.
1056 1057 1058
 * ----------------------------------------------------------------
 */
int
1059
PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[], const char * username)
1060
{
1061
	int			flag;
1062

1063
	const char	   *DBName = NULL;
1064
	bool		secure = true;
1065
	int			errs = 0;
1066

1067
	int			firstchar;
1068
	StringInfo	parser_input;
M
 
Marc G. Fournier 已提交
1069

1070 1071
	char	   *remote_host;
	unsigned short remote_port;
1072

1073 1074
	char       *potential_DataDir = NULL;

1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
	/*
	 * Catch standard options before doing much else.  This even works
	 * on systems without getopt_long.
	 */
	if (!IsUnderPostmaster && argc > 1)
	{
		if (strcmp(argv[1], "--help")==0 || strcmp(argv[1], "-?")==0)
		{
			usage(argv[0]);
			exit(0);
		}
		if (strcmp(argv[1], "--version")==0 || strcmp(argv[1], "-V")==0)
		{
			puts("postgres (PostgreSQL) " PG_VERSION);
			exit(0);
		}
	}		

1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103
	/*
	 * Fire up essential subsystems: error and memory management
	 *
	 * If we are running under the postmaster, this is done already.
	 */
	if (!IsUnderPostmaster)
	{
		EnableExceptionHandling(true);
		MemoryContextInit();
	}

1104 1105
	SetProcessingMode(InitProcessing);

1106
	/*
1107
	 * Set default values for command-line options.
1108
	 */
1109 1110
	Noversion = false;
	EchoQuery = false;
1111 1112 1113 1114

	if (!IsUnderPostmaster)
	{
		ResetAllOptions();
1115
		potential_DataDir = getenv("PGDATA");
1116
	}
1117
	StatFp = stderr;
1118

1119 1120
	/* Check for PGDATESTYLE environment variable */
	set_default_datestyle();
1121

1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139
	/* ----------------
	 *	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.
	 * ----------------
	 */

	optind = 1;					/* reset after postmaster's usage */
1140

1141
	while ((flag = getopt(argc, argv,  "A:B:c:CD:d:Eef:FiLNOPo:p:S:st:v:W:x:-:")) != EOF)
1142 1143
		switch (flag)
		{
M
 
Marc G. Fournier 已提交
1144 1145 1146 1147
			case 'A':
#ifdef USE_ASSERT_CHECKING
				assert_enabled = atoi(optarg);
#else
1148
				fprintf(stderr, "Assert checking is not compiled in\n");
M
 
Marc G. Fournier 已提交
1149 1150
#endif
				break;
1151

1152 1153 1154 1155 1156
			case 'B':
				/* ----------------
				 *	specify the size of buffer pool
				 * ----------------
				 */
1157 1158
				if (secure)
					NBuffers = atoi(optarg);
1159
				break;
1160

1161 1162
			case 'C':
				/* ----------------
1163
				 *	don't print version string
1164 1165
				 * ----------------
				 */
1166
				Noversion = true;
1167
				break;
1168

1169
			case 'D':			/* PGDATA directory */
1170
				if (secure)
1171
				{
1172
					potential_DataDir = optarg;
1173
				}
M
 
Marc G. Fournier 已提交
1174
				break;
1175

1176
			case 'd':			/* debug level */
1177
				DebugLvl = atoi(optarg);
1178 1179
				if (DebugLvl >= 1);
					Log_connections = true;
M
 
Marc G. Fournier 已提交
1180
				if (DebugLvl >= 2)
1181
					Debug_print_query = true;
M
 
Marc G. Fournier 已提交
1182
				if (DebugLvl >= 3)
1183
					Debug_print_parse = true;
B
Bruce Momjian 已提交
1184
				if (DebugLvl >= 4)
1185
					Debug_print_plan = true;
J
Jan Wieck 已提交
1186
				if (DebugLvl >= 5)
1187
					Debug_print_rewritten = true;
1188
				break;
1189 1190 1191 1192 1193 1194

			case 'E':
				/* ----------------
				 *	E - echo the query the user entered
				 * ----------------
				 */
1195
				EchoQuery = true;
1196
				break;
1197 1198 1199 1200 1201 1202

			case 'e':
				/* --------------------------
				 * Use european date formats.
				 * --------------------------
				 */
1203
				EuroDates = true;
1204
				break;
1205 1206 1207 1208

			case 'F':
				/* --------------------
				 *	turn off fsync
1209 1210 1211 1212
				 *
				 *	7.0 buffer manager can support different backends running
				 *	with different fsync settings, so this no longer needs
				 *	to be "if (secure)".
1213 1214
				 * --------------------
				 */
1215
				enableFsync = false;
1216
				break;
1217 1218 1219 1220 1221 1222 1223 1224 1225

			case 'f':
				/* -----------------
				 *	  f - forbid generation of certain plans
				 * -----------------
				 */
				switch (optarg[0])
				{
					case 's':	/* seqscan */
1226
						enable_seqscan = false;
1227 1228
						break;
					case 'i':	/* indexscan */
1229 1230 1231 1232
						enable_indexscan = false;
						break;
					case 't':	/* tidscan */
						enable_tidscan = false;
1233 1234
						break;
					case 'n':	/* nestloop */
1235
						enable_nestloop = false;
1236 1237
						break;
					case 'm':	/* mergejoin */
1238
						enable_mergejoin = false;
1239 1240
						break;
					case 'h':	/* hashjoin */
1241
						enable_hashjoin = false;
1242 1243 1244 1245
						break;
					default:
						errs++;
				}
1246 1247
				break;

1248
			case 'i':
1249
				dontExecute = true;
1250
				break;
1251

1252 1253 1254 1255 1256
			case 'L':
				/* --------------------
				 *	turn off locking
				 * --------------------
				 */
1257 1258
				if (secure)
					lockingOff = 1;
T
Tom Lane 已提交
1259 1260
				break;

1261 1262 1263 1264 1265 1266 1267
			case 'N':
				/* ----------------
				 *	N - Don't use newline as a query delimiter
				 * ----------------
				 */
				UseNewLine = 0;
				break;
1268

1269 1270 1271 1272 1273
			case 'O':
				/* --------------------
				 *	allow system table structure modifications
				 * --------------------
				 */
1274 1275
				if (secure)		/* XXX safe to allow from client??? */
					allowSystemTableMods = true;
1276 1277
				break;

H
Hiroshi Inoue 已提交
1278 1279 1280 1281 1282 1283 1284 1285 1286
			case 'P':
				/* --------------------
				 *	ignore system indexes
				 * --------------------
				 */
				if (secure)		/* XXX safe to allow from client??? */
					IgnoreSystemIndexes(true);
				break;

T
Tom Lane 已提交
1287 1288 1289 1290 1291
			case 'o':
				/* ----------------
				 *	o - send output (stdout and stderr) to the given file
				 * ----------------
				 */
1292 1293
				if (secure)
					StrNCpy(OutputFileName, optarg, MAXPGPATH);
T
Tom Lane 已提交
1294 1295
				break;

1296
			case 'p':
1297 1298 1299 1300 1301
				/* ----------------
				 *	p - special flag passed if backend was forked
				 *		by a postmaster.
				 * ----------------
				 */
1302 1303
				if (secure)
				{
1304
					DBName = strdup(optarg);
B
Bruce Momjian 已提交
1305 1306
					secure = false;		/* subsequent switches are NOT
										 * secure */
1307
				}
1308
				break;
1309

1310 1311
			case 'S':
				/* ----------------
V
Vadim B. Mikheev 已提交
1312
				 *	S - amount of sort memory to use in 1k bytes
1313 1314
				 * ----------------
				 */
1315
				{
1316 1317
					int			S;

V
Vadim B. Mikheev 已提交
1318
					S = atoi(optarg);
1319
					if (S >= 4 * BLCKSZ / 1024)
V
Vadim B. Mikheev 已提交
1320
						SortMem = S;
1321
				}
1322
				break;
1323 1324 1325 1326 1327 1328

			case 's':
				/* ----------------
				 *	  s - report usage statistics (timings) after each query
				 * ----------------
				 */
1329
				Show_query_stats = 1;
M
 
Marc G. Fournier 已提交
1330 1331
				break;

1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346
			case 't':
				/* ----------------
				 *	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.
				 * ----------------
				 */
				switch (optarg[0])
				{
					case 'p':
						if (optarg[1] == 'a')
1347
							Show_parser_stats = 1;
1348
						else if (optarg[1] == 'l')
1349
							Show_planner_stats = 1;
1350 1351 1352 1353
						else
							errs++;
						break;
					case 'e':
1354
						Show_executor_stats = 1;
1355 1356 1357 1358 1359
						break;
					default:
						errs++;
						break;
				}
1360 1361
				break;

1362
			case 'v':
1363 1364
				if (secure)
					FrontendProtocol = (ProtocolVersion) atoi(optarg);
1365 1366
				break;

M
 
Marc G. Fournier 已提交
1367 1368
			case 'W':
				/* ----------------
1369
				 *	wait N seconds to allow attach from a debugger
M
 
Marc G. Fournier 已提交
1370 1371 1372 1373 1374
				 * ----------------
				 */
				sleep(atoi(optarg));
				break;

1375
			case 'x':
B
Bruce Momjian 已提交
1376
#ifdef NOT_USED					/* planner/xfunc.h */
1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404

				/*
				 * control joey hellerstein's expensive function
				 * optimization
				 */
				if (XfuncMode != 0)
				{
					fprintf(stderr, "only one -x flag is allowed\n");
					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
				{
					fprintf(stderr, "use -x {off,nor,nopull,nopm,pullall,wait}\n");
					errs++;
				}
1405
#endif
1406
				break;
1407

1408
			case 'c':
1409 1410
			case '-':
			{
1411
				char *name, *value;
1412

1413 1414
				ParseLongOption(optarg, &name, &value);
				if (!value)
1415 1416 1417 1418 1419 1420
				{
					if (flag == '-')
						elog(ERROR, "--%s requires argument", optarg);
					else
						elog(ERROR, "-c %s requires argument", optarg);
				}
1421

1422 1423 1424
				/* all options are allowed if not under postmaster */
				SetConfigOption(name, value, 
					(IsUnderPostmaster) ? PGC_BACKEND : PGC_POSTMASTER);
1425 1426 1427
				free(name);
				if (value)
					free(value);
1428 1429 1430
				break;
			}

1431 1432
			default:
				errs++;
T
Tom Lane 已提交
1433
				break;
1434 1435
		}

1436 1437 1438 1439 1440 1441
	/*
	 * Post-processing for command line options.
	 *
	 * XXX It'd be nice if libpq were already running here, so we could do
	 * elog(NOTICE) instead of just writing on stderr...
	 */
1442 1443
	if (Show_query_stats &&
		(Show_parser_stats || Show_planner_stats || Show_executor_stats))
1444
	{
1445
		fprintf(stderr, "Query statistics are disabled because parser, planner, or executor statistics are on.\n");
1446
		Show_query_stats = false;
1447 1448
	}

1449
	if (!IsUnderPostmaster)
1450
	{
1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
		if (!potential_DataDir)
		{
			fprintf(stderr, "%s does not know where to find the database system "
					"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",
					argv[0]);
			proc_exit(1);
		}
		SetDataDir(potential_DataDir);
1461
	}
1462
	Assert(DataDir);
1463 1464

	/*
1465 1466 1467
	 * 1. Set BlockSig and UnBlockSig masks. 2. Set up signal handlers. 3.
	 * Allow only SIGUSR1 signal (we never block it) during
	 * initialization.
1468 1469 1470
	 *
	 * Note that postmaster already blocked ALL signals to make us happy.
	 */
1471
	pqinitmask();
1472 1473 1474 1475 1476 1477 1478

#ifdef HAVE_SIGPROCMASK
	sigdelset(&BlockSig, SIGUSR1);
#else
	BlockSig &= ~(sigmask(SIGUSR1));
#endif

1479 1480
	PG_SETMASK(&BlockSig);		/* block everything except SIGUSR1 */

1481
	pqsignal(SIGHUP, SigHupHandler);	/* set flag to read config file */
1482 1483
	pqsignal(SIGINT, QueryCancelHandler);		/* cancel current query */
	pqsignal(SIGQUIT, handle_warn);		/* handle error */
1484 1485
	pqsignal(SIGTERM, die);
	pqsignal(SIGALRM, HandleDeadLock);
1486 1487 1488 1489 1490

	/*
	 * 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
1491 1492 1493 1494
	 * midst of output during who-knows-what operation...
	 */
	pqsignal(SIGPIPE, SIG_IGN);
	pqsignal(SIGUSR1, quickdie);
1495
	pqsignal(SIGUSR2, Async_NotifyHandler);		/* flush also sinval cache */
1496
	pqsignal(SIGFPE, FloatExceptionHandler);
1497
	pqsignal(SIGCHLD, SIG_IGN); /* ignored, sent by LockOwners */
1498 1499 1500 1501
	pqsignal(SIGTTIN, SIG_DFL);
	pqsignal(SIGTTOU, SIG_DFL);
	pqsignal(SIGCONT, SIG_DFL);

1502

1503
	if (IsUnderPostmaster)
1504
	{
1505 1506 1507
		/* noninteractive case: nothing should be left after switches */
		if (errs || argc != optind || DBName == NULL)
		{
1508 1509
			fprintf(stderr, "%s: invalid command line arguments\nTry -? for help.\n", argv[0]);
			proc_exit(1);
1510
		}
1511 1512 1513
		pq_init();				/* initialize libpq at backend startup */
		whereToSendOutput = Remote;
		BaseInit();
1514
	}
1515
	else
1516
	{
1517
		/* interactive case: database name can be last arg on command line */
1518
		whereToSendOutput = Debug;
1519 1520
		if (errs || argc - optind > 1)
		{
1521 1522
			fprintf(stderr, "%s: invalid command line arguments\nTry -? for help.\n", argv[0]);
			proc_exit(1);
1523 1524 1525
		}
		else if (argc - optind == 1)
			DBName = argv[optind];
1526
		else if ((DBName = username) == NULL)
1527
		{
1528
			fprintf(stderr, "%s: user name undefined and no database specified\n",
1529
					argv[0]);
1530
			proc_exit(1);
1531
		}
1532 1533

		/*
1534
		 * Create lockfile for data directory.
1535
		 */
1536 1537
		if (! CreateDataDirLockFile(DataDir, false))
			proc_exit(1);
1538

1539
		XLOGPathInit();
1540
		BaseInit();
1541 1542 1543 1544 1545

		/*
		 * Start up xlog for standalone backend, and register to have it
		 * closed down at exit.
		 */
1546
		StartupXLOG();
1547
		on_shmem_exit(ShutdownXLOG, 0);
1548 1549
	}

1550 1551 1552 1553 1554 1555 1556 1557
	/*
	 * Set up additional info.
	 */

#ifdef CYR_RECODE
	SetCharSet();
#endif

1558
	/* On some systems our dynloader code needs the executable's pathname */
1559
	if (FindExec(pg_pathname, real_argv[0], "postgres") < 0)
1560
		elog(FATAL, "%s: could not locate executable, bailing out...",
1561
			 real_argv[0]);
1562

M
 
Marc G. Fournier 已提交
1563 1564 1565
	/*
	 * Find remote host name or address.
	 */
1566 1567
	remote_host = NULL;

1568 1569
	if (IsUnderPostmaster)
	{
1570
		if (MyProcPort->raddr.sa.sa_family == AF_INET)
1571
		{
1572 1573
			struct hostent *host_ent;
			char * host_addr;
M
 
Marc G. Fournier 已提交
1574

1575 1576 1577 1578 1579 1580 1581 1582
			remote_port = ntohs(MyProcPort->raddr.in.sin_port);
			host_addr = inet_ntoa(MyProcPort->raddr.in.sin_addr);

			if (HostnameLookup)
			{
				host_ent = gethostbyaddr((char *) &MyProcPort->raddr.in.sin_addr, sizeof(MyProcPort->raddr.in.sin_addr), AF_INET);

				if (host_ent)
1583
				{
1584 1585
					remote_host = palloc(strlen(host_addr) + strlen(host_ent->h_name) + 3);
					sprintf(remote_host, "%s[%s]", host_ent->h_name, host_addr);
M
 
Marc G. Fournier 已提交
1586
				}
1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598
			}

			if (remote_host == NULL)
				remote_host = pstrdup(host_addr);

			if (ShowPortNumber)
			{
				char * str = palloc(strlen(remote_host) + 7);
				sprintf(str, "%s:%hu", remote_host, remote_port);
				pfree(remote_host);
				remote_host = str;
			}
M
 
Marc G. Fournier 已提交
1599
		}
1600 1601 1602
		else /* not AF_INET */
			remote_host = "[local]";

1603

1604
		/*
1605 1606 1607 1608 1609 1610
		 * Set process parameters for ps
		 *
		 * WARNING: On some platforms the environment will be moved
		 * around to make room for the ps display string. So any
		 * references to optarg or getenv() from above will be invalid
		 * after this call. Better use strdup or something similar.
1611
		 */
1612
		init_ps_display(real_argc, real_argv, username, DBName, remote_host);
1613
		set_ps_display("startup");
1614 1615
	}

1616 1617
	if (Log_connections)
		elog(DEBUG, "connection: host=%s user=%s database=%s",
1618
			 remote_host, username, DBName);
1619

1620
	/*
1621 1622 1623 1624 1625
	 * 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.
1626
	 */
1627 1628
	if (DebugLvl > 1)
		elog(DEBUG, "InitPostgres");
1629
	InitPostgres(DBName, username);
1630

1631
	SetProcessingMode(NormalProcessing);
1632

1633 1634
	/*
	 * Send this backend's cancellation info to the frontend.
1635
	 */
M
 
Marc G. Fournier 已提交
1636 1637 1638
	if (whereToSendOutput == Remote &&
		PG_PROTOCOL_MAJOR(FrontendProtocol) >= 2)
	{
1639
		StringInfoData buf;
B
Bruce Momjian 已提交
1640

1641 1642 1643 1644 1645
		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 已提交
1646 1647 1648
		/* Need not flush since ReadyForQuery will do it. */
	}

1649 1650 1651
	if (!IsUnderPostmaster)
	{
		puts("\nPOSTGRES backend interactive interface ");
1652
		puts("$Revision: 1.196 $ $Date: 2000/12/18 17:33:41 $\n");
1653 1654
	}

1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668
	/*
	 * Create the memory context we will use in the main loop.
	 *
	 * 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.
	 */
	QueryContext = AllocSetContextCreate(TopMemoryContext,
										 "QueryContext",
										 ALLOCSET_DEFAULT_MINSIZE,
										 ALLOCSET_DEFAULT_INITSIZE,
										 ALLOCSET_DEFAULT_MAXSIZE);

1669 1670
	/*
	 * POSTGRES main processing loop begins here
1671
	 *
1672 1673
	 * If an exception is encountered, processing resumes here so we abort
	 * the current transaction and start a new one.
1674 1675 1676 1677
	 */

	if (sigsetjmp(Warn_restart, 1) != 0)
	{
1678
		/*
1679 1680 1681 1682
		 * NOTE: if you are tempted to add more code in this if-block,
		 * consider the probability that it should be in AbortTransaction()
		 * instead.
		 *
1683 1684 1685 1686 1687 1688
		 * 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);
1689

1690
		/* Do the recovery */
1691 1692
		if (DebugLvl >= 1)
			elog(DEBUG, "AbortCurrentTransaction");
1693
		AbortCurrentTransaction();
1694 1695

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

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

1709 1710
	Warn_restart_ready = true;	/* we can now handle elog(ERROR) */

1711
	PG_SETMASK(&UnBlockSig);
1712

1713 1714
	/*
	 * Non-error queries loop here.
1715 1716 1717 1718
	 */

	for (;;)
	{
1719 1720 1721 1722 1723 1724 1725 1726
		/*
		 * Release storage left over from prior query cycle, and
		 * create a new query input buffer in the cleared QueryContext.
		 */
		MemoryContextSwitchTo(QueryContext);
		MemoryContextResetAndDeleteChildren(QueryContext);

		parser_input = makeStringInfo();
1727

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

1736
		/* ----------------
1737
		 *	 (2) deal with pending asynchronous NOTIFY from other backends,
B
Bruce Momjian 已提交
1738
		 *	 and enable async.c's signal handler to execute NOTIFY directly.
1739 1740 1741
		 * ----------------
		 */
		QueryCancel = false;	/* forget any earlier CANCEL signal */
1742
		SetWaitingForLock(false);
1743 1744 1745 1746

		EnableNotifyInterrupt();

		/* ----------------
1747
		 *	 (3) read a command (loop blocks here)
1748 1749
		 * ----------------
		 */
1750 1751
		set_ps_display("idle");

1752
		firstchar = ReadCommand(parser_input);
1753

1754
		QueryCancel = false;	/* forget any earlier CANCEL signal */
1755

1756
		/* ----------------
1757 1758 1759 1760 1761 1762
		 *	 (4) disable async.c's signal handler.
		 * ----------------
		 */
		DisableNotifyInterrupt();

		/* ----------------
1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774
		 *	 (5) check for any other interesting events that happened
		 *		 while we slept.
		 * ----------------
		 */
		if (got_SIGHUP)
		{
			got_SIGHUP = false;
			ProcessConfigFile(PGC_SIGHUP);
		}

		/* ----------------
		 *	 (6) process the command.
1775 1776
		 * ----------------
		 */
1777 1778 1779
		switch (firstchar)
		{
				/* ----------------
1780
				 *	'F' indicates a fastpath call.
1781 1782
				 * ----------------
				 */
1783 1784
			case 'F':
				/* start an xact for this function invocation */
1785
				start_xact_command();
1786

1787 1788 1789
				if (HandleFunctionRequest() == EOF)
				{
					/* lost frontend connection during F message input */
1790
					proc_exit(0);
1791
				}
1792 1793 1794

				/* commit the function-invocation transaction */
				finish_xact_command();
1795
				break;
1796

1797 1798 1799 1800 1801
				/* ----------------
				 *	'Q' indicates a user query
				 * ----------------
				 */
			case 'Q':
1802
				if (strspn(parser_input->data, " \t\r\n") == parser_input->len)
1803 1804 1805
				{
					/* ----------------
					 *	if there is nothing in the input buffer, don't bother
1806 1807
					 *	trying to parse and execute anything; just send
					 *	back a quick NullCommand response.
1808 1809
					 * ----------------
					 */
1810 1811
					if (IsUnderPostmaster)
						NullCommand(Remote);
1812 1813 1814 1815 1816
				}
				else
				{
					/* ----------------
					 *	otherwise, process the input string.
1817 1818 1819
					 *
					 * Note: transaction command start/end is now done
					 * within pg_exec_query_string(), not here.
1820 1821
					 * ----------------
					 */
1822
					if (Show_query_stats)
1823 1824
						ResetUsage();

1825 1826 1827
					pg_exec_query_string(parser_input->data,
										 whereToSendOutput,
										 QueryContext);
1828

1829
					if (Show_query_stats)
1830 1831
					{
						fprintf(StatFp, "QUERY STATISTICS\n");
1832
						ShowUsage();
1833
					}
1834 1835 1836 1837
				}
				break;

				/* ----------------
1838 1839 1840
				 *	'X' means that the frontend is closing down the socket.
				 *	EOF means unexpected loss of frontend connection.
				 *	Either way, perform normal shutdown.
1841 1842 1843
				 * ----------------
				 */
			case 'X':
1844
			case EOF:
1845 1846 1847 1848 1849 1850 1851 1852
				/*
				 * NOTE: if you are tempted to add more code here, DON'T!
				 * Whatever you had in mind to do should be set up as
				 * an on_proc_exit or on_shmem_exit callback, instead.
				 * Otherwise it will fail to be called during other
				 * backend-shutdown scenarios.
				 */
				proc_exit(0);
1853 1854

			default:
M
 
Marc G. Fournier 已提交
1855
				elog(ERROR, "unknown frontend message was received");
1856 1857
		}

1858 1859
#ifdef MEMORY_CONTEXT_CHECKING
		/*
1860 1861
		 * Check all memory after each backend loop.  This is a rather
		 * weird place to do it, perhaps.
1862 1863 1864
		 */
		MemoryContextCheck(TopMemoryContext);	
#endif
1865
	}							/* end of input-reading loop */
1866

1867 1868
	/* can't get here because the above loop never exits */
	Assert(false);
1869

1870
	return 1;					/* keep compiler quiet */
1871 1872
}

1873
#ifndef HAVE_GETRUSAGE
B
Bruce Momjian 已提交
1874 1875
#include "rusagestub.h"
#else
1876
#include <sys/resource.h>
1877
#endif	 /* HAVE_GETRUSAGE */
1878

1879 1880
struct rusage Save_r;
struct timeval Save_t;
1881 1882

void
1883
ResetUsage(void)
1884
{
1885 1886 1887 1888 1889 1890
	struct timezone tz;

	getrusage(RUSAGE_SELF, &Save_r);
	gettimeofday(&Save_t, &tz);
	ResetBufferUsage();
/*	  ResetTupleCount(); */
1891 1892 1893
}

void
1894
ShowUsage(void)
1895
{
1896 1897 1898
	struct timeval user,
				sys;
	struct timeval elapse_t;
1899
	struct timezone tz;
1900
	struct rusage r;
1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921

	getrusage(RUSAGE_SELF, &r);
	gettimeofday(&elapse_t, &tz);
	memmove((char *) &user, (char *) &r.ru_utime, sizeof(user));
	memmove((char *) &sys, (char *) &r.ru_stime, sizeof(sys));
	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;
	}

1922 1923 1924 1925 1926 1927
	/*
	 * Set output destination if not otherwise set
	 */
	if (StatFp == NULL)
		StatFp = stderr;

1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951
	/*
	 * 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.
	 */

	fprintf(StatFp, "! system usage stats:\n");
	fprintf(StatFp,
			"!\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);
	fprintf(StatFp,
			"!\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);
1952 1953
/* BeOS has rusage but only has some fields, and not these... */
#if defined(HAVE_GETRUSAGE) && !defined(__BEOS__)
1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978
	fprintf(StatFp,
			"!\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);
	fprintf(StatFp,
		  "!\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);
	fprintf(StatFp,
	 "!\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);
	fprintf(StatFp,
		 "!\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);
1979
#endif	 /* HAVE_GETRUSAGE */
1980 1981 1982
	fprintf(StatFp, "! postgres usage stats:\n");
	PrintBufferUsage(StatFp);
/*	   DisplayTupleCount(StatFp); */
1983
}
M
 
Marc G. Fournier 已提交
1984

1985 1986
#ifdef NOT_USED
static int
M
 
Marc G. Fournier 已提交
1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998
assertEnable(int val)
{
	assert_enabled = val;
	return val;
}

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

1999 2000
	if (assert_enabled)
	{
M
 
Marc G. Fournier 已提交
2001 2002 2003
		/* val != 0 should be trapped by previous Assert */
		elog(NOTICE, "Assert test successfull (val = %d)", val);
	}
2004 2005
	else
		elog(NOTICE, "Assert checking is disabled (val = %d)", val);
M
 
Marc G. Fournier 已提交
2006 2007 2008

	return val;
}
2009

M
 
Marc G. Fournier 已提交
2010 2011
#endif
#endif