aboutsummaryrefslogtreecommitdiff
path: root/test/fuzzcheck.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2019-12-31 14:49:10 +0000
committerdrh <drh@noemail.net>2019-12-31 14:49:10 +0000
commit5f6a2ed7f275a201a8ce9fd81b60a2a552c20f6b (patch)
tree0a8359d1c5b0829d9a6292e85665979bf364e076 /test/fuzzcheck.c
parentd335bc40a6576d8759466d8efaaaf82b04667aaa (diff)
parent02ff747bc0a6039cddf6108719426d247026fa18 (diff)
downloadsqlite-5f6a2ed7f275a201a8ce9fd81b60a2a552c20f6b.tar.gz
sqlite-5f6a2ed7f275a201a8ce9fd81b60a2a552c20f6b.zip
Merge recent enhancements from trunk.
FossilOrigin-Name: 39d55579376906f212271ce9b2d367e3ad029fb173f22c7253312b467970208a
Diffstat (limited to 'test/fuzzcheck.c')
-rw-r--r--test/fuzzcheck.c39
1 files changed, 29 insertions, 10 deletions
diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c
index f1d2415de..4f3321f0a 100644
--- a/test/fuzzcheck.c
+++ b/test/fuzzcheck.c
@@ -134,6 +134,7 @@ struct Blob {
*/
static struct GlobalVars {
const char *zArgv0; /* Name of program */
+ const char *zDbFile; /* Name of database file */
VFile aFile[MX_FILE]; /* The virtual filesystem */
int nDb; /* Number of template databases */
Blob *pFirstDb; /* Content of first template database */
@@ -148,11 +149,10 @@ static struct GlobalVars {
*/
static void fatalError(const char *zFormat, ...){
va_list ap;
- if( g.zTestName[0] ){
- fprintf(stderr, "%s (%s): ", g.zArgv0, g.zTestName);
- }else{
- fprintf(stderr, "%s: ", g.zArgv0);
- }
+ fprintf(stderr, "%s", g.zArgv0);
+ if( g.zDbFile ) fprintf(stderr, " %s", g.zDbFile);
+ if( g.zTestName[0] ) fprintf(stderr, " (%s)", g.zTestName);
+ fprintf(stderr, ": ");
va_start(ap, zFormat);
vfprintf(stderr, zFormat, ap);
va_end(ap);
@@ -161,12 +161,21 @@ static void fatalError(const char *zFormat, ...){
}
/*
-** Timeout handler
+** signal handler
*/
#ifdef __unix__
-static void timeoutHandler(int NotUsed){
- (void)NotUsed;
- fatalError("timeout\n");
+static void signalHandler(int signum){
+ const char *zSig;
+ if( signum==SIGABRT ){
+ zSig = "abort";
+ }else if( signum==SIGALRM ){
+ zSig = "timeout";
+ }else if( signum==SIGSEGV ){
+ zSig = "segfault";
+ }else{
+ zSig = "signal";
+ }
+ fatalError(zSig);
}
#endif
@@ -1311,6 +1320,7 @@ static void showHelp(void){
" --sqlid N Use only SQL where sqlid=N\n"
" --timeout N Abort if any single test needs more than N seconds\n"
" -v|--verbose Increased output. Repeat for more output.\n"
+" --vdbe-debug Activate VDBE debugging.\n"
);
}
@@ -1360,7 +1370,9 @@ int main(int argc, char **argv){
sqlite3_initialize();
iBegin = timeOfDay();
#ifdef __unix__
- signal(SIGALRM, timeoutHandler);
+ signal(SIGALRM, signalHandler);
+ signal(SIGSEGV, signalHandler);
+ signal(SIGABRT, signalHandler);
#endif
g.zArgv0 = argv[0];
openFlags4Data = SQLITE_OPEN_READONLY;
@@ -1464,6 +1476,9 @@ int main(int argc, char **argv){
fatalError("timeout is not available on non-unix systems");
#endif
}else
+ if( strcmp(z,"vdbe-debug")==0 ){
+ bVdbeDebug = 1;
+ }else
if( strcmp(z,"verbose")==0 ){
quietFlag = 0;
verboseFlag++;
@@ -1506,6 +1521,7 @@ int main(int argc, char **argv){
/* Process each source database separately */
for(iSrcDb=0; iSrcDb<nSrcDb; iSrcDb++){
+ g.zDbFile = azSrcDb[iSrcDb];
rc = sqlite3_open_v2(azSrcDb[iSrcDb], &db,
openFlags4Data, pDfltVfs->zName);
if( rc ){
@@ -1809,6 +1825,9 @@ int main(int argc, char **argv){
#ifdef SQLITE_TESTCTRL_PRNG_SEED
sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, 1, db);
#endif
+ if( bVdbeDebug ){
+ sqlite3_exec(db, "PRAGMA vdbe_debug=ON", 0, 0, 0);
+ }
do{
runSql(db, (char*)pSql->a, runFlags);
}while( timeoutTest );