Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Enhance the fuzzershell --uniquecases option to output results in order of increasing runtime and to include the runtime in the comment separator of the output. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
04630b989d8794b9ed2553f4d223de2b |
User & Date: | drh 2015-05-01 20:34:47.283 |
Context
2015-05-02
| ||
11:45 | Cleanup of the sqlite3StrAccumInit() function. No functionality changes. (check-in: 7952c32268 user: drh tags: trunk) | |
09:44 | Add the experimental matchinfo 'y' flag to fts3/4. (Closed-Leaf check-in: 92941609af user: dan tags: fts3-matchinfo-y) | |
2015-05-01
| ||
20:34 | Enhance the fuzzershell --uniquecases option to output results in order of increasing runtime and to include the runtime in the comment separator of the output. (check-in: 04630b989d user: drh tags: trunk) | |
19:21 | Enhance fuzzershell to accept multiple input files. Add the test/fuzzdata2.txt fuzz test content. (check-in: ab5523aafe user: drh tags: trunk) | |
Changes
Changes to tool/fuzzershell.c.
︙ | ︙ | |||
392 393 394 395 396 397 398 399 400 401 402 403 404 405 | break; } } if( v>0x7fffffff ) abendError("parameter too large - max 2147483648"); return (int)(isNeg? -v : v); } int main(int argc, char **argv){ char *zIn = 0; /* Input text */ int nAlloc = 0; /* Number of bytes allocated for zIn[] */ int nIn = 0; /* Number of bytes of zIn[] used */ size_t got; /* Bytes read from input */ int rc = SQLITE_OK; /* Result codes from API functions */ | > > > > > > > > > > > > > > | 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 | break; } } if( v>0x7fffffff ) abendError("parameter too large - max 2147483648"); return (int)(isNeg? -v : v); } /* Return the current wall-clock time */ static sqlite3_int64 timeOfDay(void){ static sqlite3_vfs *clockVfs = 0; sqlite3_int64 t; if( clockVfs==0 ) clockVfs = sqlite3_vfs_find(0); if( clockVfs->iVersion>=1 && clockVfs->xCurrentTimeInt64!=0 ){ clockVfs->xCurrentTimeInt64(clockVfs, &t); }else{ double r; clockVfs->xCurrentTime(clockVfs, &r); t = (sqlite3_int64)(r*86400000.0); } return t; } int main(int argc, char **argv){ char *zIn = 0; /* Input text */ int nAlloc = 0; /* Number of bytes allocated for zIn[] */ int nIn = 0; /* Number of bytes of zIn[] used */ size_t got; /* Bytes read from input */ int rc = SQLITE_OK; /* Result codes from API functions */ |
︙ | ︙ | |||
416 417 418 419 420 421 422 | void *pHeap = 0; /* Allocated heap space */ void *pLook = 0; /* Allocated lookaside space */ void *pPCache = 0; /* Allocated storage for pcache */ void *pScratch = 0; /* Allocated storage for scratch */ int doAutovac = 0; /* True for --autovacuum */ char *zSql; /* SQL to run */ char *zToFree = 0; /* Call sqlite3_free() on this afte running zSql */ | < > | 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 | void *pHeap = 0; /* Allocated heap space */ void *pLook = 0; /* Allocated lookaside space */ void *pPCache = 0; /* Allocated storage for pcache */ void *pScratch = 0; /* Allocated storage for scratch */ int doAutovac = 0; /* True for --autovacuum */ char *zSql; /* SQL to run */ char *zToFree = 0; /* Call sqlite3_free() on this afte running zSql */ int verboseFlag = 0; /* --verbose or -v flag */ int quietFlag = 0; /* --quiet or -q flag */ int nTest = 0; /* Number of test cases run */ int multiTest = 0; /* True if there will be multiple test cases */ int lastPct = -1; /* Previous percentage done output */ sqlite3 *dataDb = 0; /* Database holding compacted input data */ sqlite3_stmt *pStmt = 0; /* Statement to insert testcase into dataDb */ const char *zDataOut = 0; /* Write compacted data to this output file */ int nHeader = 0; /* Bytes of header comment text on input file */ int oomFlag = 0; /* --oom */ int oomCnt = 0; /* Counter for the OOM loop */ char zErrBuf[200]; /* Space for the error message */ const char *zFailCode; /* Value of the TEST_FAILURE environment var */ const char *zPrompt; /* Initial prompt when large-file fuzzing */ int nInFile = 0; /* Number of input files to read */ char **azInFile = 0; /* Array of input file names */ int jj; /* Loop counter for azInFile[] */ sqlite3_int64 iStart, iEnd; /* Start and end-times for a test case */ zFailCode = getenv("TEST_FAILURE"); g.zArgv0 = argv[0]; zPrompt = "<stdin>"; for(i=1; i<argc; i++){ const char *z = argv[i]; |
︙ | ︙ | |||
561 562 563 564 565 566 567 | /* If the --unique-cases option was supplied, open the database that will ** be used to gather unique test cases. */ if( zDataOut ){ rc = sqlite3_open(":memory:", &dataDb); if( rc ) abendError("cannot open :memory: database"); rc = sqlite3_exec(dataDb, | | | | 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 | /* If the --unique-cases option was supplied, open the database that will ** be used to gather unique test cases. */ if( zDataOut ){ rc = sqlite3_open(":memory:", &dataDb); if( rc ) abendError("cannot open :memory: database"); rc = sqlite3_exec(dataDb, "CREATE TABLE testcase(sql BLOB PRIMARY KEY, tm) WITHOUT ROWID;",0,0,0); if( rc ) abendError("%s", sqlite3_errmsg(dataDb)); rc = sqlite3_prepare_v2(dataDb, "INSERT OR IGNORE INTO testcase(sql,tm)VALUES(?1,?2)", -1, &pStmt, 0); if( rc ) abendError("%s", sqlite3_errmsg(dataDb)); } /* Initialize the input buffer used to hold SQL text */ if( nInFile==0 ) nInFile = 1; nAlloc = 1000; |
︙ | ︙ | |||
631 632 633 634 635 636 637 | fflush(stdout); } i += (int)(z-&zIn[i]); multiTest = 1; } } for(iNext=i; iNext<nIn && strncmp(&zIn[iNext],"/****<",6)!=0; iNext++){} | < < < < < < < < < < < < < < | | 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 | fflush(stdout); } i += (int)(z-&zIn[i]); multiTest = 1; } } for(iNext=i; iNext<nIn && strncmp(&zIn[iNext],"/****<",6)!=0; iNext++){} cSaved = zIn[iNext]; zIn[iNext] = 0; /* Print out the SQL of the next test case is --verbose is enabled */ zSql = &zIn[i]; if( verboseFlag ){ printf("INPUT (offset: %d, size: %d): [%s]\n", i, (int)strlen(&zIn[i]), &zIn[i]); |
︙ | ︙ | |||
703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 | #endif sqlite3_create_function(db, "eval", 1, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0); sqlite3_create_function(db, "eval", 2, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0); sqlite3_limit(db, SQLITE_LIMIT_LENGTH, 1000000); if( zEncoding ) sqlexec(db, "PRAGMA encoding=%s", zEncoding); if( pageSize ) sqlexec(db, "PRAGMA pagesize=%d", pageSize); if( doAutovac ) sqlexec(db, "PRAGMA auto_vacuum=FULL"); g.bOomEnable = 1; if( verboseFlag ){ zErrMsg = 0; rc = sqlite3_exec(db, zSql, execCallback, 0, &zErrMsg); if( zErrMsg ){ sqlite3_snprintf(sizeof(zErrBuf),zErrBuf,"%z", zErrMsg); zErrMsg = 0; } }else { rc = sqlite3_exec(db, zSql, execNoop, 0, 0); } g.bOomEnable = 0; rc = sqlite3_close(db); if( rc ){ abendError("sqlite3_close() failed with rc=%d", rc); } | > > | | 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 | #endif sqlite3_create_function(db, "eval", 1, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0); sqlite3_create_function(db, "eval", 2, SQLITE_UTF8, 0, sqlEvalFunc, 0, 0); sqlite3_limit(db, SQLITE_LIMIT_LENGTH, 1000000); if( zEncoding ) sqlexec(db, "PRAGMA encoding=%s", zEncoding); if( pageSize ) sqlexec(db, "PRAGMA pagesize=%d", pageSize); if( doAutovac ) sqlexec(db, "PRAGMA auto_vacuum=FULL"); iStart = timeOfDay(); g.bOomEnable = 1; if( verboseFlag ){ zErrMsg = 0; rc = sqlite3_exec(db, zSql, execCallback, 0, &zErrMsg); if( zErrMsg ){ sqlite3_snprintf(sizeof(zErrBuf),zErrBuf,"%z", zErrMsg); zErrMsg = 0; } }else { rc = sqlite3_exec(db, zSql, execNoop, 0, 0); } g.bOomEnable = 0; iEnd = timeOfDay(); rc = sqlite3_close(db); if( rc ){ abendError("sqlite3_close() failed with rc=%d", rc); } if( !zDataOut && sqlite3_memory_used()>0 ){ abendError("memory in use after close: %lld bytes",sqlite3_memory_used()); } if( oomFlag ){ /* Limit the number of iterations of the OOM loop to OOM_MAX. If the ** first pass (single failure) exceeds 2/3rds of OOM_MAX this skip the ** second pass (continuous failure after first) completely. */ if( g.nOomFault==0 || oomCnt>OOM_MAX ){ |
︙ | ︙ | |||
746 747 748 749 750 751 752 753 754 755 756 757 758 759 | printf("%s.%d\n", g.bOomOnce ? "Once" : "Multi", oomCnt); fflush(stdout); } nTest++; } } }while( oomCnt>0 ); /* Free the SQL from the current test case */ if( zToFree ){ sqlite3_free(zToFree); zToFree = 0; } | > > > > > > > > > > > | 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 | printf("%s.%d\n", g.bOomOnce ? "Once" : "Multi", oomCnt); fflush(stdout); } nTest++; } } }while( oomCnt>0 ); /* Store unique test cases in the in the dataDb database if the ** --unique-cases flag is present */ if( zDataOut ){ sqlite3_bind_blob(pStmt, 1, &zIn[i], iNext-i, SQLITE_STATIC); sqlite3_bind_int64(pStmt, 2, iEnd - iStart); rc = sqlite3_step(pStmt); if( rc!=SQLITE_DONE ) abendError("%s", sqlite3_errmsg(dataDb)); sqlite3_reset(pStmt); } /* Free the SQL from the current test case */ if( zToFree ){ sqlite3_free(zToFree); zToFree = 0; } |
︙ | ︙ | |||
798 799 800 801 802 803 804 | */ if( zDataOut ){ int n = 0; FILE *out = fopen(zDataOut, "wb"); if( out==0 ) abendError("cannot open %s for writing", zDataOut); if( nHeader>0 ) fwrite(zIn, nHeader, 1, out); sqlite3_finalize(pStmt); | | > | | 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 | */ if( zDataOut ){ int n = 0; FILE *out = fopen(zDataOut, "wb"); if( out==0 ) abendError("cannot open %s for writing", zDataOut); if( nHeader>0 ) fwrite(zIn, nHeader, 1, out); sqlite3_finalize(pStmt); rc = sqlite3_prepare_v2(dataDb, "SELECT sql, tm FROM testcase ORDER BY tm, sql", -1, &pStmt, 0); if( rc ) abendError("%s", sqlite3_errmsg(dataDb)); while( sqlite3_step(pStmt)==SQLITE_ROW ){ fprintf(out,"/****<%d:%dms>****/", ++n, sqlite3_column_int(pStmt,1)); fwrite(sqlite3_column_blob(pStmt,0),sqlite3_column_bytes(pStmt,0),1,out); } fclose(out); sqlite3_finalize(pStmt); sqlite3_close(dataDb); } |
︙ | ︙ |