]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add --verify to speed-check.sh and add --memdb and --output to speedtest1.c. speedtest-hash
authordrh <drh@noemail.net>
Fri, 26 Jun 2020 14:05:58 +0000 (14:05 +0000)
committerdrh <drh@noemail.net>
Fri, 26 Jun 2020 14:05:58 +0000 (14:05 +0000)
Other improvements to speedtest1.c.

FossilOrigin-Name: 89a11120ab2ce13f8a539cb05a9d0628a1f83b4790910b2023c21d60aabc43ee

manifest
manifest.uuid
test/speedtest1.c
tool/speed-check.sh

index 1dcf574f4d3e2288320c6bba9e649d60338ced7e..6e062f2132b421c91246fbf4e8a1a71f697b648f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,6 +1,6 @@
 B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b
-C Enhance\sthe\s--verify\soption\sto\sspeedtest1.c\sso\sthat\sit\scomputes\sand\sdisplays\na\shash\sof\sthe\sresult\sfrom\sall\sSQL\squeries,\sfor\sverification\spurposes.
-D 2020-06-25T20:28:13.760
+C Add\s--verify\sto\sspeed-check.sh\sand\sadd\s--memdb\sand\s--output\sto\sspeedtest1.c.\nOther\simprovements\sto\sspeedtest1.c.
+D 2020-06-26T14:05:58.668
 F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806
 F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574
 F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8
@@ -12,14 +12,12 @@ F src/build.c ba1bbe563a3dc02d5fed20537603181e5289c13ea30ae5e775f552e7557adbfa
 F src/shell.c.in d663152487d4bfddea0f6d21ebc2ed51575d22657a02c6828afd344bbd4651af
 F src/test1.c fe56c4bcaa2685ca9aa25d817a0ee9345e189aff4a5a71a3d8ba946c7776feb8
 F test/decimal.test 12739a01bdba4c4d79f95b323e6b67b9fad1ab6ffb56116bd2b9c81a5b19e1d9
-F test/speedtest1.c 62a22866f2f1bf3bfd81ded4473314d5508209e7758e122746ace56c138a0f66
+F test/speedtest1.c 18c3a29fba651788a3dc423277d4aa1245860f03fa115f5cad1bebdfbf92bc02
 F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8
 F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfae0e84c
 F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf
-P db2f0836b64cd2e119684f1cf75fa3b19a84ca6aca1a239f7e2b9298016e2c95
-R 612c27b420c2073a1256c7d89a8eeaa4
-T *branch * speedtest-hash
-T *sym-speedtest-hash *
-T -sym-trunk *
+F tool/speed-check.sh 615cbdf50f1409ef3bbf9f682e396df80f49d97ed93ed3e61c8e91fae6afde58
+P 60d1e46c8c8a3c853034fd79f204bcb5d50d1c366eb246849c333a2d0abc2648
+R d502ce56ec4f409f68ad0bf60c478eac
 U drh
-Z 5bfc672238a7ff5aba5dfa178b2aded4
+Z 9ade6808e0b03cd3693ddfa12386f5e0
index d888b0868d21db4c3de9f905fddbf316535d8323..226b741c4e9ec4533b7785c5153e9113d7d4d87a 100644 (file)
@@ -1 +1 @@
-60d1e46c8c8a3c853034fd79f204bcb5d50d1c366eb246849c333a2d0abc2648
\ No newline at end of file
+89a11120ab2ce13f8a539cb05a9d0628a1f83b4790910b2023c21d60aabc43ee
\ No newline at end of file
index 6703b38752780bd25a41703cf8328784ae2ee2b7..fb632444445bd24abbaf47995621aaf5fbdf9915 100644 (file)
@@ -7,7 +7,7 @@ static const char zHelp[] =
   "Usage: %s [--options] DATABASE\n"
   "Options:\n"
   "  --autovacuum        Enable AUTOVACUUM mode\n"
-  "  --cachesize N       Set the cache size to N\n" 
+  "  --cachesize N       Set the cache size to N\n"
   "  --exclusive         Enable locking_mode=EXCLUSIVE\n"
   "  --explain           Like --sqlonly but with added EXPLAIN keywords\n"
   "  --heap SZ MIN       Memory allocator uses SZ bytes & min allocation MIN\n"
