mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	From: Massimo Dal Zotto <dz@cs.unitn.it>
assert.patch
        adds a switch to turn on/off the assert checking if enabled at compile
        time. You can now compile postgres with assert checking and disable it
        at runtime in a production environment.
			
			
This commit is contained in:
		
							parent
							
								
									1682c362a3
								
							
						
					
					
						commit
						1a5fb65463
					
				| @ -10,7 +10,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.93 1998/07/09 03:28:47 scrappy Exp $ | ||||
|  *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.94 1998/08/25 21:04:36 scrappy Exp $ | ||||
|  * | ||||
|  * NOTES | ||||
|  * | ||||
| @ -238,6 +238,9 @@ void GetCharSetByHost(char *, int, char *); | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| #ifdef USE_ASSERT_CHECKING | ||||
| int assert_enabled = 1; | ||||
| #endif | ||||
| 
 | ||||
| static void | ||||
| checkDataDir(const char *DataDir, bool *DataDirOK) | ||||
| @ -295,8 +298,6 @@ checkDataDir(const char *DataDir, bool *DataDirOK) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| int | ||||
| PostmasterMain(int argc, char *argv[]) | ||||
| { | ||||
| @ -365,10 +366,22 @@ PostmasterMain(int argc, char *argv[]) | ||||
| 	DataDir = getenv("PGDATA"); /* default value */ | ||||
| 
 | ||||
| 	opterr = 0; | ||||
| 	while ((opt = getopt(nonblank_argc, argv, "a:B:b:D:dim:Mno:p:Ss")) != EOF) | ||||
| 	while ((opt = getopt(nonblank_argc, argv,"A:a:B:b:D:dim:Mno:p:Ss")) != EOF) | ||||
| 	{ | ||||
| 		switch (opt) | ||||
| 		{ | ||||
| 			case 'A': | ||||
| #ifndef USE_ASSERT_CHECKING | ||||
| 				fprintf(stderr, "Assert checking is not enabled\n"); | ||||
| #else | ||||
| 				/*
 | ||||
| 				 * Pass this option also to each backend. | ||||
| 				 */ | ||||
| 				assert_enabled = atoi(optarg); | ||||
| 				strcat(ExtraOptions, " -A "); | ||||
| 				strcat(ExtraOptions, optarg); | ||||
| #endif | ||||
| 				break; | ||||
| 			case 'a': | ||||
| 				/* Can no longer set authentication method. */ | ||||
| 				break; | ||||
| @ -566,6 +579,9 @@ static void | ||||
| usage(const char *progname) | ||||
| { | ||||
| 	fprintf(stderr, "usage: %s [options]\n", progname); | ||||
| #ifdef USE_ASSERT_CHECKING | ||||
| 	fprintf(stderr, "\t-A [1|0]\tenable/disable runtime assert checking\n"); | ||||
| #endif | ||||
| 	fprintf(stderr, "\t-B nbufs\tset number of shared buffers\n"); | ||||
| 	fprintf(stderr, "\t-D datadir\tset data directory\n"); | ||||
| 	fprintf(stderr, "\t-S \t\tsilent mode (disassociate from tty)\n"); | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.84 1998/08/25 15:00:17 thomas Exp $ | ||||
|  *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.85 1998/08/25 21:04:38 scrappy Exp $ | ||||
|  * | ||||
|  * NOTES | ||||
|  *	  this is the "main" module of the postgres backend and | ||||
| @ -850,6 +850,9 @@ usage(char *progname) | ||||
| { | ||||
| 	fprintf(stderr, | ||||
| 			"Usage: %s [options] [dbname]\n", progname); | ||||
| #ifdef USE_ASSERT_CHECKING | ||||
| 	fprintf(stderr, "    A: enable/disable assert checking\n"); | ||||
| #endif | ||||
| 	fprintf(stderr, "\t-B buffers\tset number of buffers in buffer pool\n"); | ||||
| 	fprintf(stderr, "\t-C \t\tsupress version info\n"); | ||||
| 	fprintf(stderr, "\t-D dir\t\tdata directory\n"); | ||||
| @ -866,6 +869,7 @@ usage(char *progname) | ||||
| 	fprintf(stderr, "\t-o file\t\tsend stdout and stderr to given filename \n"); | ||||
| 	fprintf(stderr, "\t-s \t\tshow stats after each query\n"); | ||||
| 	fprintf(stderr, "\t-v version\tset protocol version being used by frontend\n"); | ||||
| 	fprintf(stderr, "\t-W \t\twait N seconds to allow attach from a debugger\n"); | ||||
| } | ||||
| 
 | ||||
| /* ----------------------------------------------------------------
 | ||||
| @ -943,10 +947,22 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) | ||||
| 
 | ||||
|     optind = 1; /* reset after postmaster usage */ | ||||
| 	 | ||||
| 	while ((flag = getopt(argc, argv, "B:bCD:d:Eef:iK:Lm:MNo:P:pQS:st:v:x:F")) | ||||
| 	while ((flag = getopt(argc, argv, | ||||
| 						  "A:B:bCD:d:Eef:iK:Lm:MNo:P:pQS:st:v:x:FW:")) | ||||
| 		   != EOF) | ||||
| 		switch (flag) | ||||
| 		{ | ||||
| 			case 'A': | ||||
| 				/* ----------------
 | ||||
| 				 *  enable/disable assert checking. | ||||
| 				 * ---------------- | ||||
| 				 */ | ||||
| #ifdef USE_ASSERT_CHECKING | ||||
| 				assert_enabled = atoi(optarg); | ||||
| #else | ||||
| 				fprintf(stderr, "Assert checking is not enabled\n"); | ||||
| #endif | ||||
| 				break; | ||||
| 
 | ||||
| 			case 'b': | ||||
| 				/* ----------------
 | ||||
| @ -955,6 +971,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) | ||||
| 				 */ | ||||
| 				BushyPlanFlag = 1; | ||||
| 				break; | ||||
| 
 | ||||
| 			case 'B': | ||||
| 				/* ----------------
 | ||||
| 				 *	specify the size of buffer pool | ||||
| @ -1165,6 +1182,14 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) | ||||
| 				FrontendProtocol = (ProtocolVersion) atoi(optarg); | ||||
| 				break; | ||||
| 
 | ||||
| 			case 'W': | ||||
| 				/* ----------------
 | ||||
| 				 *  wait N seconds to allow attach from a debugger | ||||
| 				 * ---------------- | ||||
| 				 */ | ||||
| 				sleep(atoi(optarg)); | ||||
| 				break; | ||||
| 
 | ||||
| 			case 'x': | ||||
| #if 0							/* planner/xfunc.h */
 | ||||
| 
 | ||||
| @ -1390,7 +1415,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[]) | ||||
| 	if (!IsUnderPostmaster) | ||||
| 	{ | ||||
| 		puts("\nPOSTGRES backend interactive interface"); | ||||
| 		puts("$Revision: 1.84 $ $Date: 1998/08/25 15:00:17 $"); | ||||
| 		puts("$Revision: 1.85 $ $Date: 1998/08/25 21:04:38 $"); | ||||
| 	} | ||||
| 
 | ||||
| 	/* ----------------
 | ||||
| @ -1631,3 +1656,29 @@ ShowUsage(void) | ||||
| 	PrintBufferUsage(StatFp); | ||||
| /*	   DisplayTupleCount(StatFp); */ | ||||
| } | ||||
| 
 | ||||
| #ifdef USE_ASSERT_CHECKING | ||||
| int | ||||
| assertEnable(int val) | ||||
| { | ||||
| 	assert_enabled = val; | ||||
| 	return val; | ||||
| } | ||||
| 
 | ||||
| #ifdef ASSERT_CHECKING_TEST | ||||
| int | ||||
| assertTest(int val) | ||||
| { | ||||
| 	Assert(val == 0); | ||||
| 
 | ||||
| 	if (assert_enabled) { | ||||
| 		/* val != 0 should be trapped by previous Assert */ | ||||
| 		elog(NOTICE, "Assert test successfull (val = %d)", val); | ||||
| 	} else { | ||||
| 		elog(NOTICE, "Assert checking is disabled (val = %d)", val); | ||||
| 	} | ||||
| 
 | ||||
| 	return val; | ||||
| } | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| @ -7,11 +7,11 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/enbl.c,v 1.2 1997/09/07 04:53:42 momjian Exp $ | ||||
|  *	  $Header: /cvsroot/pgsql/src/backend/utils/init/Attic/enbl.c,v 1.3 1998/08/25 21:04:40 scrappy Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| #include "c.h" | ||||
| #include "postgres.h" | ||||
| #include "utils/module.h"		/* where the declarations go */ | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -7,7 +7,7 @@ | ||||
|  * | ||||
|  * Copyright (c) 1994, Regents of the University of California | ||||
|  * | ||||
|  * $Id: c.h,v 1.42 1998/06/23 15:35:46 momjian Exp $ | ||||
|  * $Id: c.h,v 1.43 1998/08/25 21:04:41 scrappy Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -583,12 +583,10 @@ typedef struct Exception | ||||
| } Exception; | ||||
| 
 | ||||
| /*
 | ||||
|  * USE_ASSERT_CHECKING, if defined, turns off all the assertions. | ||||
|  * USE_ASSERT_CHECKING, if defined, turns on all the assertions. | ||||
|  * - plai  9/5/90 | ||||
|  * | ||||
|  * It should _NOT_ be undef'ed in releases or in benchmark copies | ||||
|  * | ||||
|  * #undef USE_ASSERT_CHECKING | ||||
|  * It should _NOT_ be defined in releases or in benchmark copies | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
| @ -597,7 +595,7 @@ typedef struct Exception | ||||
|  * | ||||
|  */ | ||||
| #define Trap(condition, exception) \ | ||||
| 		{ if (condition) \ | ||||
| 		{ if ((assert_enabled) && (condition)) \ | ||||
| 				ExceptionalCondition(CppAsString(condition), &(exception), \ | ||||
| 						(char*)NULL, __FILE__, __LINE__); } | ||||
| 
 | ||||
| @ -609,7 +607,7 @@ typedef struct Exception | ||||
|  *	Isn't CPP fun? | ||||
|  */ | ||||
| #define TrapMacro(condition, exception) \ | ||||
| 	((bool) ((! condition) || \ | ||||
| 	((bool) ((! assert_enabled) || (! condition) || \ | ||||
| 			 (ExceptionalCondition(CppAsString(condition), \ | ||||
| 								  &(exception), \ | ||||
| 								  (char*) NULL, __FILE__, __LINE__)))) | ||||
| @ -619,6 +617,7 @@ typedef struct Exception | ||||
| #define AssertMacro(condition)	(void)true | ||||
| #define AssertArg(condition) | ||||
| #define AssertState(condition) | ||||
| #define assert_enabled 0 | ||||
| #else | ||||
| #define Assert(condition) \ | ||||
| 		Trap(!(condition), FailedAssertion) | ||||
| @ -632,6 +631,7 @@ typedef struct Exception | ||||
| #define AssertState(condition) \ | ||||
| 		Trap(!(condition), BadState) | ||||
| 
 | ||||
| extern int assert_enabled; | ||||
| #endif							/* USE_ASSERT_CHECKING */ | ||||
| 
 | ||||
| /*
 | ||||
| @ -640,7 +640,7 @@ typedef struct Exception | ||||
|  * | ||||
|  */ | ||||
| #define LogTrap(condition, exception, printArgs) \ | ||||
| 		{ if (condition) \ | ||||
| 		{ if ((assert_enabled) && (condition)) \ | ||||
| 				ExceptionalCondition(CppAsString(condition), &(exception), \ | ||||
| 						form printArgs, __FILE__, __LINE__); } | ||||
| 
 | ||||
| @ -650,7 +650,7 @@ typedef struct Exception | ||||
|  *		#define foo(x) (LogAssertMacro(x != 0, "yow!") && bar(x)) | ||||
|  */ | ||||
| #define LogTrapMacro(condition, exception, printArgs) \ | ||||
| 	((bool) ((! condition) || \ | ||||
| 	((bool) ((! assert_enabled) || (! condition) || \ | ||||
| 			 (ExceptionalCondition(CppAsString(condition), \ | ||||
| 								   &(exception), \ | ||||
| 								   form printArgs, __FILE__, __LINE__)))) | ||||
| @ -673,6 +673,10 @@ typedef struct Exception | ||||
| #define LogAssertState(condition, printArgs) \ | ||||
| 		LogTrap(!(condition), BadState, printArgs) | ||||
| 
 | ||||
| extern int	assertEnable(int val); | ||||
| #ifdef ASSERT_CHECKING_TEST | ||||
| extern int	assertTest(int val); | ||||
| #endif | ||||
| #endif							/* USE_ASSERT_CHECKING */ | ||||
| 
 | ||||
| /* ----------------------------------------------------------------
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user