]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Enhance the --verify option to speedtest1.c so that it computes and displays
authordrh <drh@noemail.net>
Thu, 25 Jun 2020 20:28:13 +0000 (20:28 +0000)
committerdrh <drh@noemail.net>
Thu, 25 Jun 2020 20:28:13 +0000 (20:28 +0000)
a hash of the result from all SQL queries, for verification purposes.

FossilOrigin-Name: 60d1e46c8c8a3c853034fd79f204bcb5d50d1c366eb246849c333a2d0abc2648

manifest
manifest.uuid
test/speedtest1.c

index 56768b3a54b7910246e2b911b4f74657815e34a3..1dcf574f4d3e2288320c6bba9e649d60338ced7e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,6 +1,6 @@
 B 7a876209a678a34c198b54ceef9e3c041f128a14dc73357f6a57cadadaa6cf7b
-C Add\sthe\sieee754_mantissa()\sand\sieee754_exponent()\sfunctions\sto\sthe\siee754\nextension.\s\sBuild\sthe\sieee754\sextension\sinto\sthe\sCLI.
-D 2020-06-24T15:06:29.041
+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
 F Makefile.in 19374a5db06c3199ec1bab71ab74a103d8abf21053c05e9389255dc58083f806
 F Makefile.msc 48f5a3fc32672c09ad73795749f6253e406a31526935fbbffd8f021108d54574
 F autoconf/Makefile.am a8d1d24affe52ebf8d7ddcf91aa973fa0316618ab95bb68c87cabf8faf527dc8
@@ -12,11 +12,14 @@ 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 ea201573f9b27542ea1e74a68e74f121e0eb04c89e67039f40ed68f1b833339f
+F test/speedtest1.c 62a22866f2f1bf3bfd81ded4473314d5508209e7758e122746ace56c138a0f66
 F tool/mkautoconfamal.sh f62353eb6c06ab264da027fd4507d09914433dbdcab9cb011cdc18016f1ab3b8
 F tool/mksqlite3c.tcl f4ef476510eca4124c874a72029f1e01bc54a896b1724e8f9eef0d8bfae0e84c
 F tool/mksqlite3h.tcl 1f5e4a1dbbbc43c83cc6e74fe32c6c620502240b66c7c0f33a51378e78fc4edf
-P 838817b680f02b3845d6d56f85d5d36fa5ae7453afef7a1a5a24624255f2dc3e
-R 6e286f8b0cf2dcbbb10b38a65d995df9
+P db2f0836b64cd2e119684f1cf75fa3b19a84ca6aca1a239f7e2b9298016e2c95
+R 612c27b420c2073a1256c7d89a8eeaa4
+T *branch * speedtest-hash
+T *sym-speedtest-hash *
+T -sym-trunk *
 U drh
-Z 549c83ceeab0b10ef9bb12772423a56c
+Z 5bfc672238a7ff5aba5dfa178b2aded4
index 766ebfb8a35d73c5a87f2c3d0e92c1a243174edb..d888b0868d21db4c3de9f905fddbf316535d8323 100644 (file)
@@ -1 +1 @@
-db2f0836b64cd2e119684f1cf75fa3b19a84ca6aca1a239f7e2b9298016e2c95
\ No newline at end of file
+60d1e46c8c8a3c853034fd79f204bcb5d50d1c366eb246849c333a2d0abc2648
\ No newline at end of file
index ddd2c359112d5befae3a47ec4f518a10f1725933..6703b38752780bd25a41703cf8328784ae2ee2b7 100644 (file)
@@ -41,7 +41,6 @@ static const char zHelp[] =
   "  --without-rowid     Use WITHOUT ROWID where appropriate\n"
 ;
 
-
 #include "sqlite3.h"
 #include <assert.h>
 #include <stdio.h>
@@ -61,6 +60,87 @@ static const char zHelp[] =
 # define sqlite3_int64 sqlite_int64
 #endif
 
+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
+*/
+typedef struct HashContext HashContext;
+struct HashContext {
+  unsigned char isInit;          /* True if initialized */
+  unsigned char i, j;            /* State variables */
+  unsigned char s[256];          /* State variables */
+  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 {
   sqlite3 *db;               /* The open database connection */
@@ -80,8 +160,12 @@ static struct Global {
   const char *zNN;           /* Might be NOT NULL */
   const char *zPK;           /* Might be UNIQUE or PRIMARY KEY */
   unsigned int x, y;         /* Pseudo-random number generator state */
+  u64 nResByte;              /* Total number of result bytes */
   int nResult;               /* Size of the current result */
   char zResult[3000];        /* Text of the current result */
+#ifndef SPEEDTEST_OMIT_HASH
+  HashContext hash;          /* Hash of all output */
+#endif
 } g;
 
 /* Return " TEMP" or "", as appropriate for creating a table.
@@ -91,6 +175,8 @@ static const char *isTemp(int N){
 }
 
 
+
+
 /* Print an error message and exit */
 static void fatal_error(const char *zMsg, ...){
   va_list ap;
@@ -324,6 +410,21 @@ void speedtest1_final(void){
     printf("       TOTAL%.*s %4d.%03ds\n", NAMEWIDTH-5, zDots,
            (int)(g.iTotal/1000), (int)(g.iTotal%1000));
   }
+  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);
+#ifndef SPEEDTEST_OMIT_HASH
+    printf("  hash: ");
+    for(i=0; i<32; i++){
+      printf("%02x", aHash[i]);
+    }
+    printf("\n");
+#endif
+  }
 }
 
 /* Print an SQL statement to standard output */
@@ -434,6 +535,12 @@ void speedtest1_run(void){
       const char *z = (const char*)sqlite3_column_text(g.pStmt, i);
       if( z==0 ) z = "nil";
       len = (int)strlen(z);
+#ifndef SPEEDTEST_OMIT_HASH
+      if( g.bVerify ){
+        HashUpdate(&g.hash, (unsigned char*)z, len);
+        g.nResByte += len;
+      }
+#endif
       if( g.nResult+len<sizeof(g.zResult)-2 ){
         if( g.nResult>0 ) g.zResult[g.nResult++] = ' ';
         memcpy(g.zResult + g.nResult, z, len+1);
@@ -2140,6 +2247,9 @@ int main(int argc, char **argv){
         zEncoding = "utf16be";
       }else if( strcmp(z,"verify")==0 ){
         g.bVerify = 1;
+#ifndef SPEEDTEST_OMIT_HASH
+        HashInit(&g.hash);
+#endif
       }else if( strcmp(z,"without-rowid")==0 ){
         g.zWR = "WITHOUT ROWID";
         g.zPK = "PRIMARY KEY";