/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact a7cd2b2dbb8f97b0c51c0e01f49116a9162071be:


0000: 2f 2a 0d 0a 2a 2a 20 50 65 72 66 6f 72 6d 61 6e  /*..** Performan
0010: 63 65 20 74 65 73 74 20 66 6f 72 20 53 51 4c 69  ce test for SQLi
0020: 74 65 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 69 73  te...**..** This
0030: 20 70 72 6f 67 72 61 6d 20 72 65 61 64 73 20 41   program reads A
0040: 53 43 49 49 20 74 65 78 74 20 66 72 6f 6d 20 61  SCII text from a
0050: 20 66 69 6c 65 20 6e 61 6d 65 64 20 6f 6e 20 74   file named on t
0060: 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 0d  he command-line.
0070: 0a 2a 2a 20 61 6e 64 20 73 75 62 6d 69 74 73 20  .** and submits 
0080: 74 68 61 74 20 74 65 78 74 20 20 74 6f 20 53 51  that text  to SQ
0090: 4c 69 74 65 20 66 6f 72 20 65 76 61 6c 75 61 74  Lite for evaluat
00a0: 69 6f 6e 2e 20 20 41 20 6e 65 77 20 64 61 74 61  ion.  A new data
00b0: 62 61 73 65 0d 0a 2a 2a 20 69 73 20 63 72 65 61  base..** is crea
00c0: 74 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  ted at the begin
00d0: 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ning of the prog
00e0: 72 61 6d 2e 20 20 41 6c 6c 20 73 74 61 74 65 6d  ram.  All statem
00f0: 65 6e 74 73 20 61 72 65 0d 0a 2a 2a 20 74 69 6d  ents are..** tim
0100: 65 64 20 75 73 69 6e 67 20 74 68 65 20 68 69 67  ed using the hig
0110: 68 2d 72 65 73 6f 6c 75 74 69 6f 6e 20 74 69 6d  h-resolution tim
0120: 65 72 20 62 75 69 6c 74 20 69 6e 74 6f 20 49 6e  er built into In
0130: 74 65 6c 2d 63 6c 61 73 73 20 70 72 6f 63 65 73  tel-class proces
0140: 73 6f 72 73 2e 0d 0a 2a 2a 0d 0a 2a 2a 20 54 6f  sors...**..** To
0150: 20 63 6f 6d 70 69 6c 65 20 74 68 69 73 20 70 72   compile this pr
0160: 6f 67 72 61 6d 2c 20 66 69 72 73 74 20 63 6f 6d  ogram, first com
0170: 70 69 6c 65 20 74 68 65 20 53 51 4c 69 74 65 20  pile the SQLite 
0180: 6c 69 62 72 61 72 79 20 73 65 70 61 72 61 74 65  library separate
0190: 6c 79 0d 0a 2a 2a 20 77 69 6c 6c 20 66 75 6c 6c  ly..** will full
01a0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e 20   optimizations. 
01b0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0d 0a 2a   For example:..*
01c0: 2a 0d 0a 2a 2a 20 20 20 20 20 67 63 63 20 2d 63  *..**     gcc -c
01d0: 20 2d 4f 36 20 2d 44 53 51 4c 49 54 45 5f 54 48   -O6 -DSQLITE_TH
01e0: 52 45 41 44 53 41 46 45 3d 30 20 73 71 6c 69 74  READSAFE=0 sqlit
01f0: 65 33 2e 63 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65  e3.c..**..** The
0200: 6e 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74  n link against t
0210: 68 69 73 20 70 72 6f 67 72 61 6d 2e 20 20 42 75  his program.  Bu
0220: 74 20 74 6f 20 64 6f 20 6f 70 74 69 6d 69 7a 65  t to do optimize
0230: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0d 0a 2a   this program..*
0240: 2a 20 62 65 63 61 75 73 65 20 74 68 61 74 20 64  * because that d
0250: 65 66 65 61 74 73 20 74 68 65 20 68 69 2d 72 65  efeats the hi-re
0260: 73 20 74 69 6d 65 72 2e 0d 0a 2a 2a 0d 0a 2a 2a  s timer...**..**
0270: 20 20 20 20 20 67 63 63 20 73 70 65 65 64 74 65       gcc speedte
0280: 73 74 38 2e 63 20 73 71 6c 69 74 65 33 2e 6f 20  st8.c sqlite3.o 
0290: 2d 6c 64 6c 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65  -ldl..**..** The
02a0: 6e 20 72 75 6e 20 74 68 69 73 20 70 72 6f 67 72  n run this progr
02b0: 61 6d 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  am with a single
02c0: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
02d0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0d 0a  is the name of..
02e0: 2a 2a 20 61 20 66 69 6c 65 20 63 6f 6e 74 61 69  ** a file contai
02f0: 6e 69 6e 67 20 53 51 4c 20 73 63 72 69 70 74 20  ning SQL script 
0300: 74 68 61 74 20 79 6f 75 20 77 61 6e 74 20 74 6f  that you want to
0310: 20 74 65 73 74 3a 0d 0a 2a 2a 0d 0a 2a 2a 20 20   test:..**..**  
0320: 20 20 20 2e 2f 61 2e 6f 75 74 20 74 65 73 74 2e     ./a.out test.
0330: 64 62 20 20 74 65 73 74 2e 73 71 6c 0d 0a 2a 2f  db  test.sql..*/
0340: 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69  ..#include <stdi
0350: 6f 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 3c  o.h>..#include <
0360: 73 74 72 69 6e 67 2e 68 3e 0d 0a 23 69 6e 63 6c  string.h>..#incl
0370: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0d 0a  ude <stdlib.h>..
0380: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
0390: 68 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  h>..#include <un
03a0: 69 73 74 64 2e 68 3e 0d 0a 23 69 6e 63 6c 75 64  istd.h>..#includ
03b0: 65 20 3c 73 79 73 2f 74 69 6d 65 73 2e 68 3e 0d  e <sys/times.h>.
03c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e  .#include <time.
03d0: 68 3e 0d 0a 23 69 6e 63 6c 75 64 65 20 3c 73 63  h>..#include <sc
03e0: 68 65 64 2e 68 3e 0d 0a 0d 0a 23 69 6e 63 6c 75  hed.h>....#inclu
03f0: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0d 0a  de "sqlite3.h"..
0400: 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c  ../*..** The fol
0410: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 6f  lowing routine o
0420: 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 70 65 6e  nly works on pen
0430: 74 69 75 6d 2d 63 6c 61 73 73 20 70 72 6f 63 65  tium-class proce
0440: 73 73 6f 72 73 2e 0d 0a 2a 2a 20 49 74 20 75 73  ssors...** It us
0450: 65 73 20 74 68 65 20 52 44 54 53 43 20 6f 70 63  es the RDTSC opc
0460: 6f 64 65 20 74 6f 20 72 65 61 64 20 74 68 65 20  ode to read the 
0470: 63 79 63 6c 65 20 63 6f 75 6e 74 20 76 61 6c 75  cycle count valu
0480: 65 20 6f 75 74 20 6f 66 20 74 68 65 0d 0a 2a 2a  e out of the..**
0490: 20 70 72 6f 63 65 73 73 6f 72 20 61 6e 64 20 72   processor and r
04a0: 65 74 75 72 6e 73 20 74 68 61 74 20 76 61 6c 75  eturns that valu
04b0: 65 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  e.  This can be 
04c0: 75 73 65 64 20 66 6f 72 20 68 69 67 68 2d 72 65  used for high-re
04d0: 73 0d 0a 2a 2a 20 70 72 6f 66 69 6c 69 6e 67 2e  s..** profiling.
04e0: 0d 0a 2a 2f 0d 0a 5f 5f 69 6e 6c 69 6e 65 5f 5f  ..*/..__inline__
04f0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
0500: 6f 6e 67 20 69 6e 74 20 68 77 74 69 6d 65 28 76  ong int hwtime(v
0510: 6f 69 64 29 7b 0d 0a 20 20 20 75 6e 73 69 67 6e  oid){..   unsign
0520: 65 64 20 69 6e 74 20 6c 6f 2c 20 68 69 3b 0d 0a  ed int lo, hi;..
0530: 20 20 20 2f 2a 20 57 65 20 63 61 6e 6e 6f 74 20     /* We cannot 
0540: 75 73 65 20 22 3d 41 22 2c 20 73 69 6e 63 65 20  use "=A", since 
0550: 74 68 69 73 20 77 6f 75 6c 64 20 75 73 65 20 25  this would use %
0560: 72 61 78 20 6f 6e 20 78 38 36 5f 36 34 20 2a 2f  rax on x86_64 */
0570: 0d 0a 20 20 20 5f 5f 61 73 6d 5f 5f 20 5f 5f 76  ..   __asm__ __v
0580: 6f 6c 61 74 69 6c 65 5f 5f 20 28 22 72 64 74 73  olatile__ ("rdts
0590: 63 22 20 3a 20 22 3d 61 22 20 28 6c 6f 29 2c 20  c" : "=a" (lo), 
05a0: 22 3d 64 22 20 28 68 69 29 29 3b 0d 0a 20 20 20  "=d" (hi));..   
05b0: 72 65 74 75 72 6e 20 28 75 6e 73 69 67 6e 65 64  return (unsigned
05c0: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 29 68   long long int)h
05d0: 69 20 3c 3c 20 33 32 20 7c 20 6c 6f 3b 0d 0a 7d  i << 32 | lo;..}
05e0: 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 69 6d 65 72  ..../*..** Timer
05f0: 73 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63 20 75 6e  s..*/..static un
0600: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
0610: 20 69 6e 74 20 70 72 65 70 54 69 6d 65 20 3d 20   int prepTime = 
0620: 30 3b 0d 0a 73 74 61 74 69 63 20 75 6e 73 69 67  0;..static unsig
0630: 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e  ned long long in
0640: 74 20 72 75 6e 54 69 6d 65 20 3d 20 30 3b 0d 0a  t runTime = 0;..
0650: 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20  static unsigned 
0660: 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 66 69  long long int fi
0670: 6e 61 6c 69 7a 65 54 69 6d 65 20 3d 20 30 3b 0d  nalizeTime = 0;.
0680: 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 50 72 65 70 61 72  .../*..** Prepar
0690: 65 20 61 6e 64 20 72 75 6e 20 61 20 73 69 6e 67  e and run a sing
06a0: 6c 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20  le statement of 
06b0: 53 51 4c 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69 63  SQL...*/..static
06c0: 20 76 6f 69 64 20 70 72 65 70 61 72 65 41 6e 64   void prepareAnd
06d0: 52 75 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Run(sqlite3 *db,
06e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
06f0: 6c 2c 20 69 6e 74 20 62 51 75 69 65 74 29 7b 0d  l, int bQuiet){.
0700: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
0710: 2a 70 53 74 6d 74 3b 0d 0a 20 20 63 6f 6e 73 74  *pStmt;..  const
0720: 20 63 68 61 72 20 2a 73 74 6d 74 54 61 69 6c 3b   char *stmtTail;
0730: 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ..  unsigned lon
0740: 67 20 6c 6f 6e 67 20 69 6e 74 20 69 53 74 61 72  g long int iStar
0750: 74 2c 20 69 45 6c 61 70 73 65 3b 0d 0a 20 20 69  t, iElapse;..  i
0760: 6e 74 20 72 63 3b 0d 0a 20 20 0d 0a 20 20 69 66  nt rc;..  ..  if
0770: 20 28 21 62 51 75 69 65 74 29 20 70 72 69 6e 74   (!bQuiet) print
0780: 66 28 22 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  f("*************
0790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07c0: 2a 2a 2a 5c 6e 22 29 3b 0d 0a 20 20 69 66 20 28  ***\n");..  if (
07d0: 21 62 51 75 69 65 74 29 20 70 72 69 6e 74 66 28  !bQuiet) printf(
07e0: 22 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 3a 20  "SQL statement: 
07f0: 5b 25 73 5d 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0d  [%s]\n", zSql);.
0800: 0a 20 20 69 53 74 61 72 74 20 3d 20 68 77 74 69  .  iStart = hwti
0810: 6d 65 28 29 3b 0d 0a 20 20 72 63 20 3d 20 73 71  me();..  rc = sq
0820: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
0830: 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
0840: 70 53 74 6d 74 2c 20 26 73 74 6d 74 54 61 69 6c  pStmt, &stmtTail
0850: 29 3b 0d 0a 20 20 69 45 6c 61 70 73 65 20 3d 20  );..  iElapse = 
0860: 68 77 74 69 6d 65 28 29 20 2d 20 69 53 74 61 72  hwtime() - iStar
0870: 74 3b 0d 0a 20 20 70 72 65 70 54 69 6d 65 20 2b  t;..  prepTime +
0880: 3d 20 69 45 6c 61 70 73 65 3b 0d 0a 20 20 69 66  = iElapse;..  if
0890: 20 28 21 62 51 75 69 65 74 29 20 70 72 69 6e 74   (!bQuiet) print
08a0: 66 28 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  f("sqlite3_prepa
08b0: 72 65 5f 76 32 28 29 20 72 65 74 75 72 6e 73 20  re_v2() returns 
08c0: 25 64 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c 65  %d in %llu cycle
08d0: 73 5c 6e 22 2c 20 72 63 2c 20 69 45 6c 61 70 73  s\n", rc, iElaps
08e0: 65 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d 3d 53  e);..  if( rc==S
08f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d 0a 20 20 20  QLITE_OK ){..   
0900: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0d 0a   int nRow = 0;..
0910: 20 20 20 20 69 53 74 61 72 74 20 3d 20 68 77 74      iStart = hwt
0920: 69 6d 65 28 29 3b 0d 0a 20 20 20 20 77 68 69 6c  ime();..    whil
0930: 65 28 20 28 72 63 3d 73 71 6c 69 74 65 33 5f 73  e( (rc=sqlite3_s
0940: 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c  tep(pStmt))==SQL
0950: 49 54 45 5f 52 4f 57 20 29 7b 20 6e 52 6f 77 2b  ITE_ROW ){ nRow+
0960: 2b 3b 20 7d 0d 0a 20 20 20 20 69 45 6c 61 70 73  +; }..    iElaps
0970: 65 20 3d 20 68 77 74 69 6d 65 28 29 20 2d 20 69  e = hwtime() - i
0980: 53 74 61 72 74 3b 0d 0a 20 20 20 20 72 75 6e 54  Start;..    runT
0990: 69 6d 65 20 2b 3d 20 69 45 6c 61 70 73 65 3b 0d  ime += iElapse;.
09a0: 0a 20 20 20 20 69 66 20 28 21 62 51 75 69 65 74  .    if (!bQuiet
09b0: 29 20 70 72 69 6e 74 66 28 22 73 71 6c 69 74 65  ) printf("sqlite
09c0: 33 5f 73 74 65 70 28 29 20 72 65 74 75 72 6e 73  3_step() returns
09d0: 20 25 64 20 61 66 74 65 72 20 25 64 20 72 6f 77   %d after %d row
09e0: 73 20 69 6e 20 25 6c 6c 75 20 63 79 63 6c 65 73  s in %llu cycles
09f0: 5c 6e 22 2c 0d 0a 20 20 20 20 20 20 20 20 20 20  \n",..          
0a00: 20 72 63 2c 20 6e 52 6f 77 2c 20 69 45 6c 61 70   rc, nRow, iElap
0a10: 73 65 29 3b 0d 0a 20 20 20 20 69 53 74 61 72 74  se);..    iStart
0a20: 20 3d 20 68 77 74 69 6d 65 28 29 3b 0d 0a 20 20   = hwtime();..  
0a30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
0a40: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0d  inalize(pStmt);.
0a50: 0a 20 20 20 20 69 45 6c 61 70 73 65 20 3d 20 68  .    iElapse = h
0a60: 77 74 69 6d 65 28 29 20 2d 20 69 53 74 61 72 74  wtime() - iStart
0a70: 3b 0d 0a 20 20 20 20 66 69 6e 61 6c 69 7a 65 54  ;..    finalizeT
0a80: 69 6d 65 20 2b 3d 20 69 45 6c 61 70 73 65 3b 0d  ime += iElapse;.
0a90: 0a 20 20 20 20 69 66 20 28 21 62 51 75 69 65 74  .    if (!bQuiet
0aa0: 29 20 70 72 69 6e 74 66 28 22 73 71 6c 69 74 65  ) printf("sqlite
0ab0: 33 5f 66 69 6e 61 6c 69 7a 65 28 29 20 72 65 74  3_finalize() ret
0ac0: 75 72 6e 73 20 25 64 20 69 6e 20 25 6c 6c 75 20  urns %d in %llu 
0ad0: 63 79 63 6c 65 73 5c 6e 22 2c 20 72 63 2c 20 69  cycles\n", rc, i
0ae0: 45 6c 61 70 73 65 29 3b 0d 0a 20 20 7d 0d 0a 7d  Elapse);..  }..}
0af0: 0d 0a 0d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..../***********
0b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b40: 0d 0a 2a 2a 20 54 68 65 20 22 6f 76 65 72 77 72  ..** The "overwr
0b50: 69 74 65 22 20 56 46 53 20 69 73 20 61 6e 20 6f  ite" VFS is an o
0b60: 76 65 72 6c 61 79 20 6f 76 65 72 20 74 68 65 20  verlay over the 
0b70: 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 49 74  default VFS.  It
0b80: 20 6d 6f 64 69 66 69 65 73 0d 0a 2a 2a 20 74 68   modifies..** th
0b90: 65 20 78 54 72 75 6e 63 61 74 65 20 6f 70 65 72  e xTruncate oper
0ba0: 61 74 69 6f 6e 20 6f 6e 20 6a 6f 75 72 6e 61 6c  ation on journal
0bb0: 20 66 69 6c 65 73 20 73 6f 20 74 68 61 74 20 78   files so that x
0bc0: 54 72 75 6e 63 61 74 65 20 6d 65 72 65 6c 79 0d  Truncate merely.
0bd0: 0a 2a 2a 20 77 72 69 74 65 73 20 7a 65 72 6f 73  .** writes zeros
0be0: 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20   into the first 
0bf0: 35 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  50 bytes of the 
0c00: 66 69 6c 65 20 72 61 74 68 65 72 20 74 68 61 6e  file rather than
0c10: 20 74 72 75 65 6c 79 0d 0a 2a 2a 20 74 72 75 6e   truely..** trun
0c20: 63 61 74 69 6e 67 20 74 68 65 20 66 69 6c 65 2e  cating the file.
0c30: 0d 0a 2a 2a 0d 0a 2a 2a 20 54 68 65 20 66 6f 6c  ..**..** The fol
0c40: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
0c50: 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
0c60: 20 74 6f 20 62 65 20 74 68 65 20 76 69 72 74 75   to be the virtu
0c70: 61 6c 20 66 75 6e 63 74 69 6f 6e 0d 0a 2a 2a 20  al function..** 
0c80: 74 61 62 6c 65 73 20 66 6f 72 20 74 68 65 20 6f  tables for the o
0c90: 76 65 72 77 72 69 74 65 20 56 46 53 2e 0d 0a 2a  verwrite VFS...*
0ca0: 2f 0d 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  /..static sqlite
0cb0: 33 5f 76 66 73 20 6f 76 65 72 77 72 69 74 65 5f  3_vfs overwrite_
0cc0: 76 66 73 3b 0d 0a 73 74 61 74 69 63 20 73 71 6c  vfs;..static sql
0cd0: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
0ce0: 6f 76 65 72 77 72 69 74 65 5f 6d 65 74 68 6f 64  overwrite_method
0cf0: 73 3b 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65  s;..../*..** The
0d00: 20 74 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64   truncate method
0d10: 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   for journal fil
0d20: 65 73 20 69 6e 20 74 68 65 20 6f 76 65 72 77 72  es in the overwr
0d30: 69 74 65 20 56 46 53 2e 0d 0a 2a 2f 0d 0a 73 74  ite VFS...*/..st
0d40: 61 74 69 63 20 69 6e 74 20 6f 76 65 72 77 72 69  atic int overwri
0d50: 74 65 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  teTruncate(sqlit
0d60: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
0d70: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a  sqlite_int64 siz
0d80: 65 29 7b 0d 0a 20 20 69 6e 74 20 72 63 3b 0d 0a  e){..  int rc;..
0d90: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
0da0: 68 61 72 20 62 75 66 5b 35 30 5d 3b 0d 0a 20 20  har buf[50];..  
0db0: 69 66 28 20 73 69 7a 65 20 29 7b 0d 0a 20 20 20  if( size ){..   
0dc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
0dd0: 4f 45 52 52 3b 0d 0a 20 20 7d 0d 0a 20 20 72 63  OERR;..  }..  rc
0de0: 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
0df0: 64 73 2d 3e 78 57 72 69 74 65 28 70 46 69 6c 65  ds->xWrite(pFile
0e00: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
0e10: 66 29 2c 20 30 29 3b 0d 0a 20 20 69 66 28 20 72  f), 0);..  if( r
0e20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0d  c==SQLITE_OK ){.
0e30: 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
0e40: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 79 6e 63  >pMethods->xSync
0e50: 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 53  (pFile, SQLITE_S
0e60: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0d 0a 20 20  YNC_NORMAL);..  
0e70: 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0d  }..  return rc;.
0e80: 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20 54 68 65  .}..../*..** The
0e90: 20 64 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 66   delete method f
0ea0: 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
0eb0: 20 69 6e 20 74 68 65 20 6f 76 65 72 77 72 69 74   in the overwrit
0ec0: 65 20 56 46 53 2e 0d 0a 2a 2f 0d 0a 73 74 61 74  e VFS...*/..stat
0ed0: 69 63 20 69 6e 74 20 6f 76 65 72 77 72 69 74 65  ic int overwrite
0ee0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 66  Delete(sqlite3_f
0ef0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0d 0a 20 20  ile *pFile){..  
0f00: 72 65 74 75 72 6e 20 6f 76 65 72 77 72 69 74 65  return overwrite
0f10: 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2c 20  Truncate(pFile, 
0f20: 30 29 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a  0);..}..../*..**
0f30: 20 54 68 65 20 6f 70 65 6e 20 6d 65 74 68 6f 64   The open method
0f40: 20 66 6f 72 20 6f 76 65 72 77 72 69 74 65 20 56   for overwrite V
0f50: 46 53 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  FS.  If the file
0f60: 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73   being opened is
0f70: 0d 0a 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ..** a journal f
0f80: 69 6c 65 20 74 68 65 6e 20 73 75 62 73 74 69 74  ile then substit
0f90: 75 74 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  ute the alternat
0fa0: 69 76 65 20 78 54 72 75 6e 63 61 74 65 20 6d 65  ive xTruncate me
0fb0: 74 68 6f 64 2e 0d 0a 2a 2f 0d 0a 73 74 61 74 69  thod...*/..stati
0fc0: 63 20 69 6e 74 20 6f 76 65 72 77 72 69 74 65 4f  c int overwriteO
0fd0: 70 65 6e 28 0d 0a 20 20 73 71 6c 69 74 65 33 5f  pen(..  sqlite3_
0fe0: 76 66 73 20 2a 70 56 66 73 2c 0d 0a 20 20 63 6f  vfs *pVfs,..  co
0ff0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1000: 0d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ..  sqlite3_file
1010: 20 2a 70 46 69 6c 65 2c 0d 0a 20 20 69 6e 74 20   *pFile,..  int 
1020: 66 6c 61 67 73 2c 0d 0a 20 20 69 6e 74 20 2a 70  flags,..  int *p
1030: 4f 75 74 46 6c 61 67 73 0d 0a 29 7b 0d 0a 20 20  OutFlags..){..  
1040: 69 6e 74 20 72 63 3b 0d 0a 20 20 73 71 6c 69 74  int rc;..  sqlit
1050: 65 33 5f 76 66 73 20 2a 70 52 65 61 6c 56 66 73  e3_vfs *pRealVfs
1060: 3b 0d 0a 20 20 69 6e 74 20 69 73 4a 6f 75 72 6e  ;..  int isJourn
1070: 61 6c 3b 0d 0a 0d 0a 20 20 69 73 4a 6f 75 72 6e  al;....  isJourn
1080: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 28 53  al = (flags & (S
1090: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
10a0: 4a 4f 55 52 4e 41 4c 7c 53 51 4c 49 54 45 5f 4f  JOURNAL|SQLITE_O
10b0: 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
10c0: 29 29 21 3d 30 3b 0d 0a 20 20 70 52 65 61 6c 56  ))!=0;..  pRealV
10d0: 66 73 20 3d 20 28 73 71 6c 69 74 65 33 5f 76 66  fs = (sqlite3_vf
10e0: 73 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  s*)pVfs->pAppDat
10f0: 61 3b 0d 0a 20 20 72 63 20 3d 20 70 52 65 61 6c  a;..  rc = pReal
1100: 56 66 73 2d 3e 78 4f 70 65 6e 28 70 52 65 61 6c  Vfs->xOpen(pReal
1110: 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 70 46 69 6c  Vfs, zName, pFil
1120: 65 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c  e, flags, pOutFl
1130: 61 67 73 29 3b 0d 0a 20 20 69 66 28 20 72 63 3d  ags);..  if( rc=
1140: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 73  =SQLITE_OK && is
1150: 4a 6f 75 72 6e 61 6c 20 29 7b 0d 0a 20 20 20 20  Journal ){..    
1160: 69 66 28 20 6f 76 65 72 77 72 69 74 65 5f 6d 65  if( overwrite_me
1170: 74 68 6f 64 73 2e 78 54 72 75 6e 63 61 74 65 3d  thods.xTruncate=
1180: 3d 30 20 29 7b 0d 0a 20 20 20 20 20 20 73 71 6c  =0 ){..      sql
1190: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
11a0: 74 65 6d 70 3b 0d 0a 20 20 20 20 20 20 6d 65 6d  temp;..      mem
11b0: 63 70 79 28 26 74 65 6d 70 2c 20 70 46 69 6c 65  cpy(&temp, pFile
11c0: 2d 3e 70 4d 65 74 68 6f 64 73 2c 20 73 69 7a 65  ->pMethods, size
11d0: 6f 66 28 74 65 6d 70 29 29 3b 0d 0a 20 20 20 20  of(temp));..    
11e0: 20 20 74 65 6d 70 2e 78 54 72 75 6e 63 61 74 65    temp.xTruncate
11f0: 20 3d 20 6f 76 65 72 77 72 69 74 65 54 72 75 6e   = overwriteTrun
1200: 63 61 74 65 3b 0d 0a 20 20 20 20 20 20 6d 65 6d  cate;..      mem
1210: 63 70 79 28 26 6f 76 65 72 77 72 69 74 65 5f 6d  cpy(&overwrite_m
1220: 65 74 68 6f 64 73 2c 20 26 74 65 6d 70 2c 20 73  ethods, &temp, s
1230: 69 7a 65 6f 66 28 74 65 6d 70 29 29 3b 0d 0a 20  izeof(temp));.. 
1240: 20 20 20 7d 0d 0a 20 20 20 20 70 46 69 6c 65 2d     }..    pFile-
1250: 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26 6f 76 65  >pMethods = &ove
1260: 72 77 72 69 74 65 5f 6d 65 74 68 6f 64 73 3b 0d  rwrite_methods;.
1270: 0a 20 20 7d 0d 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
1280: 63 3b 0d 0a 7d 0d 0a 0d 0a 2f 2a 0d 0a 2a 2a 20  c;..}..../*..** 
1290: 4f 76 65 72 6c 61 79 20 74 68 65 20 6f 76 65 72  Overlay the over
12a0: 77 72 69 74 65 20 56 46 53 20 6f 76 65 72 20 74  write VFS over t
12b0: 6f 70 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  op of the curren
12c0: 74 20 64 65 66 61 75 6c 74 20 56 46 53 0d 0a 2a  t default VFS..*
12d0: 2a 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 6f  * and make the o
12e0: 76 65 72 6c 61 79 20 56 46 53 20 74 68 65 20 6e  verlay VFS the n
12f0: 65 77 20 64 65 66 61 75 6c 74 2e 0d 0a 2a 2a 0d  ew default...**.
1300: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1310: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 65 76 61   can only be eva
1320: 6c 75 61 74 65 64 20 6f 6e 63 65 2e 20 20 4f 6e  luated once.  On
1330: 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
1340: 65 71 75 65 6e 74 0d 0a 2a 2a 20 65 78 65 63 75  equent..** execu
1350: 74 69 6f 6e 73 20 69 74 20 62 65 63 6f 6d 65 73  tions it becomes
1360: 20 61 20 6e 6f 2d 6f 70 2e 0d 0a 2a 2f 0d 0a 73   a no-op...*/..s
1370: 74 61 74 69 63 20 76 6f 69 64 20 72 65 67 69 73  tatic void regis
1380: 74 65 72 4f 76 65 72 77 72 69 74 65 56 66 73 28  terOverwriteVfs(
1390: 76 6f 69 64 29 7b 0d 0a 20 20 73 71 6c 69 74 65  void){..  sqlite
13a0: 33 5f 76 66 73 20 2a 70 42 61 73 65 3b 0d 0a 20  3_vfs *pBase;.. 
13b0: 20 69 66 28 20 6f 76 65 72 77 72 69 74 65 5f 76   if( overwrite_v
13c0: 66 73 2e 69 56 65 72 73 69 6f 6e 20 29 20 72 65  fs.iVersion ) re
13d0: 74 75 72 6e 3b 0d 0a 20 20 70 42 61 73 65 20 3d  turn;..  pBase =
13e0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
13f0: 64 28 30 29 3b 0d 0a 20 20 6d 65 6d 63 70 79 28  d(0);..  memcpy(
1400: 26 6f 76 65 72 77 72 69 74 65 5f 76 66 73 2c 20  &overwrite_vfs, 
1410: 70 42 61 73 65 2c 20 73 69 7a 65 6f 66 28 6f 76  pBase, sizeof(ov
1420: 65 72 77 72 69 74 65 5f 76 66 73 29 29 3b 0d 0a  erwrite_vfs));..
1430: 20 20 6f 76 65 72 77 72 69 74 65 5f 76 66 73 2e    overwrite_vfs.
1440: 70 41 70 70 44 61 74 61 20 3d 20 70 42 61 73 65  pAppData = pBase
1450: 3b 0d 0a 20 20 6f 76 65 72 77 72 69 74 65 5f 76  ;..  overwrite_v
1460: 66 73 2e 78 4f 70 65 6e 20 3d 20 6f 76 65 72 77  fs.xOpen = overw
1470: 72 69 74 65 4f 70 65 6e 3b 0d 0a 20 20 6f 76 65  riteOpen;..  ove
1480: 72 77 72 69 74 65 5f 76 66 73 2e 7a 4e 61 6d 65  rwrite_vfs.zName
1490: 20 3d 20 22 6f 76 65 72 77 72 69 74 65 56 66 73   = "overwriteVfs
14a0: 22 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ";..  sqlite3_vf
14b0: 73 5f 72 65 67 69 73 74 65 72 28 26 6f 76 65 72  s_register(&over
14c0: 77 72 69 74 65 5f 76 66 73 2c 20 31 29 3b 0d 0a  write_vfs, 1);..
14d0: 7d 0d 0a 0d 0a 69 6e 74 20 6d 61 69 6e 28 69 6e  }....int main(in
14e0: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
14f0: 72 67 76 29 7b 0d 0a 20 20 73 71 6c 69 74 65 33  rgv){..  sqlite3
1500: 20 2a 64 62 3b 0d 0a 20 20 69 6e 74 20 72 63 3b   *db;..  int rc;
1510: 0d 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 0d 0a 20  ..  int nSql;.. 
1520: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0d 0a 20 20   char *zSql;..  
1530: 69 6e 74 20 69 2c 20 6a 3b 0d 0a 20 20 46 49 4c  int i, j;..  FIL
1540: 45 20 2a 69 6e 3b 0d 0a 20 20 75 6e 73 69 67 6e  E *in;..  unsign
1550: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74  ed long long int
1560: 20 69 53 74 61 72 74 2c 20 69 45 6c 61 70 73 65   iStart, iElapse
1570: 3b 0d 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  ;..  unsigned lo
1580: 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 69 53 65 74  ng long int iSet
1590: 75 70 20 3d 20 30 3b 0d 0a 20 20 69 6e 74 20 6e  up = 0;..  int n
15a0: 53 74 6d 74 20 3d 20 30 3b 0d 0a 20 20 69 6e 74  Stmt = 0;..  int
15b0: 20 6e 42 79 74 65 20 3d 20 30 3b 0d 0a 20 20 63   nByte = 0;..  c
15c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 76  onst char *zArgv
15d0: 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0d 0a 20 20  0 = argv[0];..  
15e0: 69 6e 74 20 62 51 75 69 65 74 20 3d 20 30 3b 0d  int bQuiet = 0;.
15f0: 0a 20 20 73 74 72 75 63 74 20 74 6d 73 20 74 6d  .  struct tms tm
1600: 73 53 74 61 72 74 2c 20 74 6d 73 45 6e 64 3b 0d  sStart, tmsEnd;.
1610: 0a 20 20 63 6c 6f 63 6b 5f 74 20 63 6c 6b 53 74  .  clock_t clkSt
1620: 61 72 74 2c 20 63 6c 6b 45 6e 64 3b 0d 0a 0d 0a  art, clkEnd;....
1630: 23 69 66 64 65 66 20 48 41 56 45 5f 4f 53 49 4e  #ifdef HAVE_OSIN
1640: 53 54 0d 0a 20 20 65 78 74 65 72 6e 20 73 71 6c  ST..  extern sql
1650: 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
1660: 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e 61 72 79  3_instvfs_binary
1670: 6c 6f 67 28 63 68 61 72 20 2a 2c 20 63 68 61 72  log(char *, char
1680: 20 2a 2c 20 63 68 61 72 20 2a 29 3b 0d 0a 20 20   *, char *);..  
1690: 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
16a0: 74 65 33 5f 69 6e 73 74 76 66 73 5f 64 65 73 74  te3_instvfs_dest
16b0: 72 6f 79 28 73 71 6c 69 74 65 33 5f 76 66 73 20  roy(sqlite3_vfs 
16c0: 2a 29 3b 0d 0a 20 20 73 71 6c 69 74 65 33 5f 76  *);..  sqlite3_v
16d0: 66 73 20 2a 70 56 66 73 20 3d 20 30 3b 0d 0a 23  fs *pVfs = 0;..#
16e0: 65 6e 64 69 66 0d 0a 0d 0a 20 20 77 68 69 6c 65  endif....  while
16f0: 20 28 61 72 67 63 3e 33 29 0d 0a 20 20 7b 0d 0a   (argc>3)..  {..
1700: 20 20 20 20 69 66 28 20 61 72 67 63 3e 33 20 26      if( argc>3 &
1710: 26 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  & strcmp(argv[1]
1720: 2c 20 22 2d 6f 76 65 72 77 72 69 74 65 22 29 3d  , "-overwrite")=
1730: 3d 30 20 29 7b 0d 0a 20 20 20 20 20 72 65 67 69  =0 ){..     regi
1740: 73 74 65 72 4f 76 65 72 77 72 69 74 65 56 66 73  sterOverwriteVfs
1750: 28 29 3b 0d 0a 20 20 20 20 20 61 72 67 76 2b 2b  ();..     argv++
1760: 3b 0d 0a 20 20 20 20 20 61 72 67 63 2d 2d 3b 0d  ;..     argc--;.
1770: 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0d  .     continue;.
1780: 0a 20 20 20 20 7d 0d 0a 0d 0a 23 69 66 64 65 66  .    }....#ifdef
1790: 20 48 41 56 45 5f 4f 53 49 4e 53 54 0d 0a 20 20   HAVE_OSINST..  
17a0: 20 20 69 66 28 20 61 72 67 63 3e 34 20 26 26 20    if( argc>4 && 
17b0: 28 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c  (strcmp(argv[1],
17c0: 20 22 2d 6c 6f 67 22 29 3d 3d 30 29 20 29 7b 0d   "-log")==0) ){.
17d0: 0a 20 20 20 20 20 70 56 66 73 20 3d 20 73 71 6c  .     pVfs = sql
17e0: 69 74 65 33 5f 69 6e 73 74 76 66 73 5f 62 69 6e  ite3_instvfs_bin
17f0: 61 72 79 6c 6f 67 28 22 6f 73 6c 6f 67 22 2c 20  arylog("oslog", 
1800: 30 2c 20 61 72 67 76 5b 32 5d 29 3b 0d 0a 20 20  0, argv[2]);..  
1810: 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
1820: 65 67 69 73 74 65 72 28 70 56 66 73 2c 20 31 29  egister(pVfs, 1)
1830: 3b 0d 0a 20 20 20 20 20 61 72 67 76 20 2b 3d 20  ;..     argv += 
1840: 32 3b 0d 0a 20 20 20 20 20 61 72 67 63 20 2d 3d  2;..     argc -=
1850: 20 32 3b 0d 0a 20 20 20 20 20 63 6f 6e 74 69 6e   2;..     contin
1860: 75 65 3b 0d 0a 20 20 20 20 7d 0d 0a 23 65 6e 64  ue;..    }..#end
1870: 69 66 0d 0a 0d 0a 20 20 20 20 2f 2a 0d 0a 20 20  if....    /*..  
1880: 20 20 2a 2a 20 49 6e 63 72 65 61 73 69 6e 67 20    ** Increasing 
1890: 74 68 65 20 70 72 69 6f 72 69 74 79 20 73 6c 69  the priority sli
18a0: 67 68 74 6c 79 20 61 62 6f 76 65 20 6e 6f 72 6d  ghtly above norm
18b0: 61 6c 20 63 61 6e 20 68 65 6c 70 20 77 69 74 68  al can help with
18c0: 20 72 65 70 65 61 74 61 62 69 6c 69 74 79 0d 0a   repeatability..
18d0: 20 20 20 20 2a 2a 20 6f 66 20 74 65 73 74 69 6e      ** of testin
18e0: 67 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 77 69  g.  Note that wi
18f0: 74 68 20 43 79 67 77 69 6e 2c 20 2d 35 20 65 71  th Cygwin, -5 eq
1900: 75 61 74 65 73 20 74 6f 20 22 48 69 67 68 22 2c  uates to "High",
1910: 20 2b 35 20 65 71 75 61 74 65 73 20 74 6f 20 22   +5 equates to "
1920: 4c 6f 77 22 2c 0d 0a 20 20 20 20 2a 2a 20 61 6e  Low",..    ** an
1930: 64 20 61 6e 79 74 68 69 6e 67 20 69 6e 20 62 65  d anything in be
1940: 74 77 65 65 6e 20 65 71 75 61 74 65 73 20 74 6f  tween equates to
1950: 20 22 4e 6f 72 6d 61 6c 22 2e 0d 0a 20 20 20 20   "Normal"...    
1960: 2a 2f 0d 0a 20 20 20 20 69 66 28 20 61 72 67 63  */..    if( argc
1970: 3e 34 20 26 26 20 28 73 74 72 63 6d 70 28 61 72  >4 && (strcmp(ar
1980: 67 76 5b 31 5d 2c 20 22 2d 70 72 69 6f 72 69 74  gv[1], "-priorit
1990: 79 22 29 3d 3d 30 29 20 29 7b 0d 0a 20 20 20 20  y")==0) ){..    
19a0: 20 20 73 74 72 75 63 74 20 73 63 68 65 64 5f 70    struct sched_p
19b0: 61 72 61 6d 20 6d 79 50 61 72 61 6d 3b 0d 0a 20  aram myParam;.. 
19c0: 20 20 20 20 20 73 63 68 65 64 5f 67 65 74 70 61       sched_getpa
19d0: 72 61 6d 28 30 2c 20 26 6d 79 50 61 72 61 6d 29  ram(0, &myParam)
19e0: 3b 0d 0a 20 20 20 20 20 20 70 72 69 6e 74 66 20  ;..      printf 
19f0: 28 22 43 75 72 72 65 6e 74 20 70 72 6f 63 65 73  ("Current proces
1a00: 73 20 70 72 69 6f 72 69 74 79 20 69 73 20 25 64  s priority is %d
1a10: 2e 5c 6e 22 2c 20 28 69 6e 74 29 6d 79 50 61 72  .\n", (int)myPar
1a20: 61 6d 2e 73 63 68 65 64 5f 70 72 69 6f 72 69 74  am.sched_priorit
1a30: 79 29 3b 20 0d 0a 20 20 20 20 20 20 6d 79 50 61  y); ..      myPa
1a40: 72 61 6d 2e 73 63 68 65 64 5f 70 72 69 6f 72 69  ram.sched_priori
1a50: 74 79 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 32  ty = atoi(argv[2
1a60: 5d 29 3b 0d 0a 20 20 20 20 20 20 70 72 69 6e 74  ]);..      print
1a70: 66 20 28 22 53 65 74 74 69 6e 67 20 70 72 6f 63  f ("Setting proc
1a80: 65 73 73 20 70 72 69 6f 72 69 74 79 20 74 6f 20  ess priority to 
1a90: 25 64 2e 5c 6e 22 2c 20 28 69 6e 74 29 6d 79 50  %d.\n", (int)myP
1aa0: 61 72 61 6d 2e 73 63 68 65 64 5f 70 72 69 6f 72  aram.sched_prior
1ab0: 69 74 79 29 3b 20 0d 0a 20 20 20 20 20 20 69 66  ity); ..      if
1ac0: 20 28 73 63 68 65 64 5f 73 65 74 70 61 72 61 6d   (sched_setparam
1ad0: 20 28 30 2c 20 26 6d 79 50 61 72 61 6d 29 20 21   (0, &myParam) !
1ae0: 3d 20 30 29 7b 0d 0a 20 20 20 20 20 20 20 20 70  = 0){..        p
1af0: 72 69 6e 74 66 20 28 22 65 72 72 6f 72 20 73 65  rintf ("error se
1b00: 74 74 69 6e 67 20 70 72 69 6f 72 69 74 79 5c 6e  tting priority\n
1b10: 22 29 3b 20 0d 0a 20 20 20 20 20 20 20 20 65 78  "); ..        ex
1b20: 69 74 28 32 29 3b 20 0d 0a 20 20 20 20 20 20 7d  it(2); ..      }
1b30: 0d 0a 20 20 20 20 20 20 61 72 67 76 20 2b 3d 20  ..      argv += 
1b40: 32 3b 0d 0a 20 20 20 20 20 20 61 72 67 63 20 2d  2;..      argc -
1b50: 3d 20 32 3b 0d 0a 20 20 20 20 20 20 63 6f 6e 74  = 2;..      cont
1b60: 69 6e 75 65 3b 0d 0a 20 20 20 20 7d 0d 0a 0d 0a  inue;..    }....
1b70: 20 20 20 20 69 66 28 20 61 72 67 63 3e 33 20 26      if( argc>3 &
1b80: 26 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  & strcmp(argv[1]
1b90: 2c 20 22 2d 71 75 69 65 74 22 29 3d 3d 30 20 29  , "-quiet")==0 )
1ba0: 7b 0d 0a 20 20 20 20 20 62 51 75 69 65 74 20 3d  {..     bQuiet =
1bb0: 20 2d 31 3b 0d 0a 20 20 20 20 20 61 72 67 76 2b   -1;..     argv+
1bc0: 2b 3b 0d 0a 20 20 20 20 20 61 72 67 63 2d 2d 3b  +;..     argc--;
1bd0: 0d 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  ..     continue;
1be0: 0d 0a 20 20 20 20 7d 0d 0a 0d 0a 20 20 20 20 62  ..    }....    b
1bf0: 72 65 61 6b 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20  reak;..  }....  
1c00: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0d 0a  if( argc!=3 ){..
1c10: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1c20: 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20 5b 6f  r, "Usage: %s [o
1c30: 70 74 69 6f 6e 73 5d 20 46 49 4c 45 4e 41 4d 45  ptions] FILENAME
1c40: 20 53 51 4c 2d 53 43 52 49 50 54 5c 6e 22 0d 0a   SQL-SCRIPT\n"..
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
1c60: 75 6e 73 20 53 51 4c 2d 53 43 52 49 50 54 20 61  uns SQL-SCRIPT a
1c70: 67 61 69 6e 73 74 20 61 20 55 54 46 38 20 64 61  gainst a UTF8 da
1c80: 74 61 62 61 73 65 5c 6e 22 0d 0a 20 20 20 20 20  tabase\n"..     
1c90: 20 20 20 20 20 20 20 20 20 22 5c 74 6f 70 74 69           "\topti
1ca0: 6f 6e 73 3a 5c 6e 22 0d 0a 20 20 20 20 20 20 20  ons:\n"..       
1cb0: 20 20 20 20 20 20 20 22 5c 74 2d 6f 76 65 72 77         "\t-overw
1cc0: 72 69 74 65 5c 6e 22 0d 0a 23 69 66 64 65 66 20  rite\n"..#ifdef 
1cd0: 48 41 56 45 5f 4f 53 49 4e 53 54 0d 0a 20 20 20  HAVE_OSINST..   
1ce0: 20 20 20 20 20 20 20 20 20 20 20 22 5c 74 2d 6c             "\t-l
1cf0: 6f 67 20 3c 6c 6f 67 3e 5c 6e 22 0d 0a 23 65 6e  og <log>\n"..#en
1d00: 64 69 66 0d 0a 20 20 20 20 20 20 20 20 20 20 20  dif..           
1d10: 20 20 20 22 5c 74 2d 70 72 69 6f 72 69 74 79 20     "\t-priority 
1d20: 3c 76 61 6c 75 65 3e 20 3a 20 73 65 74 20 70 72  <value> : set pr
1d30: 69 6f 72 69 74 79 20 6f 66 20 74 61 73 6b 5c 6e  iority of task\n
1d40: 22 0d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  "..             
1d50: 20 22 5c 74 2d 71 75 69 65 74 20 3a 20 6f 6e 6c   "\t-quiet : onl
1d60: 79 20 64 69 73 70 6c 61 79 20 73 75 6d 6d 61 72  y display summar
1d70: 79 20 72 65 73 75 6c 74 73 5c 6e 22 2c 0d 0a 20  y results\n",.. 
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 41 72               zAr
1d90: 67 76 30 29 3b 0d 0a 20 20 20 65 78 69 74 28 31  gv0);..   exit(1
1da0: 29 3b 0d 0a 20 20 7d 0d 0a 0d 0a 20 20 69 6e 20  );..  }....  in 
1db0: 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 32 5d 2c  = fopen(argv[2],
1dc0: 20 22 72 22 29 3b 0d 0a 20 20 66 73 65 65 6b 28   "r");..  fseek(
1dd0: 69 6e 2c 20 30 4c 2c 20 53 45 45 4b 5f 45 4e 44  in, 0L, SEEK_END
1de0: 29 3b 0d 0a 20 20 6e 53 71 6c 20 3d 20 66 74 65  );..  nSql = fte
1df0: 6c 6c 28 69 6e 29 3b 0d 0a 20 20 7a 53 71 6c 20  ll(in);..  zSql 
1e00: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 71 6c 2b 31  = malloc( nSql+1
1e10: 20 29 3b 0d 0a 20 20 66 73 65 65 6b 28 69 6e 2c   );..  fseek(in,
1e20: 20 30 4c 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0d   0L, SEEK_SET);.
1e30: 0a 20 20 6e 53 71 6c 20 3d 20 66 72 65 61 64 28  .  nSql = fread(
1e40: 7a 53 71 6c 2c 20 31 2c 20 6e 53 71 6c 2c 20 69  zSql, 1, nSql, i
1e50: 6e 29 3b 0d 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c  n);..  zSql[nSql
1e60: 5d 20 3d 20 30 3b 0d 0a 0d 0a 20 20 70 72 69 6e  ] = 0;....  prin
1e70: 74 66 28 22 53 51 4c 69 74 65 20 76 65 72 73 69  tf("SQLite versi
1e80: 6f 6e 3a 20 25 64 5c 6e 22 2c 20 73 71 6c 69 74  on: %d\n", sqlit
1e90: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
1ea0: 6d 62 65 72 28 29 29 3b 0d 0a 20 20 75 6e 6c 69  mber());..  unli
1eb0: 6e 6b 28 61 72 67 76 5b 31 5d 29 3b 0d 0a 20 20  nk(argv[1]);..  
1ec0: 63 6c 6b 53 74 61 72 74 20 3d 20 74 69 6d 65 73  clkStart = times
1ed0: 28 26 74 6d 73 53 74 61 72 74 29 3b 0d 0a 20 20  (&tmsStart);..  
1ee0: 69 53 74 61 72 74 20 3d 20 68 77 74 69 6d 65 28  iStart = hwtime(
1ef0: 29 3b 0d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
1f00: 65 33 5f 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c  e3_open(argv[1],
1f10: 20 26 64 62 29 3b 0d 0a 20 20 69 45 6c 61 70 73   &db);..  iElaps
1f20: 65 20 3d 20 68 77 74 69 6d 65 28 29 20 2d 20 69  e = hwtime() - i
1f30: 53 74 61 72 74 3b 0d 0a 20 20 69 53 65 74 75 70  Start;..  iSetup
1f40: 20 3d 20 69 45 6c 61 70 73 65 3b 0d 0a 20 20 69   = iElapse;..  i
1f50: 66 20 28 21 62 51 75 69 65 74 29 20 70 72 69 6e  f (!bQuiet) prin
1f60: 74 66 28 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e  tf("sqlite3_open
1f70: 28 29 20 72 65 74 75 72 6e 73 20 25 64 20 69 6e  () returns %d in
1f80: 20 25 6c 6c 75 20 63 79 63 6c 65 73 5c 6e 22 2c   %llu cycles\n",
1f90: 20 72 63 2c 20 69 45 6c 61 70 73 65 29 3b 0d 0a   rc, iElapse);..
1fa0: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 6a 3c 6e    for(i=j=0; j<n
1fb0: 53 71 6c 3b 20 6a 2b 2b 29 7b 0d 0a 20 20 20 20  Sql; j++){..    
1fc0: 69 66 28 20 7a 53 71 6c 5b 6a 5d 3d 3d 27 3b 27  if( zSql[j]==';'
1fd0: 20 29 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 69   ){..      int i
1fe0: 73 43 6f 6d 70 6c 65 74 65 3b 0d 0a 20 20 20 20  sComplete;..    
1ff0: 20 20 63 68 61 72 20 63 20 3d 20 7a 53 71 6c 5b    char c = zSql[
2000: 6a 2b 31 5d 3b 0d 0a 20 20 20 20 20 20 7a 53 71  j+1];..      zSq
2010: 6c 5b 6a 2b 31 5d 20 3d 20 30 3b 0d 0a 20 20 20  l[j+1] = 0;..   
2020: 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20     isComplete = 
2030: 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
2040: 28 26 7a 53 71 6c 5b 69 5d 29 3b 0d 0a 20 20 20  (&zSql[i]);..   
2050: 20 20 20 7a 53 71 6c 5b 6a 2b 31 5d 20 3d 20 63     zSql[j+1] = c
2060: 3b 0d 0a 20 20 20 20 20 20 69 66 28 20 69 73 43  ;..      if( isC
2070: 6f 6d 70 6c 65 74 65 20 29 7b 0d 0a 20 20 20 20  omplete ){..    
2080: 20 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b      zSql[j] = 0;
2090: 0d 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ..        while(
20a0: 20 69 3c 6a 20 26 26 20 69 73 73 70 61 63 65 28   i<j && isspace(
20b0: 7a 53 71 6c 5b 69 5d 29 20 29 7b 20 69 2b 2b 3b  zSql[i]) ){ i++;
20c0: 20 7d 0d 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
20d0: 69 3c 6a 20 29 7b 0d 0a 20 20 20 20 20 20 20 20  i<j ){..        
20e0: 20 20 69 6e 74 20 6e 20 3d 20 6a 20 2d 20 69 3b    int n = j - i;
20f0: 0d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
2100: 6e 3e 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 26  n>=6 && memcmp(&
2110: 7a 53 71 6c 5b 69 5d 2c 20 22 2e 63 72 61 73 68  zSql[i], ".crash
2120: 22 2c 36 29 3d 3d 30 20 29 20 65 78 69 74 28 31  ",6)==0 ) exit(1
2130: 29 3b 0d 0a 20 20 20 20 20 20 20 20 20 20 6e 53  );..          nS
2140: 74 6d 74 2b 2b 3b 0d 0a 20 20 20 20 20 20 20 20  tmt++;..        
2150: 20 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0d 0a 20    nByte += n;.. 
2160: 20 20 20 20 20 20 20 20 20 70 72 65 70 61 72 65           prepare
2170: 41 6e 64 52 75 6e 28 64 62 2c 20 26 7a 53 71 6c  AndRun(db, &zSql
2180: 5b 69 5d 2c 20 62 51 75 69 65 74 29 3b 0d 0a 20  [i], bQuiet);.. 
2190: 20 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20         }..      
21a0: 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 27 3b 27 3b    zSql[j] = ';';
21b0: 0d 0a 20 20 20 20 20 20 20 20 69 20 3d 20 6a 2b  ..        i = j+
21c0: 31 3b 0d 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20  1;..      }..   
21d0: 20 7d 0d 0a 20 20 7d 0d 0a 20 20 69 53 74 61 72   }..  }..  iStar
21e0: 74 20 3d 20 68 77 74 69 6d 65 28 29 3b 0d 0a 20  t = hwtime();.. 
21f0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
2200: 62 29 3b 0d 0a 20 20 69 45 6c 61 70 73 65 20 3d  b);..  iElapse =
2210: 20 68 77 74 69 6d 65 28 29 20 2d 20 69 53 74 61   hwtime() - iSta
2220: 72 74 3b 0d 0a 20 20 63 6c 6b 45 6e 64 20 3d 20  rt;..  clkEnd = 
2230: 74 69 6d 65 73 28 26 74 6d 73 45 6e 64 29 3b 0d  times(&tmsEnd);.
2240: 0a 20 20 69 53 65 74 75 70 20 2b 3d 20 69 45 6c  .  iSetup += iEl
2250: 61 70 73 65 3b 0d 0a 20 20 69 66 20 28 21 62 51  apse;..  if (!bQ
2260: 75 69 65 74 29 20 70 72 69 6e 74 66 28 22 73 71  uiet) printf("sq
2270: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 72 65  lite3_close() re
2280: 74 75 72 6e 73 20 69 6e 20 25 6c 6c 75 20 63 79  turns in %llu cy
2290: 63 6c 65 73 5c 6e 22 2c 20 69 45 6c 61 70 73 65  cles\n", iElapse
22a0: 29 3b 0d 0a 0d 0a 20 20 70 72 69 6e 74 66 28 22  );....  printf("
22b0: 5c 6e 22 29 3b 0d 0a 20 20 70 72 69 6e 74 66 28  \n");..  printf(
22c0: 22 53 74 61 74 65 6d 65 6e 74 73 20 72 75 6e 3a  "Statements run:
22d0: 20 20 20 20 20 20 20 20 25 31 35 64 20 73 74 6d          %15d stm
22e0: 74 73 5c 6e 22 2c 20 6e 53 74 6d 74 29 3b 0d 0a  ts\n", nStmt);..
22f0: 20 20 70 72 69 6e 74 66 28 22 42 79 74 65 73 20    printf("Bytes 
2300: 6f 66 20 53 51 4c 20 74 65 78 74 3a 20 20 20 20  of SQL text:    
2310: 20 25 31 35 64 20 62 79 74 65 73 5c 6e 22 2c 20   %15d bytes\n", 
2320: 6e 42 79 74 65 29 3b 0d 0a 20 20 70 72 69 6e 74  nByte);..  print
2330: 66 28 22 54 6f 74 61 6c 20 70 72 65 70 61 72 65  f("Total prepare
2340: 20 74 69 6d 65 3a 20 20 20 20 25 31 35 6c 6c 75   time:    %15llu
2350: 20 63 79 63 6c 65 73 5c 6e 22 2c 20 70 72 65 70   cycles\n", prep
2360: 54 69 6d 65 29 3b 0d 0a 20 20 70 72 69 6e 74 66  Time);..  printf
2370: 28 22 54 6f 74 61 6c 20 72 75 6e 20 74 69 6d 65  ("Total run time
2380: 3a 20 20 20 20 20 20 20 20 25 31 35 6c 6c 75 20  :        %15llu 
2390: 63 79 63 6c 65 73 5c 6e 22 2c 20 72 75 6e 54 69  cycles\n", runTi
23a0: 6d 65 29 3b 0d 0a 20 20 70 72 69 6e 74 66 28 22  me);..  printf("
23b0: 54 6f 74 61 6c 20 66 69 6e 61 6c 69 7a 65 20 74  Total finalize t
23c0: 69 6d 65 3a 20 20 20 25 31 35 6c 6c 75 20 63 79  ime:   %15llu cy
23d0: 63 6c 65 73 5c 6e 22 2c 20 66 69 6e 61 6c 69 7a  cles\n", finaliz
23e0: 65 54 69 6d 65 29 3b 0d 0a 20 20 70 72 69 6e 74  eTime);..  print
23f0: 66 28 22 4f 70 65 6e 2f 43 6c 6f 73 65 20 74 69  f("Open/Close ti
2400: 6d 65 3a 20 20 20 20 20 20 20 25 31 35 6c 6c 75  me:       %15llu
2410: 20 63 79 63 6c 65 73 5c 6e 22 2c 20 69 53 65 74   cycles\n", iSet
2420: 75 70 29 3b 0d 0a 20 20 70 72 69 6e 74 66 28 22  up);..  printf("
2430: 54 6f 74 61 6c 20 74 69 6d 65 3a 20 20 20 20 20  Total time:     
2440: 20 20 20 20 20 20 20 25 31 35 6c 6c 75 20 63 79         %15llu cy
2450: 63 6c 65 73 5c 6e 22 2c 0d 0a 20 20 20 20 20 20  cles\n",..      
2460: 70 72 65 70 54 69 6d 65 20 2b 20 72 75 6e 54 69  prepTime + runTi
2470: 6d 65 20 2b 20 66 69 6e 61 6c 69 7a 65 54 69 6d  me + finalizeTim
2480: 65 20 2b 20 69 53 65 74 75 70 29 3b 0d 0a 0d 0a  e + iSetup);....
2490: 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0d    printf("\n");.
24a0: 0a 20 20 70 72 69 6e 74 66 28 22 54 6f 74 61 6c  .  printf("Total
24b0: 20 75 73 65 72 20 43 50 55 20 74 69 6d 65 3a 20   user CPU time: 
24c0: 20 20 25 31 35 2e 33 67 20 73 65 63 73 5c 6e 22    %15.3g secs\n"
24d0: 2c 20 28 74 6d 73 45 6e 64 2e 74 6d 73 5f 75 74  , (tmsEnd.tms_ut
24e0: 69 6d 65 20 2d 20 74 6d 73 53 74 61 72 74 2e 74  ime - tmsStart.t
24f0: 6d 73 5f 75 74 69 6d 65 29 2f 28 64 6f 75 62 6c  ms_utime)/(doubl
2500: 65 29 43 4c 4f 43 4b 53 5f 50 45 52 5f 53 45 43  e)CLOCKS_PER_SEC
2510: 20 29 3b 0d 0a 20 20 70 72 69 6e 74 66 28 22 54   );..  printf("T
2520: 6f 74 61 6c 20 73 79 73 74 65 6d 20 43 50 55 20  otal system CPU 
2530: 74 69 6d 65 3a 20 25 31 35 2e 33 67 20 73 65 63  time: %15.3g sec
2540: 73 5c 6e 22 2c 20 28 74 6d 73 45 6e 64 2e 74 6d  s\n", (tmsEnd.tm
2550: 73 5f 73 74 69 6d 65 20 2d 20 74 6d 73 53 74 61  s_stime - tmsSta
2560: 72 74 2e 74 6d 73 5f 73 74 69 6d 65 29 2f 28 64  rt.tms_stime)/(d
2570: 6f 75 62 6c 65 29 43 4c 4f 43 4b 53 5f 50 45 52  ouble)CLOCKS_PER
2580: 5f 53 45 43 20 29 3b 0d 0a 20 20 70 72 69 6e 74  _SEC );..  print
2590: 66 28 22 54 6f 74 61 6c 20 72 65 61 6c 20 74 69  f("Total real ti
25a0: 6d 65 3a 20 20 20 20 20 20 20 25 31 35 2e 33 67  me:       %15.3g
25b0: 20 73 65 63 73 5c 6e 22 2c 20 28 63 6c 6b 45 6e   secs\n", (clkEn
25c0: 64 20 2d 63 6c 6b 53 74 61 72 74 29 2f 28 64 6f  d -clkStart)/(do
25d0: 75 62 6c 65 29 43 4c 4f 43 4b 53 5f 50 45 52 5f  uble)CLOCKS_PER_
25e0: 53 45 43 20 29 3b 0d 0a 0d 0a 23 69 66 64 65 66  SEC );....#ifdef
25f0: 20 48 41 56 45 5f 4f 53 49 4e 53 54 0d 0a 20 20   HAVE_OSINST..  
2600: 69 66 28 20 70 56 66 73 20 29 7b 0d 0a 20 20 20  if( pVfs ){..   
2610: 20 73 71 6c 69 74 65 33 5f 69 6e 73 74 76 66 73   sqlite3_instvfs
2620: 5f 64 65 73 74 72 6f 79 28 70 56 66 73 29 3b 0d  _destroy(pVfs);.
2630: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 76 66 73  .    printf("vfs
2640: 20 6c 6f 67 20 77 72 69 74 74 65 6e 20 74 6f 20   log written to 
2650: 25 73 5c 6e 22 2c 20 61 72 67 76 5b 30 5d 29 3b  %s\n", argv[0]);
2660: 0d 0a 20 20 7d 0d 0a 23 65 6e 64 69 66 0d 0a 0d  ..  }..#endif...
2670: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0d 0a 7d 0d  .  return 0;..}.
2680: 0a                                               .