mirror of
https://github.com/postgres/postgres.git
synced 2025-04-21 12:05:57 +03: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
|
* 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
|
* NOTES
|
||||||
*
|
*
|
||||||
@ -238,6 +238,9 @@ void GetCharSetByHost(char *, int, char *);
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_ASSERT_CHECKING
|
||||||
|
int assert_enabled = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
checkDataDir(const char *DataDir, bool *DataDirOK)
|
checkDataDir(const char *DataDir, bool *DataDirOK)
|
||||||
@ -295,8 +298,6 @@ checkDataDir(const char *DataDir, bool *DataDirOK)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
PostmasterMain(int argc, char *argv[])
|
PostmasterMain(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@ -365,10 +366,22 @@ PostmasterMain(int argc, char *argv[])
|
|||||||
DataDir = getenv("PGDATA"); /* default value */
|
DataDir = getenv("PGDATA"); /* default value */
|
||||||
|
|
||||||
opterr = 0;
|
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)
|
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':
|
case 'a':
|
||||||
/* Can no longer set authentication method. */
|
/* Can no longer set authentication method. */
|
||||||
break;
|
break;
|
||||||
@ -566,6 +579,9 @@ static void
|
|||||||
usage(const char *progname)
|
usage(const char *progname)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "usage: %s [options]\n", 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-B nbufs\tset number of shared buffers\n");
|
||||||
fprintf(stderr, "\t-D datadir\tset data directory\n");
|
fprintf(stderr, "\t-D datadir\tset data directory\n");
|
||||||
fprintf(stderr, "\t-S \t\tsilent mode (disassociate from tty)\n");
|
fprintf(stderr, "\t-S \t\tsilent mode (disassociate from tty)\n");
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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
|
* NOTES
|
||||||
* this is the "main" module of the postgres backend and
|
* this is the "main" module of the postgres backend and
|
||||||
@ -850,6 +850,9 @@ usage(char *progname)
|
|||||||
{
|
{
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Usage: %s [options] [dbname]\n", progname);
|
"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-B buffers\tset number of buffers in buffer pool\n");
|
||||||
fprintf(stderr, "\t-C \t\tsupress version info\n");
|
fprintf(stderr, "\t-C \t\tsupress version info\n");
|
||||||
fprintf(stderr, "\t-D dir\t\tdata directory\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-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-s \t\tshow stats after each query\n");
|
||||||
fprintf(stderr, "\t-v version\tset protocol version being used by frontend\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 */
|
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)
|
!= EOF)
|
||||||
switch (flag)
|
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':
|
case 'b':
|
||||||
/* ----------------
|
/* ----------------
|
||||||
@ -955,6 +971,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
|
|||||||
*/
|
*/
|
||||||
BushyPlanFlag = 1;
|
BushyPlanFlag = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'B':
|
case 'B':
|
||||||
/* ----------------
|
/* ----------------
|
||||||
* specify the size of buffer pool
|
* 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);
|
FrontendProtocol = (ProtocolVersion) atoi(optarg);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 'W':
|
||||||
|
/* ----------------
|
||||||
|
* wait N seconds to allow attach from a debugger
|
||||||
|
* ----------------
|
||||||
|
*/
|
||||||
|
sleep(atoi(optarg));
|
||||||
|
break;
|
||||||
|
|
||||||
case 'x':
|
case 'x':
|
||||||
#if 0 /* planner/xfunc.h */
|
#if 0 /* planner/xfunc.h */
|
||||||
|
|
||||||
@ -1390,7 +1415,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
|
|||||||
if (!IsUnderPostmaster)
|
if (!IsUnderPostmaster)
|
||||||
{
|
{
|
||||||
puts("\nPOSTGRES backend interactive interface");
|
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);
|
PrintBufferUsage(StatFp);
|
||||||
/* DisplayTupleCount(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
|
* 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 */
|
#include "utils/module.h" /* where the declarations go */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (c) 1994, Regents of the University of California
|
* 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;
|
} 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
|
* - plai 9/5/90
|
||||||
*
|
*
|
||||||
* It should _NOT_ be undef'ed in releases or in benchmark copies
|
* It should _NOT_ be defined in releases or in benchmark copies
|
||||||
*
|
|
||||||
* #undef USE_ASSERT_CHECKING
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -597,7 +595,7 @@ typedef struct Exception
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define Trap(condition, exception) \
|
#define Trap(condition, exception) \
|
||||||
{ if (condition) \
|
{ if ((assert_enabled) && (condition)) \
|
||||||
ExceptionalCondition(CppAsString(condition), &(exception), \
|
ExceptionalCondition(CppAsString(condition), &(exception), \
|
||||||
(char*)NULL, __FILE__, __LINE__); }
|
(char*)NULL, __FILE__, __LINE__); }
|
||||||
|
|
||||||
@ -609,7 +607,7 @@ typedef struct Exception
|
|||||||
* Isn't CPP fun?
|
* Isn't CPP fun?
|
||||||
*/
|
*/
|
||||||
#define TrapMacro(condition, exception) \
|
#define TrapMacro(condition, exception) \
|
||||||
((bool) ((! condition) || \
|
((bool) ((! assert_enabled) || (! condition) || \
|
||||||
(ExceptionalCondition(CppAsString(condition), \
|
(ExceptionalCondition(CppAsString(condition), \
|
||||||
&(exception), \
|
&(exception), \
|
||||||
(char*) NULL, __FILE__, __LINE__))))
|
(char*) NULL, __FILE__, __LINE__))))
|
||||||
@ -619,6 +617,7 @@ typedef struct Exception
|
|||||||
#define AssertMacro(condition) (void)true
|
#define AssertMacro(condition) (void)true
|
||||||
#define AssertArg(condition)
|
#define AssertArg(condition)
|
||||||
#define AssertState(condition)
|
#define AssertState(condition)
|
||||||
|
#define assert_enabled 0
|
||||||
#else
|
#else
|
||||||
#define Assert(condition) \
|
#define Assert(condition) \
|
||||||
Trap(!(condition), FailedAssertion)
|
Trap(!(condition), FailedAssertion)
|
||||||
@ -632,6 +631,7 @@ typedef struct Exception
|
|||||||
#define AssertState(condition) \
|
#define AssertState(condition) \
|
||||||
Trap(!(condition), BadState)
|
Trap(!(condition), BadState)
|
||||||
|
|
||||||
|
extern int assert_enabled;
|
||||||
#endif /* USE_ASSERT_CHECKING */
|
#endif /* USE_ASSERT_CHECKING */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -640,7 +640,7 @@ typedef struct Exception
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define LogTrap(condition, exception, printArgs) \
|
#define LogTrap(condition, exception, printArgs) \
|
||||||
{ if (condition) \
|
{ if ((assert_enabled) && (condition)) \
|
||||||
ExceptionalCondition(CppAsString(condition), &(exception), \
|
ExceptionalCondition(CppAsString(condition), &(exception), \
|
||||||
form printArgs, __FILE__, __LINE__); }
|
form printArgs, __FILE__, __LINE__); }
|
||||||
|
|
||||||
@ -650,7 +650,7 @@ typedef struct Exception
|
|||||||
* #define foo(x) (LogAssertMacro(x != 0, "yow!") && bar(x))
|
* #define foo(x) (LogAssertMacro(x != 0, "yow!") && bar(x))
|
||||||
*/
|
*/
|
||||||
#define LogTrapMacro(condition, exception, printArgs) \
|
#define LogTrapMacro(condition, exception, printArgs) \
|
||||||
((bool) ((! condition) || \
|
((bool) ((! assert_enabled) || (! condition) || \
|
||||||
(ExceptionalCondition(CppAsString(condition), \
|
(ExceptionalCondition(CppAsString(condition), \
|
||||||
&(exception), \
|
&(exception), \
|
||||||
form printArgs, __FILE__, __LINE__))))
|
form printArgs, __FILE__, __LINE__))))
|
||||||
@ -673,6 +673,10 @@ typedef struct Exception
|
|||||||
#define LogAssertState(condition, printArgs) \
|
#define LogAssertState(condition, printArgs) \
|
||||||
LogTrap(!(condition), BadState, printArgs)
|
LogTrap(!(condition), BadState, printArgs)
|
||||||
|
|
||||||
|
extern int assertEnable(int val);
|
||||||
|
#ifdef ASSERT_CHECKING_TEST
|
||||||
|
extern int assertTest(int val);
|
||||||
|
#endif
|
||||||
#endif /* USE_ASSERT_CHECKING */
|
#endif /* USE_ASSERT_CHECKING */
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user