]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the --result-trace option to fuzzcheck, and other interface enhancements.
authordrh <drh@noemail.net>
Tue, 26 May 2015 00:28:08 +0000 (00:28 +0000)
committerdrh <drh@noemail.net>
Tue, 26 May 2015 00:28:08 +0000 (00:28 +0000)
FossilOrigin-Name: c415bb7bbfd531b138462589cdd58fa0204804e8

manifest
manifest.uuid
test/fuzzcheck.c

index 169d56db372a5951475e16058ac4a79ecd06b5b9..553917760d2d669e48ef6076c693ed49b186f8ab 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\simportant\sbug\sin\sthe\sxRead\smethod\sof\sthe\sin-memory\sVFS\sfor\sfuzzcheck.
-D 2015-05-25T23:14:37.419
+C Add\sthe\s--result-trace\soption\sto\sfuzzcheck,\sand\sother\sinterface\senhancements.
+D 2015-05-26T00:28:08.697
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 411b8dc7191769de8b1ddd5c4d83bcf2e37ed5e4
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -651,7 +651,7 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1
 F test/fuzz3.test efd384b896c647b61a2c1848ba70d42aad60a7b3
 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b
 F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26
-F test/fuzzcheck.c d545dfbca2e9a75de7ae92ed3139900a6fadf846
+F test/fuzzcheck.c 7c7946e0ab6021361f12f5776f6e84bb0e122ca3
 F test/fuzzdata1.txt 9fceb50868e0b798160e83742bd7e44e457176a0
 F test/fuzzdata2.txt ba9b4467d7ec46cc85d32c0d031540cd727ae6ad
 F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36
@@ -1279,7 +1279,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 341cb6abe74e1e9d03c82ffdeba86be6a2d00397
-R f5e89509deaf82258e177c7db9b5da20
+P 58cd40e89f3060c63abb9a3fca385a1e72ce7bb4
+R 32cf38aec65deccc8cc067da345baf0c
 U drh
-Z b0b4ed3682ecee9d5832e0b1ae33eee2
+Z 6c1ca5d7f4d278cf3dabf72acc1e60c9
index 85afaf7f76ccbe3bf0b2cdbe2f02c3b1dffbd9c8..4fa20f3143c742f425c63ee47481f48f530d5831 100644 (file)
@@ -1 +1 @@
-58cd40e89f3060c63abb9a3fca385a1e72ce7bb4
\ No newline at end of file
+c415bb7bbfd531b138462589cdd58fa0204804e8
\ No newline at end of file
index 32ce93a4694ebae8ae6a893069aba59fccdbe539..9688e5cc7513cfebe71aca7ac8fc1a2342675528 100644 (file)
@@ -66,6 +66,7 @@ typedef struct Blob Blob;
 struct Blob {
   Blob *pNext;            /* Next in a list */
   int id;                 /* Id of this Blob */
+  int seq;                /* Sequence number */
   int sz;                 /* Size of this Blob in bytes */
   unsigned char a[1];     /* Blob content.  Extra space allocated as needed. */
 };
@@ -257,12 +258,12 @@ static void blobListLoadFromDb(
     Blob *pNew = safe_realloc(0, sizeof(*pNew)+sz );
     pNew->id = sqlite3_column_int(pStmt, 0);
     pNew->sz = sz;
+    pNew->seq = n++;
     pNew->pNext = 0;
     memcpy(pNew->a, sqlite3_column_blob(pStmt,1), sz);
     pNew->a[sz] = 0;
     p->pNext = pNew;
     p = pNew;
-    n++;
   }
   sqlite3_finalize(pStmt);
   *pN = n;
@@ -506,11 +507,17 @@ static void inmemVfsRegister(void){
   sqlite3_vfs_register(&inmemVfs, 0);
 };
 
+/*
+** Allowed values for the runFlags parameter to runSql()
+*/
+#define SQL_TRACE  0x0001     /* Print each SQL statement as it is prepared */
+#define SQL_OUTPUT 0x0002     /* Show the SQL output */
+
 /*
 ** Run multiple commands of SQL.  Similar to sqlite3_exec(), but does not
 ** stop if an error is encountered.
 */