@@ -15,11 +15,13 @@ static const char zHelp[] =
   "  --journal M         Set the journal_mode to M\n"
   "  --key KEY           Set the encryption key to KEY\n"
   "  --lookaside N SZ    Configure lookaside for N slots of SZ bytes each\n"
+  "  --memdb             Use an in-memory database\n"
   "  --mmap SZ           MMAP the first SZ bytes of the database file\n"
   "  --multithread       Set multithreaded mode\n"
   "  --nomemstat         Disable memory statistics\n"
   "  --nosync            Set PRAGMA synchronous=OFF\n"
   "  --notnull           Add NOT NULL constraints to table columns\n"
+  "  --output FILE       Store SQL output in FILE\n"
   "  --pagesize N        Set the page size to N\n"
   "  --pcache N SZ       Configure N pages of pagecache each of size SZ bytes\n"
   "  --primarykey        Use PRIMARY KEY instead of UNIQUE where appropriate\n"
@@ -62,11 +64,6 @@ static const char zHelp[] =
 
 typedef sqlite3_uint64 u64;
 
-#ifndef SPEEDTEST_OMIT_HASH
-/****************************************************************************
-** Hash algorithm used to verify that compilation is not miscompiled
-** in such a was as to generate an incorrect result.
-*/
 /*
 ** State structure for a Hash hash in progress
 */
@@ -78,68 +75,6 @@ struct HashContext {
   unsigned char r[32];           /* Result */
 };
 
