4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing:
7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give.
11 *************************************************************************
13 ** This is a utility program designed to aid running the SQLite library
14 ** against an external fuzzer, such as American Fuzzy Lop (AFL)
15 ** (http://lcamtuf.coredump.cx/afl/). Basically, this program reads
16 ** SQL text from standard input and passes it through to SQLite for evaluation,
17 ** just like the "sqlite3" command-line shell. Differences from the
18 ** command-line shell:
20 ** (1) The complex "dot-command" extensions are omitted. This
21 ** prevents the fuzzer from discovering that it can run things
22 ** like ".shell rm -rf ~"
24 ** (2) The database is opened with the SQLITE_OPEN_MEMORY flag so that
25 ** no disk I/O from the database is permitted. The ATTACH command
26 ** with a filename still uses an in-memory database.
28 ** (3) The main in-memory database can be initialized from a template
29 ** disk database so that the fuzzer starts with a database containing
32 ** (4) The eval() SQL function is added, allowing the fuzzer to do
33 ** interesting recursive operations.
35 ** (5) An error is raised if there is a memory leak.
37 ** The input text can be divided into separate test cases using comments
42 ** where the "..." is arbitrary text. (Except the "|" should really be "/".
43 ** "|" is used here to avoid compiler errors about nested comments.)
44 ** A separate in-memory SQLite database is created to run each test case.
45 ** This feature allows the "queue" of AFL to be captured into a single big
46 ** file using a command like this:
48 ** (for i in id:*; do echo '|****<'$i'>****|'; cat $i; done) >~/all-queue.txt
50 ** (Once again, change the "|" to "/") Then all elements of the AFL queue
51 ** can be run in a single go (for regression testing, for example) by typing:
53 ** fuzzershell -f ~/all-queue.txt
55 ** After running each chunk of SQL, the database connection is closed. The
56 ** program aborts if the close fails or if there is any unfreed memory after
59 ** New test cases can be appended to all-queue.txt at any time. If redundant
60 ** test cases are added, they can be eliminated by running:
62 ** fuzzershell -f ~/all-queue.txt --unique-cases ~/unique-cases.txt
70 #define ISDIGIT(X) isdigit((unsigned char)(X))
73 ** All global variables are gathered into the "g" singleton.
76 const char *zArgv0
; /* Name of program */
77 sqlite3_mem_methods sOrigMem
; /* Original memory methods */
78 sqlite3_mem_methods sOomMem
; /* Memory methods with OOM simulator */
79 int iOomCntdown
; /* Memory fails on 1 to 0 transition */
80 int nOomFault
; /* Increments for each OOM fault */
81 int bOomOnce
; /* Fail just once if true */
82 int bOomEnable
; /* True to enable OOM simulation */
83 int nOomBrkpt
; /* Number of calls to oomFault() */
84 char zTestName
[100]; /* Name of current test */
88 ** Maximum number of iterations for an OOM test
95 ** This routine is called when a simulated OOM occurs. It exists as a
96 ** convenient place to set a debugger breakpoint.
98 static void oomFault(void){
99 g
.nOomBrkpt
++; /* Prevent oomFault() from being optimized out */
103 /* Versions of malloc() and realloc() that simulate OOM conditions */
104 static void *oomMalloc(int nByte
){
105 if( nByte
>0 && g
.bOomEnable
&& g
.iOomCntdown
>0 ){
107 if( g
.iOomCntdown
==0 ){
108 if( g
.nOomFault
==0 ) oomFault();
110 if( !g
.bOomOnce
) g
.iOomCntdown
= 1;
114 return g
.sOrigMem
.xMalloc(nByte
);
116 static void *oomRealloc(void *pOld
, int nByte
){
117 if( nByte
>0 && g
.bOomEnable
&& g
.iOomCntdown
>0 ){
119 if( g
.iOomCntdown
==0 ){
120 if( g
.nOomFault
==0 ) oomFault();
122 if( !g
.bOomOnce
) g
.iOomCntdown
= 1;
126 return g
.sOrigMem
.xRealloc(pOld
, nByte
);
130 ** Print an error message and abort in such a way to indicate to the
131 ** fuzzer that this counts as a crash.
133 static void abendError(const char *zFormat
, ...){
135 if( g
.zTestName
[0] ){
136 fprintf(stderr
, "%s (%s): ", g
.zArgv0
, g
.zTestName
);
138 fprintf(stderr
, "%s: ", g
.zArgv0
);
140 va_start(ap
, zFormat
);
141 vfprintf(stderr
, zFormat
, ap
);
143 fprintf(stderr
, "\n");
147 ** Print an error message and quit, but not in a way that would look
150 static void fatalError(const char *zFormat
, ...){
152 if( g
.zTestName
[0] ){
153 fprintf(stderr
, "%s (%s): ", g
.zArgv0
, g
.zTestName
);
155 fprintf(stderr
, "%s: ", g
.zArgv0
);
157 va_start(ap
, zFormat
);
158 vfprintf(stderr
, zFormat
, ap
);
160 fprintf(stderr
, "\n");
165 ** Evaluate some SQL. Abort if unable.
167 static void sqlexec(sqlite3
*db
, const char *zFormat
, ...){
172 va_start(ap
, zFormat
);
173 zSql
= sqlite3_vmprintf(zFormat
, ap
);
175 rc
= sqlite3_exec(db
, zSql
, 0, 0, &zErrMsg
);
176 if( rc
) abendError("failed sql [%s]: %s", zSql
, zErrMsg
);
181 ** This callback is invoked by sqlite3_log().
183 static void shellLog(void *pNotUsed
, int iErrCode
, const char *zMsg
){
184 printf("LOG: (%d) %s\n", iErrCode
, zMsg
);
187 static void shellLogNoop(void *pNotUsed
, int iErrCode
, const char *zMsg
){
192 ** This callback is invoked by sqlite3_exec() to return query results.
194 static int execCallback(void *NotUsed
, int argc
, char **argv
, char **colv
){
196 static unsigned cnt
= 0;
197 printf("ROW #%u:\n", ++cnt
);
199 for(i
=0; i
<argc
; i
++){
200 printf(" %s=", colv
[i
]);
202 printf("[%s]\n", argv
[i
]);
211 static int execNoop(void *NotUsed
, int argc
, char **argv
, char **colv
){
215 #ifndef SQLITE_OMIT_TRACE
217 ** This callback is invoked by sqlite3_trace() as each SQL statement
220 static void traceCallback(void *NotUsed
, const char *zMsg
){
221 printf("TRACE: %s\n", zMsg
);
224 static void traceNoop(void *NotUsed
, const char *zMsg
){
229 /***************************************************************************
230 ** String accumulator object
232 typedef struct Str Str
;
234 char *z
; /* The string. Memory from malloc() */
235 sqlite3_uint64 n
; /* Bytes of input used */
236 sqlite3_uint64 nAlloc
; /* Bytes allocated to z[] */
237 int oomErr
; /* OOM error has been seen */
240 /* Initialize a Str object */
241 static void StrInit(Str
*p
){
242 memset(p
, 0, sizeof(*p
));
245 /* Append text to the end of a Str object */
246 static void StrAppend(Str
*p
, const char *z
){
247 sqlite3_uint64 n
= strlen(z
);
248 if( p
->n
+ n
>= p
->nAlloc
){
251 if( p
->oomErr
) return;
252 nNew
= p
->nAlloc
*2 + 100 + n
;
253 zNew
= sqlite3_realloc(p
->z
, (int)nNew
);
256 memset(p
, 0, sizeof(*p
));
263 memcpy(p
->z
+ p
->n
, z
, (size_t)n
);
268 /* Return the current string content */
269 static char *StrStr(Str
*p
){
273 /* Free the string */
274 static void StrFree(Str
*p
){
279 /***************************************************************************
280 ** eval() implementation copied from ../ext/misc/eval.c
283 ** Structure used to accumulate the output
286 char *z
; /* Accumulated output */
287 const char *zSep
; /* Separator */
288 int szSep
; /* Size of the separator string */
289 sqlite3_int64 nAlloc
; /* Number of bytes allocated for z[] */
290 sqlite3_int64 nUsed
; /* Number of bytes of z[] actually used */
294 ** Callback from sqlite_exec() for the eval() function.
296 static int callback(void *pCtx
, int argc
, char **argv
, char **colnames
){
297 struct EvalResult
*p
= (struct EvalResult
*)pCtx
;
299 for(i
=0; i
<argc
; i
++){
300 const char *z
= argv
[i
] ? argv
[i
] : "";
301 size_t sz
= strlen(z
);
302 if( (sqlite3_int64
)sz
+p
->nUsed
+p
->szSep
+1 > p
->nAlloc
){
304 p
->nAlloc
= p
->nAlloc
*2 + sz
+ p
->szSep
+ 1;
305 /* Using sqlite3_realloc64() would be better, but it is a recent
306 ** addition and will cause a segfault if loaded by an older version
308 zNew
= p
->nAlloc
<=0x7fffffff ? sqlite3_realloc(p
->z
, (int)p
->nAlloc
) : 0;
311 memset(p
, 0, sizeof(*p
));
317 memcpy(&p
->z
[p
->nUsed
], p
->zSep
, p
->szSep
);
318 p
->nUsed
+= p
->szSep
;
320 memcpy(&p
->z
[p
->nUsed
], z
, sz
);
327 ** Implementation of the eval(X) and eval(X,Y) SQL functions.
329 ** Evaluate the SQL text in X. Return the results, using string
330 ** Y as the separator. If Y is omitted, use a single space character.
332 static void sqlEvalFunc(
333 sqlite3_context
*context
,
343 memset(&x
, 0, sizeof(x
));
345 zSql
= (const char*)sqlite3_value_text(argv
[0]);
346 if( zSql
==0 ) return;
348 x
.zSep
= (const char*)sqlite3_value_text(argv
[1]);
349 if( x
.zSep
==0 ) return;
351 x
.szSep
= (int)strlen(x
.zSep
);
352 db
= sqlite3_context_db_handle(context
);
353 rc
= sqlite3_exec(db
, zSql
, callback
, &x
, &zErr
);
355 sqlite3_result_error(context
, zErr
, -1);
357 }else if( x
.zSep
==0 ){
358 sqlite3_result_error_nomem(context
);
361 sqlite3_result_text(context
, x
.z
, (int)x
.nUsed
, sqlite3_free
);
364 /* End of the eval() implementation
365 ******************************************************************************/
367 /******************************************************************************
368 ** The generate_series(START,END,STEP) eponymous table-valued function.
370 ** This code is copy/pasted from ext/misc/series.c in the SQLite source tree.
372 /* series_cursor is a subclass of sqlite3_vtab_cursor which will
373 ** serve as the underlying representation of a cursor that scans
374 ** over rows of the result
376 typedef struct series_cursor series_cursor
;
377 struct series_cursor
{
378 sqlite3_vtab_cursor base
; /* Base class - must be first */
379 int isDesc
; /* True to count down rather than up */
380 sqlite3_int64 iRowid
; /* The rowid */
381 sqlite3_int64 iValue
; /* Current value ("value") */
382 sqlite3_int64 mnValue
; /* Mimimum value ("start") */
383 sqlite3_int64 mxValue
; /* Maximum value ("stop") */
384 sqlite3_int64 iStep
; /* Increment ("step") */
388 ** The seriesConnect() method is invoked to create a new
389 ** series_vtab that describes the generate_series virtual table.
391 ** Think of this routine as the constructor for series_vtab objects.
393 ** All this routine needs to do is:
395 ** (1) Allocate the series_vtab object and initialize all fields.
397 ** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the
398 ** result set of queries against generate_series will look like.
400 static int seriesConnect(
403 int argc
, const char *const*argv
,
404 sqlite3_vtab
**ppVtab
,
411 #define SERIES_COLUMN_VALUE 0
412 #define SERIES_COLUMN_START 1
413 #define SERIES_COLUMN_STOP 2
414 #define SERIES_COLUMN_STEP 3
416 rc
= sqlite3_declare_vtab(db
,
417 "CREATE TABLE x(value,start hidden,stop hidden,step hidden)");
419 pNew
= *ppVtab
= sqlite3_malloc( sizeof(*pNew
) );
420 if( pNew
==0 ) return SQLITE_NOMEM
;
421 memset(pNew
, 0, sizeof(*pNew
));
427 ** This method is the destructor for series_cursor objects.
429 static int seriesDisconnect(sqlite3_vtab
*pVtab
){
435 ** Constructor for a new series_cursor object.
437 static int seriesOpen(sqlite3_vtab
*p
, sqlite3_vtab_cursor
**ppCursor
){
439 pCur
= sqlite3_malloc( sizeof(*pCur
) );
440 if( pCur
==0 ) return SQLITE_NOMEM
;
441 memset(pCur
, 0, sizeof(*pCur
));
442 *ppCursor
= &pCur
->base
;
447 ** Destructor for a series_cursor.
449 static int seriesClose(sqlite3_vtab_cursor
*cur
){
456 ** Advance a series_cursor to its next row of output.
458 static int seriesNext(sqlite3_vtab_cursor
*cur
){
459 series_cursor
*pCur
= (series_cursor
*)cur
;
461 pCur
->iValue
-= pCur
->iStep
;
463 pCur
->iValue
+= pCur
->iStep
;
470 ** Return values of columns for the row at which the series_cursor
471 ** is currently pointing.
473 static int seriesColumn(
474 sqlite3_vtab_cursor
*cur
, /* The cursor */
475 sqlite3_context
*ctx
, /* First argument to sqlite3_result_...() */
476 int i
/* Which column to return */
478 series_cursor
*pCur
= (series_cursor
*)cur
;
481 case SERIES_COLUMN_START
: x
= pCur
->mnValue
; break;
482 case SERIES_COLUMN_STOP
: x
= pCur
->mxValue
; break;
483 case SERIES_COLUMN_STEP
: x
= pCur
->iStep
; break;
484 default: x
= pCur
->iValue
; break;
486 sqlite3_result_int64(ctx
, x
);
491 ** Return the rowid for the current row. In this implementation, the
492 ** rowid is the same as the output value.
494 static int seriesRowid(sqlite3_vtab_cursor
*cur
, sqlite_int64
*pRowid
){
495 series_cursor
*pCur
= (series_cursor
*)cur
;
496 *pRowid
= pCur
->iRowid
;
501 ** Return TRUE if the cursor has been moved off of the last
504 static int seriesEof(sqlite3_vtab_cursor
*cur
){
505 series_cursor
*pCur
= (series_cursor
*)cur
;
507 return pCur
->iValue
< pCur
->mnValue
;
509 return pCur
->iValue
> pCur
->mxValue
;
513 /* True to cause run-time checking of the start=, stop=, and/or step=
514 ** parameters. The only reason to do this is for testing the
515 ** constraint checking logic for virtual tables in the SQLite core.
517 #ifndef SQLITE_SERIES_CONSTRAINT_VERIFY
518 # define SQLITE_SERIES_CONSTRAINT_VERIFY 0
522 ** This method is called to "rewind" the series_cursor object back
523 ** to the first row of output. This method is always called at least
524 ** once prior to any call to seriesColumn() or seriesRowid() or
527 ** The query plan selected by seriesBestIndex is passed in the idxNum
528 ** parameter. (idxStr is not used in this implementation.) idxNum
529 ** is a bitmask showing which constraints are available:
535 ** Also, if bit 8 is set, that means that the series should be output
536 ** in descending order rather than in ascending order.
538 ** This routine should initialize the cursor and position it so that it
539 ** is pointing at the first row, or pointing off the end of the table
540 ** (so that seriesEof() will return true) if the table is empty.
542 static int seriesFilter(
543 sqlite3_vtab_cursor
*pVtabCursor
,
544 int idxNum
, const char *idxStr
,
545 int argc
, sqlite3_value
**argv
547 series_cursor
*pCur
= (series_cursor
*)pVtabCursor
;
550 pCur
->mnValue
= sqlite3_value_int64(argv
[i
++]);
555 pCur
->mxValue
= sqlite3_value_int64(argv
[i
++]);
557 pCur
->mxValue
= 0xffffffff;
560 pCur
->iStep
= sqlite3_value_int64(argv
[i
++]);
561 if( pCur
->iStep
<1 ) pCur
->iStep
= 1;
567 pCur
->iValue
= pCur
->mxValue
;
569 pCur
->iValue
-= (pCur
->mxValue
- pCur
->mnValue
)%pCur
->iStep
;
573 pCur
->iValue
= pCur
->mnValue
;
580 ** SQLite will invoke this method one or more times while planning a query
581 ** that uses the generate_series virtual table. This routine needs to create
582 ** a query plan for each invocation and compute an estimated cost for that
585 ** In this implementation idxNum is used to represent the
586 ** query plan. idxStr is unused.
588 ** The query plan is represented by bits in idxNum:
590 ** (1) start = $value -- constraint exists
591 ** (2) stop = $value -- constraint exists
592 ** (4) step = $value -- constraint exists
593 ** (8) output in descending order
595 static int seriesBestIndex(
597 sqlite3_index_info
*pIdxInfo
599 int i
; /* Loop over constraints */
600 int idxNum
= 0; /* The query plan bitmask */
601 int startIdx
= -1; /* Index of the start= constraint, or -1 if none */
602 int stopIdx
= -1; /* Index of the stop= constraint, or -1 if none */
603 int stepIdx
= -1; /* Index of the step= constraint, or -1 if none */
604 int nArg
= 0; /* Number of arguments that seriesFilter() expects */
606 const struct sqlite3_index_constraint
*pConstraint
;
607 pConstraint
= pIdxInfo
->aConstraint
;
608 for(i
=0; i
<pIdxInfo
->nConstraint
; i
++, pConstraint
++){
609 if( pConstraint
->usable
==0 ) continue;
610 if( pConstraint
->op
!=SQLITE_INDEX_CONSTRAINT_EQ
) continue;
611 switch( pConstraint
->iColumn
){
612 case SERIES_COLUMN_START
:
616 case SERIES_COLUMN_STOP
:
620 case SERIES_COLUMN_STEP
:
627 pIdxInfo
->aConstraintUsage
[startIdx
].argvIndex
= ++nArg
;
628 pIdxInfo
->aConstraintUsage
[startIdx
].omit
= !SQLITE_SERIES_CONSTRAINT_VERIFY
;
631 pIdxInfo
->aConstraintUsage
[stopIdx
].argvIndex
= ++nArg
;
632 pIdxInfo
->aConstraintUsage
[stopIdx
].omit
= !SQLITE_SERIES_CONSTRAINT_VERIFY
;
635 pIdxInfo
->aConstraintUsage
[stepIdx
].argvIndex
= ++nArg
;
636 pIdxInfo
->aConstraintUsage
[stepIdx
].omit
= !SQLITE_SERIES_CONSTRAINT_VERIFY
;
638 if( (idxNum
& 3)==3 ){
639 /* Both start= and stop= boundaries are available. This is the
640 ** the preferred case */
641 pIdxInfo
->estimatedCost
= (double)(2 - ((idxNum
&4)!=0));
642 pIdxInfo
->estimatedRows
= 1000;
643 if( pIdxInfo
->nOrderBy
==1 ){
644 if( pIdxInfo
->aOrderBy
[0].desc
) idxNum
|= 8;
645 pIdxInfo
->orderByConsumed
= 1;
648 /* If either boundary is missing, we have to generate a huge span
649 ** of numbers. Make this case very expensive so that the query
650 ** planner will work hard to avoid it. */
651 pIdxInfo
->estimatedCost
= (double)2147483647;
652 pIdxInfo
->estimatedRows
= 2147483647;
654 pIdxInfo
->idxNum
= idxNum
;
659 ** This following structure defines all the methods for the
660 ** generate_series virtual table.
662 static sqlite3_module seriesModule
= {
665 seriesConnect
, /* xConnect */
666 seriesBestIndex
, /* xBestIndex */
667 seriesDisconnect
, /* xDisconnect */
669 seriesOpen
, /* xOpen - open a cursor */
670 seriesClose
, /* xClose - close a cursor */
671 seriesFilter
, /* xFilter - configure scan constraints */
672 seriesNext
, /* xNext - advance a cursor */
673 seriesEof
, /* xEof - check for end of scan */
674 seriesColumn
, /* xColumn - read data */
675 seriesRowid
, /* xRowid - read data */
689 /* END the generate_series(START,END,STEP) implementation
690 *********************************************************************************/
693 ** Print sketchy documentation for this utility program
695 static void showHelp(void){
696 printf("Usage: %s [options] ?FILE...?\n", g
.zArgv0
);
698 "Read SQL text from FILE... (or from standard input if FILE... is omitted)\n"
699 "and then evaluate each block of SQL contained therein.\n"
701 " --autovacuum Enable AUTOVACUUM mode\n"
702 " --database FILE Use database FILE instead of an in-memory database\n"
703 " --disable-lookaside Turn off lookaside memory\n"
704 " --heap SZ MIN Memory allocator uses SZ bytes & min allocation MIN\n"
705 " --help Show this help text\n"
706 " --lookaside N SZ Configure lookaside for N slots of SZ bytes each\n"
707 " --oom Run each test multiple times in a simulated OOM loop\n"
708 " --pagesize N Set the page size to N\n"
709 " --pcache N SZ Configure N pages of pagecache each of size SZ bytes\n"
710 " -q Reduced output\n"
711 " --quiet Reduced output\n"
712 " --scratch N SZ Configure scratch memory for N slots of SZ bytes each\n"
713 " --unique-cases FILE Write all unique test cases to FILE\n"
714 " --utf16be Set text encoding to UTF-16BE\n"
715 " --utf16le Set text encoding to UTF-16LE\n"
716 " -v Increased output\n"
717 " --verbose Increased output\n"
722 ** Return the value of a hexadecimal digit. Return -1 if the input
723 ** is not a hex digit.
725 static int hexDigitValue(char c
){
726 if( c
>='0' && c
<='9' ) return c
- '0';
727 if( c
>='a' && c
<='f' ) return c
- 'a' + 10;
728 if( c
>='A' && c
<='F' ) return c
- 'A' + 10;
733 ** Interpret zArg as an integer value, possibly with suffixes.
735 static int integerValue(const char *zArg
){
737 static const struct { char *zSuffix
; int iMult
; } aMult
[] = {
739 { "MiB", 1024*1024 },
740 { "GiB", 1024*1024*1024 },
743 { "GB", 1000000000 },
753 }else if( zArg
[0]=='+' ){
756 if( zArg
[0]=='0' && zArg
[1]=='x' ){
759 while( (x
= hexDigitValue(zArg
[0]))>=0 ){
764 while( ISDIGIT(zArg
[0]) ){
765 v
= v
*10 + zArg
[0] - '0';
769 for(i
=0; i
<sizeof(aMult
)/sizeof(aMult
[0]); i
++){
770 if( sqlite3_stricmp(aMult
[i
].zSuffix
, zArg
)==0 ){
775 if( v
>0x7fffffff ) abendError("parameter too large - max 2147483648");
776 return (int)(isNeg
? -v
: v
);
779 /* Return the current wall-clock time */
780 static sqlite3_int64
timeOfDay(void){
781 static sqlite3_vfs
*clockVfs
= 0;
783 if( clockVfs
==0 ) clockVfs
= sqlite3_vfs_find(0);
784 if( clockVfs
->iVersion
>=1 && clockVfs
->xCurrentTimeInt64
!=0 ){
785 clockVfs
->xCurrentTimeInt64(clockVfs
, &t
);
788 clockVfs
->xCurrentTime(clockVfs
, &r
);
789 t
= (sqlite3_int64
)(r
*86400000.0);
794 int main(int argc
, char **argv
){
795 char *zIn
= 0; /* Input text */
796 int nAlloc
= 0; /* Number of bytes allocated for zIn[] */
797 int nIn
= 0; /* Number of bytes of zIn[] used */
798 size_t got
; /* Bytes read from input */
799 int rc
= SQLITE_OK
; /* Result codes from API functions */
800 int i
; /* Loop counter */
801 int iNext
; /* Next block of SQL */
802 sqlite3
*db
; /* Open database */
803 char *zErrMsg
= 0; /* Error message returned from sqlite3_exec() */
804 const char *zEncoding
= 0; /* --utf16be or --utf16le */
805 int nHeap
= 0, mnHeap
= 0; /* Heap size from --heap */
806 int nLook
= 0, szLook
= 0; /* --lookaside configuration */
807 int nPCache
= 0, szPCache
= 0;/* --pcache configuration */
808 int nScratch
= 0, szScratch
=0;/* --scratch configuration */
809 int pageSize
= 0; /* Desired page size. 0 means default */
810 void *pHeap
= 0; /* Allocated heap space */
811 void *pLook
= 0; /* Allocated lookaside space */
812 void *pPCache
= 0; /* Allocated storage for pcache */
813 void *pScratch
= 0; /* Allocated storage for scratch */
814 int doAutovac
= 0; /* True for --autovacuum */
815 char *zSql
; /* SQL to run */
816 char *zToFree
= 0; /* Call sqlite3_free() on this afte running zSql */
817 int verboseFlag
= 0; /* --verbose or -v flag */
818 int quietFlag
= 0; /* --quiet or -q flag */
819 int nTest
= 0; /* Number of test cases run */
820 int multiTest
= 0; /* True if there will be multiple test cases */
821 int lastPct
= -1; /* Previous percentage done output */
822 sqlite3
*dataDb
= 0; /* Database holding compacted input data */
823 sqlite3_stmt
*pStmt
= 0; /* Statement to insert testcase into dataDb */
824 const char *zDataOut
= 0; /* Write compacted data to this output file */
825 int nHeader
= 0; /* Bytes of header comment text on input file */
826 int oomFlag
= 0; /* --oom */
827 int oomCnt
= 0; /* Counter for the OOM loop */
828 char zErrBuf
[200]; /* Space for the error message */
829 const char *zFailCode
; /* Value of the TEST_FAILURE environment var */
830 const char *zPrompt
; /* Initial prompt when large-file fuzzing */
831 int nInFile
= 0; /* Number of input files to read */
832 char **azInFile
= 0; /* Array of input file names */
833 int jj
; /* Loop counter for azInFile[] */
834 sqlite3_int64 iBegin
; /* Start time for the whole program */
835 sqlite3_int64 iStart
, iEnd
; /* Start and end-times for a test case */
836 const char *zDbName
= 0; /* Name of an on-disk database file to open */
838 iBegin
= timeOfDay();
840 zFailCode
= getenv("TEST_FAILURE");
843 for(i
=1; i
<argc
; i
++){
844 const char *z
= argv
[i
];
848 if( strcmp(z
,"autovacuum")==0 ){
851 if( strcmp(z
,"database")==0 ){
852 if( i
>=argc
-1 ) abendError("missing argument on %s\n", argv
[i
]);
856 if( strcmp(z
,"disable-lookaside")==0 ){
860 if( strcmp(z
, "f")==0 && i
+1<argc
){
864 if( strcmp(z
,"heap")==0 ){
865 if( i
>=argc
-2 ) abendError("missing arguments on %s\n", argv
[i
]);
866 nHeap
= integerValue(argv
[i
+1]);
867 mnHeap
= integerValue(argv
[i
+2]);
870 if( strcmp(z
,"help")==0 ){
874 if( strcmp(z
,"lookaside")==0 ){
875 if( i
>=argc
-2 ) abendError("missing arguments on %s", argv
[i
]);
876 nLook
= integerValue(argv
[i
+1]);
877 szLook
= integerValue(argv
[i
+2]);
880 if( strcmp(z
,"oom")==0 ){
883 if( strcmp(z
,"pagesize")==0 ){
884 if( i
>=argc
-1 ) abendError("missing argument on %s", argv
[i
]);
885 pageSize
= integerValue(argv
[++i
]);
887 if( strcmp(z
,"pcache")==0 ){
888 if( i
>=argc
-2 ) abendError("missing arguments on %s", argv
[i
]);
889 nPCache
= integerValue(argv
[i
+1]);
890 szPCache
= integerValue(argv
[i
+2]);
893 if( strcmp(z
,"quiet")==0 || strcmp(z
,"q")==0 ){
897 if( strcmp(z
,"scratch")==0 ){
898 if( i
>=argc
-2 ) abendError("missing arguments on %s", argv
[i
]);
899 nScratch
= integerValue(argv
[i
+1]);
900 szScratch
= integerValue(argv
[i
+2]);
903 if( strcmp(z
, "unique-cases")==0 ){
904 if( i
>=argc
-1 ) abendError("missing arguments on %s", argv
[i
]);
905 if( zDataOut
) abendError("only one --minimize allowed");
906 zDataOut
= argv
[++i
];
908 if( strcmp(z
,"utf16le")==0 ){
909 zEncoding
= "utf16le";
911 if( strcmp(z
,"utf16be")==0 ){
912 zEncoding
= "utf16be";
914 if( strcmp(z
,"verbose")==0 || strcmp(z
,"v")==0 ){
919 abendError("unknown option: %s", argv
[i
]);
924 azInFile
= realloc(azInFile
, sizeof(azInFile
[0])*nInFile
);
925 if( azInFile
==0 ) abendError("out of memory");
926 azInFile
[nInFile
-1] = argv
[i
];
930 /* Do global SQLite initialization */
931 sqlite3_config(SQLITE_CONFIG_LOG
, verboseFlag
? shellLog
: shellLogNoop
, 0);
933 pHeap
= malloc( nHeap
);
934 if( pHeap
==0 ) fatalError("cannot allocate %d-byte heap\n", nHeap
);
935 rc
= sqlite3_config(SQLITE_CONFIG_HEAP
, pHeap
, nHeap
, mnHeap
);
936 if( rc
) abendError("heap configuration failed: %d\n", rc
);
939 sqlite3_config(SQLITE_CONFIG_GETMALLOC
, &g
.sOrigMem
);
940 g
.sOomMem
= g
.sOrigMem
;
941 g
.sOomMem
.xMalloc
= oomMalloc
;
942 g
.sOomMem
.xRealloc
= oomRealloc
;
943 sqlite3_config(SQLITE_CONFIG_MALLOC
, &g
.sOomMem
);
946 sqlite3_config(SQLITE_CONFIG_LOOKASIDE
, 0, 0);
948 pLook
= malloc( nLook
*szLook
);
949 if( pLook
==0 ) fatalError("out of memory");
952 if( nScratch
>0 && szScratch
>0 ){
953 pScratch
= malloc( nScratch
*(sqlite3_int64
)szScratch
);
954 if( pScratch
==0 ) fatalError("cannot allocate %lld-byte scratch",
955 nScratch
*(sqlite3_int64
)szScratch
);
956 rc
= sqlite3_config(SQLITE_CONFIG_SCRATCH
, pScratch
, szScratch
, nScratch
);
957 if( rc
) abendError("scratch configuration failed: %d\n", rc
);
959 if( nPCache
>0 && szPCache
>0 ){
960 pPCache
= malloc( nPCache
*(sqlite3_int64
)szPCache
);
961 if( pPCache
==0 ) fatalError("cannot allocate %lld-byte pcache",
962 nPCache
*(sqlite3_int64
)szPCache
);
963 rc
= sqlite3_config(SQLITE_CONFIG_PAGECACHE
, pPCache
, szPCache
, nPCache
);
964 if( rc
) abendError("pcache configuration failed: %d", rc
);
967 /* If the --unique-cases option was supplied, open the database that will
968 ** be used to gather unique test cases.
971 rc
= sqlite3_open(":memory:", &dataDb
);
972 if( rc
) abendError("cannot open :memory: database");
973 rc
= sqlite3_exec(dataDb
,
974 "CREATE TABLE testcase(sql BLOB PRIMARY KEY, tm) WITHOUT ROWID;",0,0,0);
975 if( rc
) abendError("%s", sqlite3_errmsg(dataDb
));
976 rc
= sqlite3_prepare_v2(dataDb
,
977 "INSERT OR IGNORE INTO testcase(sql,tm)VALUES(?1,?2)",
979 if( rc
) abendError("%s", sqlite3_errmsg(dataDb
));
982 /* Initialize the input buffer used to hold SQL text */
983 if( nInFile
==0 ) nInFile
= 1;
985 zIn
= malloc(nAlloc
);
986 if( zIn
==0 ) fatalError("out of memory");
988 /* Loop over all input files */
989 for(jj
=0; jj
<nInFile
; jj
++){
991 /* Read the complete content of the next input file into zIn[] */
995 in
= fopen(azInFile
[jj
],"rb");
997 abendError("cannot open %s for reading", azInFile
[jj
]);
999 zPrompt
= azInFile
[jj
];
1000 for(j
=k
=0; zPrompt
[j
]; j
++) if( zPrompt
[j
]=='/' ) k
= j
+1;
1004 zPrompt
= "<stdin>";
1007 got
= fread(zIn
+nIn
, 1, nAlloc
-nIn
-1, in
);
1011 if( nAlloc
- nIn
- 1 < 100 ){
1012 nAlloc
+= nAlloc
+1000;
1013 zIn
= realloc(zIn
, nAlloc
);
1014 if( zIn
==0 ) fatalError("out of memory");
1017 if( in
!=stdin
) fclose(in
);
1020 /* Skip initial lines of the input file that begin with "#" */
1021 for(i
=0; i
<nIn
; i
=iNext
+1){
1022 if( zIn
[i
]!='#' ) break;
1023 for(iNext
=i
+1; iNext
<nIn
&& zIn
[iNext
]!='\n'; iNext
++){}
1027 /* Process all test cases contained within the input file.
1029 for(; i
<nIn
; i
=iNext
, nTest
++, g
.zTestName
[0]=0){
1031 if( strncmp(&zIn
[i
], "/****<",6)==0 ){
1032 char *z
= strstr(&zIn
[i
], ">****/");
1035 sqlite3_snprintf(sizeof(g
.zTestName
), g
.zTestName
, "%.*s",
1036 (int)(z
-&zIn
[i
]) - 12, &zIn
[i
+6]);
1038 printf("%.*s\n", (int)(z
-&zIn
[i
]), &zIn
[i
]);
1041 i
+= (int)(z
-&zIn
[i
]);
1045 for(iNext
=i
; iNext
<nIn
&& strncmp(&zIn
[iNext
],"/****<",6)!=0; iNext
++){}
1046 cSaved
= zIn
[iNext
];
1050 /* Print out the SQL of the next test case is --verbose is enabled
1054 printf("INPUT (offset: %d, size: %d): [%s]\n",
1055 i
, (int)strlen(&zIn
[i
]), &zIn
[i
]);
1056 }else if( multiTest
&& !quietFlag
){
1058 printf("%s\n", g
.zTestName
);
1060 int pct
= (10*iNext
)/nIn
;
1062 if( lastPct
<0 ) printf("%s:", zPrompt
);
1063 printf(" %d%%", pct
*10);
1067 }else if( nInFile
>1 ){
1068 printf("%s\n", zPrompt
);
1072 /* Run the next test case. Run it multiple times in --oom mode
1075 oomCnt
= g
.iOomCntdown
= 1;
1079 printf("Once.%d\n", oomCnt
);
1089 rc
= sqlite3_open_v2(zDbName
, &db
, SQLITE_OPEN_READWRITE
, 0);
1090 if( rc
!=SQLITE_OK
){
1091 abendError("Cannot open database file %s", zDbName
);
1094 rc
= sqlite3_open_v2(
1096 SQLITE_OPEN_READWRITE
| SQLITE_OPEN_CREATE
| SQLITE_OPEN_MEMORY
,
1098 if( rc
!=SQLITE_OK
){
1099 abendError("Unable to open the in-memory database");
1103 rc
= sqlite3_db_config(db
, SQLITE_DBCONFIG_LOOKASIDE
,pLook
,szLook
,nLook
);
1104 if( rc
!=SQLITE_OK
) abendError("lookaside configuration filed: %d", rc
);
1106 #ifndef SQLITE_OMIT_TRACE
1107 sqlite3_trace(db
, verboseFlag
? traceCallback
: traceNoop
, 0);
1109 sqlite3_create_function(db
, "eval", 1, SQLITE_UTF8
, 0, sqlEvalFunc
, 0, 0);
1110 sqlite3_create_function(db
, "eval", 2, SQLITE_UTF8
, 0, sqlEvalFunc
, 0, 0);
1111 sqlite3_create_module(db
, "generate_series", &seriesModule
, 0);
1112 sqlite3_limit(db
, SQLITE_LIMIT_LENGTH
, 1000000);
1113 if( zEncoding
) sqlexec(db
, "PRAGMA encoding=%s", zEncoding
);
1114 if( pageSize
) sqlexec(db
, "PRAGMA pagesize=%d", pageSize
);
1115 if( doAutovac
) sqlexec(db
, "PRAGMA auto_vacuum=FULL");
1116 iStart
= timeOfDay();
1118 /* If using an input database file and that database contains a table
1119 ** named "autoexec" with a column "sql", then replace the input SQL
1120 ** with the concatenated text of the autoexec table. In this way,
1121 ** if the database file is the input being fuzzed, the SQL text is
1122 ** fuzzed at the same time. */
1123 if( sqlite3_table_column_metadata(db
,0,"autoexec","sql",0,0,0,0,0)==0 ){
1124 sqlite3_stmt
*pStmt2
;
1125 rc
= sqlite3_prepare_v2(db
,"SELECT sql FROM autoexec",-1,&pStmt2
,0);
1126 if( rc
==SQLITE_OK
){
1127 while( sqlite3_step(pStmt2
)==SQLITE_ROW
){
1128 StrAppend(&sql
, (const char*)sqlite3_column_text(pStmt2
, 0));
1129 StrAppend(&sql
, "\n");
1132 sqlite3_finalize(pStmt2
);
1133 zSql
= StrStr(&sql
);
1139 rc
= sqlite3_exec(db
, zSql
, execCallback
, 0, &zErrMsg
);
1141 sqlite3_snprintf(sizeof(zErrBuf
),zErrBuf
,"%z", zErrMsg
);
1145 rc
= sqlite3_exec(db
, zSql
, execNoop
, 0, 0);
1150 rc
= sqlite3_close(db
);
1152 abendError("sqlite3_close() failed with rc=%d", rc
);
1154 if( !zDataOut
&& sqlite3_memory_used()>0 ){
1155 abendError("memory in use after close: %lld bytes",sqlite3_memory_used());
1158 /* Limit the number of iterations of the OOM loop to OOM_MAX. If the
1159 ** first pass (single failure) exceeds 2/3rds of OOM_MAX this skip the
1160 ** second pass (continuous failure after first) completely. */
1161 if( g
.nOomFault
==0 || oomCnt
>OOM_MAX
){
1162 if( g
.bOomOnce
&& oomCnt
<=(OOM_MAX
*2/3) ){
1163 oomCnt
= g
.iOomCntdown
= 1;
1169 g
.iOomCntdown
= ++oomCnt
;
1174 printf("%s.%d\n", g
.bOomOnce
? "Once" : "Multi", oomCnt
);
1182 /* Store unique test cases in the in the dataDb database if the
1183 ** --unique-cases flag is present
1186 sqlite3_bind_blob(pStmt
, 1, &zIn
[i
], iNext
-i
, SQLITE_STATIC
);
1187 sqlite3_bind_int64(pStmt
, 2, iEnd
- iStart
);
1188 rc
= sqlite3_step(pStmt
);
1189 if( rc
!=SQLITE_DONE
) abendError("%s", sqlite3_errmsg(dataDb
));
1190 sqlite3_reset(pStmt
);
1193 /* Free the SQL from the current test case
1196 sqlite3_free(zToFree
);
1199 zIn
[iNext
] = cSaved
;
1201 /* Show test-case results in --verbose mode
1204 printf("RESULT-CODE: %d\n", rc
);
1206 printf("ERROR-MSG: [%s]\n", zErrBuf
);
1211 /* Simulate an error if the TEST_FAILURE environment variable is "5".
1212 ** This is used to verify that automated test script really do spot
1213 ** errors that occur in this test program.
1216 if( zFailCode
[0]=='5' && zFailCode
[1]==0 ){
1217 abendError("simulated failure");
1218 }else if( zFailCode
[0]!=0 ){
1219 /* If TEST_FAILURE is something other than 5, just exit the test
1221 printf("\nExit early due to TEST_FAILURE being set");
1226 if( !verboseFlag
&& multiTest
&& !quietFlag
&& !oomFlag
) printf("\n");
1229 /* Report total number of tests run
1231 if( nTest
>1 && !quietFlag
){
1232 sqlite3_int64 iElapse
= timeOfDay() - iBegin
;
1233 printf("%s: 0 errors out of %d tests in %d.%03d seconds\nSQLite %s %s\n",
1234 g
.zArgv0
, nTest
, (int)(iElapse
/1000), (int)(iElapse
%1000),
1235 sqlite3_libversion(), sqlite3_sourceid());
1238 /* Write the unique test cases if the --unique-cases flag was used
1242 FILE *out
= fopen(zDataOut
, "wb");
1243 if( out
==0 ) abendError("cannot open %s for writing", zDataOut
);
1244 if( nHeader
>0 ) fwrite(zIn
, nHeader
, 1, out
);
1245 sqlite3_finalize(pStmt
);
1246 rc
= sqlite3_prepare_v2(dataDb
, "SELECT sql, tm FROM testcase ORDER BY tm, sql",
1248 if( rc
) abendError("%s", sqlite3_errmsg(dataDb
));
1249 while( sqlite3_step(pStmt
)==SQLITE_ROW
){
1250 fprintf(out
,"/****<%d:%dms>****/", ++n
, sqlite3_column_int(pStmt
,1));
1251 fwrite(sqlite3_column_blob(pStmt
,0),sqlite3_column_bytes(pStmt
,0),1,out
);
1254 sqlite3_finalize(pStmt
);
1255 sqlite3_close(dataDb
);
1258 /* Clean up and exit.