-static void runSql(sqlite3 *db, const char *zSql, int traceFlag){
+static void runSql(sqlite3 *db, const char *zSql, unsigned  runFlags){
   const char *zMore;
   sqlite3_stmt *pStmt;
 
@@ -519,7 +526,7 @@ static void runSql(sqlite3 *db, const char *zSql, int traceFlag){
     pStmt = 0;
     sqlite3_prepare_v2(db, zSql, -1, &pStmt, &zMore);
     if( zMore==zSql ) break;
-    if( traceFlag ){
+    if( runFlags & SQL_TRACE ){
       const char *z = zSql;
       int n;
       while( z<zMore && isspace(z[0]) ) z++;
@@ -534,7 +541,45 @@ static void runSql(sqlite3 *db, const char *zSql, int traceFlag){
     }
     zSql = zMore;
     if( pStmt ){
-      while( SQLITE_ROW==sqlite3_step(pStmt) ){}
+      if( (runFlags & SQL_OUTPUT)==0 ){
+        while( SQLITE_ROW==sqlite3_step(pStmt) ){}
+      }else{
+        int nCol = -1;
+        while( SQLITE_ROW==sqlite3_step(pStmt) ){
+          int i;
+          if( nCol<0 ){
+            nCol = sqlite3_column_count(pStmt);
+          }else if( nCol>0 ){
+            printf("--------------------------------------------\n");
+          }
+          for(i=0; i<nCol; i++){
+            int eType = sqlite3_column_type(pStmt,i);
+            printf("%s = ", sqlite3_column_name(pStmt,i));
+            switch( eType ){
+              case SQLITE_NULL: {
+                printf("NULL\n");
+                break;
+              }
+              case SQLITE_INTEGER: {
+                printf("INT %s\n", sqlite3_column_text(pStmt,i));
+                break;
+              }
+              case SQLITE_FLOAT: {
+                printf("FLOAT %s\n", sqlite3_column_text(pStmt,i));
+                break;
+              }
+              case SQLITE_TEXT: {
+                printf("TEXT [%s]\n", sqlite3_column_text(pStmt,i));
+                break;
+              }
+              case SQLITE_BLOB: {
+                printf("BLOB (%d bytes)\n", sqlite3_column_bytes(pStmt,i));
+                break;
+              }
+            }
+          }
+        }
+      }         
       sqlite3_finalize(pStmt);
     }
   }
@@ -556,6 +601,7 @@ static void showHelp(void){
 "  --load-sql ARGS...    Load SQL scripts fro files into SOURCE-DB\n"
 "  --load-db ARGS...     Load template databases from files into SOURCE_DB\n"
 "  --native-vfs          Use the native VFS for initially empty database files\n"
+"  --result-trace        Show the results of each SQL command\n"
 "  --sqlid N             Use only SQL where sqlid=N\n"
 "  -v                    Increased output\n"
 "  --verbose             Increased output\n"
@@ -577,6 +623,7 @@ int main(int argc, char **argv){
   int onlySqlid = -1;          /* --sqlid */
   int onlyDbid = -1;           /* --dbid */
   int nativeFlag = 0;          /* --native-vfs */
+  int runFlags = 0;            /* Flags sent to runSql() */
 
   iBegin = timeOfDay();
   g.zArgv0 = argv[0];
@@ -594,7 +641,7 @@ int main(int argc, char **argv){
         return 0;
       }else
       if( strcmp(z,"load-sql")==0 ){
-        zInsSql = "INSERT INTO xsql(sqltext) VALUES(readfile(?1))";
+        zInsSql = "INSERT INTO xsql(sqltext) VALUES(CAST(readfile(?1) AS text))";
         iFirstInsArg = i+1;
         break;
       }else
@@ -610,6 +657,9 @@ int main(int argc, char **argv){
         quietFlag = 1;
         verboseFlag = 0;
       }else
+      if( strcmp(z,"result-trace")==0 ){
+        runFlags |= SQL_OUTPUT;
+      }else
       if( strcmp(z,"sqlid")==0 ){
         if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]);
         onlySqlid = atoi(argv[++i]);
@@ -617,6 +667,7 @@ int main(int argc, char **argv){
       if( strcmp(z,"verbose")==0 || strcmp(z,"v")==0 ){
         quietFlag = 0;
         verboseFlag = 1;
+        runFlags |= SQL_TRACE;
       }else
       {
         fatalError("unknown option: %s", argv[i]);
@@ -676,6 +727,7 @@ int main(int argc, char **argv){
     g.pFirstDb = safe_realloc(0, sizeof(Blob));
     memset(g.pFirstDb, 0, sizeof(Blob));
     g.pFirstDb->id = 1;
+    g.pFirstDb->seq = 0;
     g.nDb = 1;
   }
     
@@ -712,7 +764,7 @@ int main(int argc, char **argv){
         fflush(stdout);
       }else if( !quietFlag ){
         static int prevAmt = -1;
-        int idx = (pSql->id-1)*g.nDb + pDb->id - 1;
+        int idx = pSql->seq*g.nDb + pDb->id - 1;
         int amt = idx*10/(g.nDb*g.nSql);
         if( amt!=prevAmt ){
           printf(" %d%%", amt*10);
@@ -728,7 +780,7 @@ int main(int argc, char **argv){
       }
       rc = sqlite3_open_v2("main.db", &db, openFlags, zVfs);
       if( rc ) fatalError("cannot open inmem database");
-      runSql(db, (char*)pSql->a, verboseFlag);
+      runSql(db, (char*)pSql->a, runFlags);
       sqlite3_close(db);
       if( sqlite3_memory_used()>0 ) fatalError("memory leak");
       reformatVfs();
@@ -738,7 +790,7 @@ int main(int argc, char **argv){
 
   if( !quietFlag ){
     sqlite3_int64 iElapse = timeOfDay() - iBegin;
-    if( !verboseFlag ) printf("\n");
+    if( !verboseFlag ) printf(" 100%%\n");
     printf("fuzzcheck: 0 errors out of %d tests in %d.%03d seconds\nSQLite %s %s\n",
            g.nDb*g.nSql, (int)(iElapse/1000), (int)(iElapse%1000),
            sqlite3_libversion(), sqlite3_sourceid());