]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Copy all of the fiddle-opfs changes to speedtest1 into trunk.
authordrh <>
Mon, 3 Oct 2022 13:56:52 +0000 (13:56 +0000)
committerdrh <>
Mon, 3 Oct 2022 13:56:52 +0000 (13:56 +0000)
FossilOrigin-Name: f3d31c9982cab517a3907a28c571225cee614ee78375c70eb2efb9a2b6b4b042

manifest
manifest.uuid
test/speedtest1.c

index 36bda4a2544210d0ddf3c4b4be85c65554e58186..b9cd970f841f11d57f71f8e3635662884435f1cb 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sthe\s--vfs\soption\sto\sspeedtest1.
-D 2022-10-03T13:45:03.604
+C Copy\sall\sof\sthe\sfiddle-opfs\schanges\sto\sspeedtest1\sinto\strunk.
+D 2022-10-03T13:56:52.781
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -1480,7 +1480,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef
 F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715
 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa
 F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c
-F test/speedtest1.c 8a9f6b6f6b5b1a18739b9a2eca8dd3ad131f28946c14eb5ae33fefeeada466b7
+F test/speedtest1.c 752fc1cad512f7c94271d3fdb46d6d90c9f6b61d0a4722a28c7028f53952fb1d
 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e
 F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3
 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33
@@ -2000,8 +2000,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 372802aaa22a830bf498bb0d9561ae02b32e5e191c4d7d771ea152140f6685a1
-R bb0d587e0921cce1f37f5122ed804b2c
+P aeb884029ac1c68f0d7361dda0a545cff19ed265b608c1e329a1926397c5c8a3
+R 9ef7b22777f981a0530dc8b380258dc2
 U drh
-Z 3f01ed1217459ee72edb7ee3c272f0cd
+Z 4bdd14d37dfc0c4e0295fe6f5fd60fb3
 # Remove this line to create a well-formed Fossil manifest.
index d991ba1f14eeae38af54b3103a77612d8a138cd9..1ce7bd9cf2e8999c228dfe70ca7d576ba387478b 100644 (file)
@@ -1 +1 @@
-aeb884029ac1c68f0d7361dda0a545cff19ed265b608c1e329a1926397c5c8a3
\ No newline at end of file
+f3d31c9982cab517a3907a28c571225cee614ee78375c70eb2efb9a2b6b4b042
\ No newline at end of file
index c4ae8bdd5da185e034273eeb5890c3a4239df5b3..d1efdf13a01d326bb0bd09fb1484eab218a99bc7 100644 (file)
@@ -7,6 +7,7 @@ static const char zHelp[] =
   "Usage: %s [--options] DATABASE\n"
   "Options:\n"
   "  --autovacuum        Enable AUTOVACUUM mode\n"
+  "  --big-transactions  Add BEGIN/END around large tests which normally don't\n"
   "  --cachesize N       Set the cache size to N\n"
   "  --checkpoint        Run PRAGMA wal_checkpoint after each test case\n"
   "  --exclusive         Enable locking_mode=EXCLUSIVE\n"
@@ -20,6 +21,7 @@ static const char zHelp[] =
   "  --mmap SZ           MMAP the first SZ bytes of the database file\n"
   "  --multithread       Set multithreaded mode\n"
   "  --nomemstat         Disable memory statistics\n"
+  "  --nomutex           Open db with SQLITE_OPEN_NOMUTEX\n"
   "  --nosync            Set PRAGMA synchronous=OFF\n"
   "  --notnull           Add NOT NULL constraints to table columns\n"
   "  --output FILE       Store SQL output in FILE\n"
@@ -43,8 +45,8 @@ static const char zHelp[] =
   "  --threads N         Use up to N threads for sorting\n"
   "  --utf16be           Set text encoding to UTF-16BE\n"
   "  --utf16le           Set text encoding to UTF-16LE\n"
-  "  --verify            Run additional verification steps.\n"
-  "  --vfs NAME          Specify the VFS to use.\n"
+  "  --verify            Run additional verification steps\n"
+  "  --vfs NAME          Use the given (preinstalled) VFS\n"
   "  --without-rowid     Use WITHOUT ROWID where appropriate\n"
 ;
 