-/*
-** Initialize a new hash.  iSize determines the size of the hash
-** in bits and should be one of 224, 256, 384, or 512.  Or iSize
-** can be zero to use the default hash size of 256 bits.
-*/
-static void HashInit(HashContext *p){
-  unsigned int k;
-  p->i = 0;
-  p->j = 0;
-  for(k=0; k<256; k++) p->s[k] = k;
-}
-
-/*
-** Make consecutive calls to the HashUpdate function to add new content
-** to the hash
-*/
-static void HashUpdate(
-  HashContext *p,
-  const unsigned char *aData,
-  unsigned int nData
-){
-  unsigned char t;
-  unsigned char i = p->i;
-  unsigned char j = p->j;
-  unsigned int k;
-  for(k=0; k<nData; k++){
-    j += p->s[i] + aData[k];
-    t = p->s[j];
-    p->s[j] = p->s[i];
-    p->s[i] = t;
-    i++;
-  }
-  p->i = i;
-  p->j = j;
-}
-
-/*
-** After all content has been added, invoke HashFinal() to compute
-** the final hash.  The function returns a pointer to the binary
-** hash value.
-*/
-static unsigned char *HashFinal(HashContext *p){
-  unsigned int k;
-  unsigned char t, i, j;
-  i = p->i;
-  j = p->j;
-  for(k=0; k<32; k++){
-    i++;
-    t = p->s[i];
-    j += t;
-    p->s[i] = p->s[j];
-    p->s[j] = t;
-    t += p->s[i];
-    p->r[k] = p->s[t];
-  }
-  return p->r;
-}
-
-/* End of the Hash hashing logic
-*****************************************************************************/
-#endif /* SPEEDTEST_OMIT_HASH */
-
 
 /* All global state is held in this structure */
 static struct Global {
@@ -164,6 +99,7 @@ static struct Global {
   int nResult;               /* Size of the current result */
   char zResult[3000];        /* Text of the current result */
 #ifndef SPEEDTEST_OMIT_HASH
+  FILE *hashFile;            /* Store all hash results in this file */
   HashContext hash;          /* Hash of all output */
 #endif
 } g;
@@ -174,9 +110,6 @@ static const char *isTemp(int N){
   return g.eTemp>=N ? " TEMP" : "";
 }
 
-
-
-
 /* Print an error message and exit */
 static void fatal_error(const char *zMsg, ...){
   va_list ap;
@@ -186,6 +119,72 @@ static void fatal_error(const char *zMsg, ...){
   exit(1);
 }
 
+#ifndef SPEEDTEST_OMIT_HASH
+/****************************************************************************
+** Hash algorithm used to verify that compilation is not miscompiled
+** in such a was as to generate an incorrect result.
+*/
+
+/*
+** Initialize a new hash.  iSize determines the size of the hash
+** in bits and should be one of 224, 256, 384, or 512.  Or iSize
+** can be zero to use the default hash size of 256 bits.
+*/
+static void HashInit(void){
+  unsigned int k;
+  g.hash.i = 0;
+  g.hash.j = 0;
+  for(k=0; k<256; k++) g.hash.s[k] = k;
+}
+
+/*
+** Make consecutive calls to the HashUpdate function to add new content
+** to the hash
+*/
+static void HashUpdate(
+  const unsigned char *aData,
+  unsigned int nData
+){
+  unsigned char t;
+  unsigned char i = g.hash.i;
+  unsigned char j = g.hash.j;
+  unsigned int k;
+  if( g.hashFile ) fwrite(aData, 1, nData, g.hashFile);
+  for(k=0; k<nData; k++){
+    j += g.hash.s[i] + aData[k];
+    t = g.hash.s[j];
+    g.hash.s[j] = g.hash.s[i];
+    g.hash.s[i] = t;
+    i++;
+  }
+  g.hash.i = i;
+  g.hash.j = j;
+}
+
+/*
+** After all content has been added, invoke HashFinal() to compute
+** the final hash.  The hash result is stored in g.hash.r[].
+*/
+static void HashFinal(void){
+  unsigned int k;
+  unsigned char t, i, j;
+  i = g.hash.i;
+  j = g.hash.j;
+  for(k=0; k<32; k++){
+    i++;
+    t = g.hash.s[i];
+    j += t;
+    g.hash.s[i] = g.hash.s[j];
+    g.hash.s[j] = t;
+    t += g.hash.s[i];
+    g.hash.r[k] = g.hash.s[t];
+  }
+}
+
+/* End of the Hash hashing logic
+*****************************************************************************/
+#endif /* SPEEDTEST_OMIT_HASH */
+
 /*
 ** Return the value of a hexadecimal digit.  Return -1 if the input
 ** is not a hex digit.
@@ -413,17 +412,17 @@ void speedtest1_final(void){
   if( g.bVerify ){
 #ifndef SPEEDTEST_OMIT_HASH
     int i;
-    unsigned char *aHash = HashFinal(&g.hash);
 #endif
-    printf("SQL Output Verification:\n");
-    printf("  size: %llu\n", g.nResByte);
+    printf("Verification Hash: %llu ", g.nResByte);
 #ifndef SPEEDTEST_OMIT_HASH
-    printf("  hash: ");
-    for(i=0; i<32; i++){
-      printf("%02x", aHash[i]);
+    HashUpdate((const unsigned char*)"\n", 1);
+    HashFinal();
+    for(i=0; i<24; i++){
+      printf("%02x", g.hash.r[i]);
     }
-    printf("\n");
+    if( g.hashFile && g.hashFile!=stdout ) fclose(g.hashFile);
 #endif
+    printf("\n");
   }
 }
 
@@ -537,8 +536,24 @@ void speedtest1_run(void){
       len = (int)strlen(z);
 #ifndef SPEEDTEST_OMIT_HASH
       if( g.bVerify ){
-        HashUpdate(&g.hash, (unsigned char*)z, len);
-        g.nResByte += len;
+        int eType = sqlite3_column_type(g.pStmt, i);
+        unsigned char zPrefix[2];
+        zPrefix[0] = '\n';
+        zPrefix[1] = "-IFTBN"[eType];
+        if( g.nResByte ){
+          HashUpdate(zPrefix, 2);
+        }else{
+          HashUpdate(zPrefix+1, 1);
+        }
+        if( eType==SQLITE_BLOB ){
+          int nBlob = sqlite3_column_bytes(g.pStmt, i);
+          const unsigned char *aBlob = sqlite3_column_blob(g.pStmt, i);
+          HashUpdate(aBlob, nBlob);
+          g.nResByte += nBlob + 2;
+        }else{
+          HashUpdate((unsigned char*)z, len);
+          g.nResByte += len + 2;
+        }
       }
 #endif
       if( g.nResult+len<sizeof(g.zResult)-2 ){
@@ -2124,6 +2139,7 @@ int main(int argc, char **argv){
   int showStats = 0;            /* True for --stats */
   int nThread = 0;              /* --threads value */
   int mmapSize = 0;             /* How big of a memory map to use */
+  int memDb = 0;                /* --memdb.  Use an in-memory database */
   char *zTSet = "main";         /* Which --testset torun */
   int doTrace = 0;              /* True for --trace */
   const char *zEncoding = 0;    /* --utf16be or --utf16le */
@@ -2137,7 +2153,7 @@ int main(int argc, char **argv){
   int rc;                       /* API return code */
 
   /* Display the version of SQLite being tested */
-  printf("-- Speedtest1 for SQLite %s %.50s\n",
+  printf("-- Speedtest1 for SQLite %s %.48s\n",
          sqlite3_libversion(), sqlite3_sourceid());
 
   /* Process command-line arguments */
@@ -2179,6 +2195,8 @@ int main(int argc, char **argv){
         nLook = integerValue(argv[i+1]);
         szLook = integerValue(argv[i+2]);
         i += 2;
+      }else if( strcmp(z,"memdb")==0 ){
+        memDb = 1;
 #if SQLITE_VERSION_NUMBER>=3006000
       }else if( strcmp(z,"multithread")==0 ){
         sqlite3_config(SQLITE_CONFIG_MULTITHREAD);
@@ -2194,6 +2212,22 @@ int main(int argc, char **argv){
         noSync = 1;
       }else if( strcmp(z,"notnull")==0 ){
         g.zNN = "NOT NULL";
+      }else if( strcmp(z,"output")==0 ){
+#ifdef SPEEDTEST_OMIT_HASH
+        fatal_error("The --output option is not supported with"
+                    " -DSPEEDTEST_OMIT_HASH\n");
+#else
+        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        i++;
+        if( strcmp(argv[i],"-")==0 ){
+          g.hashFile = stdout;
+        }else{
+          g.hashFile = fopen(argv[i], "wb");
+          if( g.hashFile==0 ){
+            fatal_error("cannot open \"%s\" for writing\n", argv[i]);
+          }
+        }
+#endif
       }else if( strcmp(z,"pagesize")==0 ){
         if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
         pageSize = integerValue(argv[++i]);
@@ -2248,7 +2282,7 @@ int main(int argc, char **argv){
       }else if( strcmp(z,"verify")==0 ){
         g.bVerify = 1;
 #ifndef SPEEDTEST_OMIT_HASH
-        HashInit(&g.hash);
+        HashInit();
 #endif
       }else if( strcmp(z,"without-rowid")==0 ){
         g.zWR = "WITHOUT ROWID";
@@ -2291,13 +2325,13 @@ int main(int argc, char **argv){
   sqlite3_initialize();
 
   /* Open the database and the input file */
-  if( sqlite3_open(zDbName, &g.db) ){
+  if( sqlite3_open(memDb ? ":memory:" : zDbName, &g.db) ){
     fatal_error("Cannot open database file: %s\n", zDbName);
   }
 #if SQLITE_VERSION_NUMBER>=3006001
   if( nLook>0 && szLook>0 ){
     pLook = malloc( nLook*szLook );
-    rc = sqlite3_db_config(g.db, SQLITE_DBCONFIG_LOOKASIDE, pLook, szLook,nLook);
+    rc = sqlite3_db_config(g.db, SQLITE_DBCONFIG_LOOKASIDE,pLook,szLook,nLook);
     if( rc ) fatal_error("lookaside configuration failed: %d\n", rc);
   }
 #endif
@@ -2307,6 +2341,9 @@ int main(int argc, char **argv){
 #ifndef SQLITE_OMIT_DEPRECATED
   if( doTrace ) sqlite3_trace(g.db, traceCallback, 0);
 #endif
+  if( memDb>0 ){
+    speedtest1_exec("PRAGMA temp_store=memory");
+  }
   if( mmapSize>0 ){
     speedtest1_exec("PRAGMA mmap_size=%d", mmapSize);
   }
@@ -2346,6 +2383,9 @@ int main(int argc, char **argv){
     }else{
       zTSet = "";
     }
+    if( g.iTotal>0 || zComma!=0 ){
+      printf("       Begin testset \"%s\"\n", zThisTest);
+    }
     if( strcmp(zThisTest,"main")==0 ){
       testset_main();
     }else if( strcmp(zThisTest,"debug1")==0 ){
index 414e4b4482f35b72ed843b3eb4e02a20d2941647..1be7c9e5d377270c2591c240d82a82700f42e7b1 100644 (file)
@@ -79,6 +79,10 @@ while test "$1" != ""; do
         ;;
     --legacy)
        doWal=0
+        CC_OPTS="$CC_OPTS -DSPEEDTEST_OMIT_HASH"
+        ;;
+    --verify)
+        SPEEDTEST_OPTS="$SPEEDTEST_OPTS --verify"
         ;;
     --wal)
         doWal=1