@@ -98,6 +100,7 @@ static struct Global {
   int nRepeat;               /* Repeat selects this many times */
   int doCheckpoint;          /* Run PRAGMA wal_checkpoint after each trans */
   int nReserve;              /* Reserve bytes */
+  int doBigTransactions;     /* Enable transactions on tests 410 and 510 */
   const char *zWR;           /* Might be WITHOUT ROWID */
   const char *zNN;           /* Might be NOT NULL */
   const char *zPK;           /* Might be UNIQUE or PRIMARY KEY */
@@ -373,10 +376,12 @@ int speedtest1_numbername(unsigned int n, char *zOut, int nOut){
 #define NAMEWIDTH 60
 static const char zDots[] =
   ".......................................................................";
+static int iTestNumber = 0;  /* Current test # for begin/end_test(). */
 void speedtest1_begin_test(int iTestNum, const char *zTestName, ...){
   int n = (int)strlen(zTestName);
   char *zName;
   va_list ap;
+  iTestNumber = iTestNum;
   va_start(ap, zTestName);
   zName = sqlite3_vmprintf(zTestName, ap);
   va_end(ap);
@@ -385,6 +390,11 @@ void speedtest1_begin_test(int iTestNum, const char *zTestName, ...){
     zName[NAMEWIDTH] = 0;
     n = NAMEWIDTH;
   }
+  if( g.pScript ){
+    fprintf(g.pScript,"-- begin test %d %.*s\n", iTestNumber, n, zName)
+      /* maintenance reminder: ^^^ code in ext/wasm expects %d to be
+      ** field #4 (as in: cut -d' ' -f4). */;
+  }
   if( g.bSqlOnly ){
     printf("/* %4d - %s%.*s */\n", iTestNum, zName, NAMEWIDTH-n, zDots);
   }else{
@@ -405,6 +415,10 @@ void speedtest1_exec(const char*,...);
 void speedtest1_end_test(void){
   sqlite3_int64 iElapseTime = speedtest1_timestamp() - g.iStart;
   if( g.doCheckpoint ) speedtest1_exec("PRAGMA wal_checkpoint;");
+  assert( iTestNumber > 0 );
+  if( g.pScript ){
+    fprintf(g.pScript,"-- end test %d\n", iTestNumber);
+  }
   if( !g.bSqlOnly ){
     g.iTotal += iElapseTime;
     printf("%4d.%03ds\n", (int)(iElapseTime/1000), (int)(iElapseTime%1000));
@@ -413,6 +427,7 @@ void speedtest1_end_test(void){
     sqlite3_finalize(g.pStmt);
     g.pStmt = 0;
   }
+  iTestNumber = 0;
 }
 
 /* Report end of testing */
@@ -1106,12 +1121,24 @@ void testset_main(void){
   speedtest1_exec("COMMIT");
   speedtest1_end_test();
   speedtest1_begin_test(410, "%d SELECTS on an IPK", n);
+  if( g.doBigTransactions ){
+    /* Historical note: tests 410 and 510 have historically not used
+    ** explicit transactions. The --big-transactions flag was added
+    ** 2022-09-08 to support the WASM/OPFS build, as the run-times
+    ** approach 1 minute for each of these tests if they're not in an
+    ** explicit transaction. The run-time effect of --big-transaciions
+    ** on native builds is negligible. */
+    speedtest1_exec("BEGIN");
+  }
   speedtest1_prepare("SELECT b FROM t5 WHERE a=?1; --  %d times",n);
   for(i=1; i<=n; i++){
     x1 = swizzle(i,maxb);
     sqlite3_bind_int(g.pStmt, 1, (sqlite3_int64)x1);
     speedtest1_run();
   }
+  if( g.doBigTransactions ){
+    speedtest1_exec("COMMIT");
+  }
   speedtest1_end_test();
 
   sz = n = g.szTest*700;
@@ -1133,6 +1160,10 @@ void testset_main(void){
   speedtest1_exec("COMMIT");
   speedtest1_end_test();
   speedtest1_begin_test(510, "%d SELECTS on a TEXT PK", n);
+  if( g.doBigTransactions ){
+    /* See notes for test 410. */
+    speedtest1_exec("BEGIN");
+  }
   speedtest1_prepare("SELECT b FROM t6 WHERE a=?1; --  %d times",n);
   for(i=1; i<=n; i++){
     x1 = swizzle(i,maxb);
@@ -1140,6 +1171,9 @@ void testset_main(void){
     sqlite3_bind_text(g.pStmt, 1, zNum, -1, SQLITE_STATIC);
     speedtest1_run();
   }
+  if( g.doBigTransactions ){
+    speedtest1_exec("COMMIT");
+  }
   speedtest1_end_test();
   speedtest1_begin_test(520, "%d SELECT DISTINCT", n);
   speedtest1_exec("SELECT DISTINCT b FROM t5;");
@@ -2163,7 +2197,6 @@ static int xCompileOptions(void *pCtx, int nVal, char **azVal, char **azCol){
   printf("-- Compile option: %s\n", azVal[0]);
   return SQLITE_OK;
 }
-
 int main(int argc, char **argv){
   int doAutovac = 0;            /* True for --autovacuum */
   int cacheSize = 0;            /* Desired cache size.  0 means default */
@@ -2181,11 +2214,13 @@ int main(int argc, char **argv){
   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 */
+  int openFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE
+    ;                           /* SQLITE_OPEN_xxx flags. */
   char *zTSet = "main";         /* Which --testset torun */
+  const char * zVfs = 0;        /* --vfs NAME */
   int doTrace = 0;              /* True for --trace */
   const char *zEncoding = 0;    /* --utf16be or --utf16le */
   const char *zDbName = 0;      /* Name of the test database */
-  const char *zVfs = 0;         /* VFS to use.  NULL means use the default */
 
   void *pHeap = 0;              /* Allocated heap space */
   void *pLook = 0;              /* Allocated lookaside space */
@@ -2194,10 +2229,19 @@ int main(int argc, char **argv){
   int i;                        /* Loop counter */
   int rc;                       /* API return code */
 
+#ifdef SQLITE_SPEEDTEST1_WASM
+  /* Resetting all state is important for the WASM build, which may
+  ** call main() multiple times. */
+  memset(&g, 0, sizeof(g));
+  iTestNumber = 0;
+#endif
 #ifdef SQLITE_CKSUMVFS_STATIC
   sqlite3_register_cksumvfs(0);
 #endif
-
+  /*
+  ** Confirms that argc has at least N arguments following argv[i]. */
+#define ARGC_VALUE_CHECK(N)                                       \
+  if( i>=argc-(N) ) fatal_error("missing argument on %s\n", argv[i])
   /* Display the version of SQLite being tested */
   printf("-- Speedtest1 for SQLite %s %.48s\n",
          sqlite3_libversion(), sqlite3_sourceid());
@@ -2214,10 +2258,11 @@ int main(int argc, char **argv){
       do{ z++; }while( z[0]=='-' );
       if( strcmp(z,"autovacuum")==0 ){
         doAutovac = 1;
+      }else if( strcmp(z,"big-transactions")==0 ){
+        g.doBigTransactions = 1;
       }else if( strcmp(z,"cachesize")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
-        i++;
-        cacheSize = integerValue(argv[i]);
+        ARGC_VALUE_CHECK(1);
+        cacheSize = integerValue(argv[++i]);
       }else if( strcmp(z,"exclusive")==0 ){
         doExclusive = 1;
       }else if( strcmp(z,"checkpoint")==0 ){
@@ -2226,20 +2271,20 @@ int main(int argc, char **argv){
         g.bSqlOnly = 1;
         g.bExplain = 1;
       }else if( strcmp(z,"heap")==0 ){
-        if( i>=argc-2 ) fatal_error("missing arguments on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(2);
         nHeap = integerValue(argv[i+1]);
         mnHeap = integerValue(argv[i+2]);
         i += 2;
       }else if( strcmp(z,"incrvacuum")==0 ){
         doIncrvac = 1;
       }else if( strcmp(z,"journal")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         zJMode = argv[++i];
       }else if( strcmp(z,"key")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         zKey = argv[++i];
       }else if( strcmp(z,"lookaside")==0 ){
-        if( i>=argc-2 ) fatal_error("missing arguments on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(2);
         nLook = integerValue(argv[i+1]);
         szLook = integerValue(argv[i+2]);
         i += 2;
@@ -2253,9 +2298,11 @@ int main(int argc, char **argv){
 #endif
 #if SQLITE_VERSION_NUMBER>=3007017
       }else if( strcmp(z, "mmap")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         mmapSize = integerValue(argv[++i]);
  #endif
+      }else if( strcmp(z,"nomutex")==0 ){
+        openFlags |= SQLITE_OPEN_NOMUTEX;
       }else if( strcmp(z,"nosync")==0 ){
         noSync = 1;
       }else if( strcmp(z,"notnull")==0 ){
@@ -2265,7 +2312,7 @@ int main(int argc, char **argv){
         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]);
+        ARGC_VALUE_CHECK(1);
         i++;
         if( strcmp(argv[i],"-")==0 ){
           g.hashFile = stdout;
@@ -2277,10 +2324,10 @@ int main(int argc, char **argv){
         }
 #endif
       }else if( strcmp(z,"pagesize")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         pageSize = integerValue(argv[++i]);
       }else if( strcmp(z,"pcache")==0 ){
-        if( i>=argc-2 ) fatal_error("missing arguments on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(2);
         nPCache = integerValue(argv[i+1]);
         szPCache = integerValue(argv[i+2]);
         doPCache = 1;
@@ -2288,9 +2335,8 @@ int main(int argc, char **argv){
       }else if( strcmp(z,"primarykey")==0 ){
         g.zPK = "PRIMARY KEY";
       }else if( strcmp(z,"repeat")==0 ){
-        if( i>=argc-1 ) fatal_error("missing arguments on %s\n", argv[i]);
-        g.nRepeat = integerValue(argv[i+1]);
-        i += 1;
+        ARGC_VALUE_CHECK(1);
+        g.nRepeat = integerValue(argv[++i]);
       }else if( strcmp(z,"reprepare")==0 ){
         g.bReprepare = 1;
 #if SQLITE_VERSION_NUMBER>=3006000
@@ -2300,7 +2346,7 @@ int main(int argc, char **argv){
         sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
 #endif
       }else if( strcmp(z,"script")==0 ){
-        if( i>=argc-1 ) fatal_error("missing arguments on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         if( g.pScript ) fclose(g.pScript);
         g.pScript = fopen(argv[++i], "wb");
         if( g.pScript==0 ){
@@ -2311,24 +2357,24 @@ int main(int argc, char **argv){
       }else if( strcmp(z,"shrink-memory")==0 ){
         g.bMemShrink = 1;
       }else if( strcmp(z,"size")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         g.szTest = integerValue(argv[++i]);
       }else if( strcmp(z,"stats")==0 ){
         showStats = 1;
       }else if( strcmp(z,"temp")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         i++;
         if( argv[i][0]<'0' || argv[i][0]>'9' || argv[i][1]!=0 ){
           fatal_error("argument to --temp should be integer between 0 and 9");
         }
         g.eTemp = argv[i][0] - '0';
       }else if( strcmp(z,"testset")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         zTSet = argv[++i];
       }else if( strcmp(z,"trace")==0 ){
         doTrace = 1;
       }else if( strcmp(z,"threads")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         nThread = integerValue(argv[++i]);
       }else if( strcmp(z,"utf16le")==0 ){
         zEncoding = "utf16le";
@@ -2339,8 +2385,11 @@ int main(int argc, char **argv){
 #ifndef SPEEDTEST_OMIT_HASH
         HashInit();
 #endif
+      }else if( strcmp(z,"vfs")==0 ){
+        ARGC_VALUE_CHECK(1);
+        zVfs = argv[++i];
       }else if( strcmp(z,"reserve")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
+        ARGC_VALUE_CHECK(1);
         g.nReserve = atoi(argv[++i]);
       }else if( strcmp(z,"without-rowid")==0 ){
         if( strstr(g.zWR,"WITHOUT")!=0 ){
@@ -2359,9 +2408,6 @@ int main(int argc, char **argv){
         }else{
           g.zWR = "STRICT";
         }
-      }else if( strcmp(z,"vfs")==0 ){
-        if( i>=argc-1 ) fatal_error("missing argument on %s\n", argv[i]);
-        zVfs = argv[++i];
       }else if( strcmp(z, "help")==0 || strcmp(z,"?")==0 ){
         printf(zHelp, argv[0]);
         exit(0);
@@ -2376,6 +2422,7 @@ int main(int argc, char **argv){
                   argv[i], argv[0]);
     }
   }
+#undef ARGC_VALUE_CHECK
   if( zDbName!=0 ) unlink(zDbName);
 #if SQLITE_VERSION_NUMBER>=3006001
   if( nHeap>0 ){
@@ -2401,7 +2448,7 @@ int main(int argc, char **argv){
 
   /* Open the database and the input file */
   if( sqlite3_open_v2(memDb ? ":memory:" : zDbName, &g.db,
-                      SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, zVfs) ){
+                      openFlags, zVfs) ){
     fatal_error("Cannot open database file: %s\n", zDbName);
   }
 #if SQLITE_VERSION_NUMBER>=3006001
@@ -2586,3 +2633,13 @@ int main(int argc, char **argv){
   free( pHeap );
   return 0;
 }
+
+#ifdef SQLITE_SPEEDTEST1_WASM
+/*
+** A workaround for some inconsistent behaviour with how
+** main() does (or does not) get exported to WASM.
+*/
+int wasm_main(int argc, char **argv){
+  return main(argc, argv);
+}
+#endif