/ Hex Artifact Content
Login

Artifact 90446861e566a9965a8d005381a3c964ff333646:


0000: 2f 2a 0a 2a 2a 20 41 20 70 72 6f 67 72 61 6d 20  /*.** A program 
0010: 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  for performance 
0020: 74 65 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  testing..**.** T
0030: 68 65 20 61 76 61 69 6c 61 62 6c 65 20 63 6f 6d  he available com
0040: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
0050: 73 20 61 72 65 20 64 65 73 63 72 69 62 65 64 20  s are described 
0060: 62 65 6c 6f 77 3a 0a 2a 2f 0a 73 74 61 74 69 63  below:.*/.static
0070: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 48 65 6c   const char zHel
0080: 70 5b 5d 20 3d 0a 20 20 22 55 73 61 67 65 3a 20  p[] =.  "Usage: 
0090: 25 73 20 5b 2d 2d 6f 70 74 69 6f 6e 73 5d 20 44  %s [--options] D
00a0: 41 54 41 42 41 53 45 5c 6e 22 0a 20 20 22 4f 70  ATABASE\n".  "Op
00b0: 74 69 6f 6e 73 3a 5c 6e 22 0a 20 20 22 20 20 2d  tions:\n".  "  -
00c0: 2d 61 75 74 6f 76 61 63 75 75 6d 20 20 20 20 20  -autovacuum     
00d0: 20 20 20 45 6e 61 62 6c 65 20 41 55 54 4f 56 41     Enable AUTOVA
00e0: 43 55 55 4d 20 6d 6f 64 65 5c 6e 22 0a 20 20 22  CUUM mode\n".  "
00f0: 20 20 2d 2d 63 61 63 68 65 73 69 7a 65 20 4e 20    --cachesize N 
0100: 20 20 20 20 20 20 53 65 74 20 74 68 65 20 63 61        Set the ca
0110: 63 68 65 20 73 69 7a 65 20 74 6f 20 4e 5c 6e 22  che size to N\n"
0120: 20 0a 20 20 22 20 20 2d 2d 65 78 63 6c 75 73 69   .  "  --exclusi
0130: 76 65 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c  ve         Enabl
0140: 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  e locking_mode=E
0150: 58 43 4c 55 53 49 56 45 5c 6e 22 0a 20 20 22 20  XCLUSIVE\n".  " 
0160: 20 2d 2d 65 78 70 6c 61 69 6e 20 20 20 20 20 20   --explain      
0170: 20 20 20 20 20 4c 69 6b 65 20 2d 2d 73 71 6c 6f       Like --sqlo
0180: 6e 6c 79 20 62 75 74 20 77 69 74 68 20 61 64 64  nly but with add
0190: 65 64 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  ed EXPLAIN keywo
01a0: 72 64 73 5c 6e 22 0a 20 20 22 20 20 2d 2d 68 65  rds\n".  "  --he
01b0: 61 70 20 53 5a 20 4d 49 4e 20 20 20 20 20 20 20  ap SZ MIN       
01c0: 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  Memory allocator
01d0: 20 75 73 65 73 20 53 5a 20 62 79 74 65 73 20 26   uses SZ bytes &
01e0: 20 6d 69 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   min allocation 
01f0: 4d 49 4e 5c 6e 22 0a 20 20 22 20 20 2d 2d 69 6e  MIN\n".  "  --in
0200: 63 72 76 61 63 75 75 6d 20 20 20 20 20 20 20 20  crvacuum        
0210: 45 6e 61 62 6c 65 20 69 6e 63 72 65 6d 65 6e 61  Enable incremena
0220: 74 61 6c 20 76 61 63 75 75 6d 20 6d 6f 64 65 5c  tal vacuum mode\
0230: 6e 22 0a 20 20 22 20 20 2d 2d 6a 6f 75 72 6e 61  n".  "  --journa
0240: 6c 6d 6f 64 65 20 4d 20 20 20 20 20 53 65 74 20  lmode M     Set 
0250: 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
0260: 20 74 6f 20 4d 4f 44 45 5c 6e 22 0a 20 20 22 20   to MODE\n".  " 
0270: 20 2d 2d 6b 65 79 20 4b 45 59 20 20 20 20 20 20   --key KEY      
0280: 20 20 20 20 20 53 65 74 20 74 68 65 20 65 6e 63       Set the enc
0290: 72 79 70 74 69 6f 6e 20 6b 65 79 20 74 6f 20 4b  ryption key to K
02a0: 45 59 5c 6e 22 0a 20 20 22 20 20 2d 2d 6c 6f 6f  EY\n".  "  --loo
02b0: 6b 61 73 69 64 65 20 4e 20 53 5a 20 20 20 20 43  kaside N SZ    C
02c0: 6f 6e 66 69 67 75 72 65 20 6c 6f 6f 6b 61 73 69  onfigure lookasi
02d0: 64 65 20 66 6f 72 20 4e 20 73 6c 6f 74 73 20 6f  de for N slots o
02e0: 66 20 53 5a 20 62 79 74 65 73 20 65 61 63 68 5c  f SZ bytes each\
02f0: 6e 22 0a 20 20 22 20 20 2d 2d 6e 6f 73 79 6e 63  n".  "  --nosync
0300: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
0310: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0320: 75 73 3d 4f 46 46 5c 6e 22 0a 20 20 22 20 20 2d  us=OFF\n".  "  -
0330: 2d 6e 6f 74 6e 75 6c 6c 20 20 20 20 20 20 20 20  -notnull        
0340: 20 20 20 41 64 64 20 4e 4f 54 20 4e 55 4c 4c 20     Add NOT NULL 
0350: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 74  constraints to t
0360: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 5c 6e 22 0a  able columns\n".
0370: 20 20 22 20 20 2d 2d 70 61 67 65 73 69 7a 65 20    "  --pagesize 
0380: 4e 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65  N        Set the
0390: 20 70 61 67 65 20 73 69 7a 65 20 74 6f 20 4e 5c   page size to N\
03a0: 6e 22 0a 20 20 22 20 20 2d 2d 70 63 61 63 68 65  n".  "  --pcache
03b0: 20 4e 20 53 5a 20 20 20 20 20 20 20 43 6f 6e 66   N SZ       Conf
03c0: 69 67 75 72 65 20 4e 20 70 61 67 65 73 20 6f 66  igure N pages of
03d0: 20 70 61 67 65 63 61 63 68 65 20 65 61 63 68 20   pagecache each 
03e0: 6f 66 20 73 69 7a 65 20 53 5a 20 62 79 74 65 73  of size SZ bytes
03f0: 5c 6e 22 0a 20 20 22 20 20 2d 2d 70 72 69 6d 61  \n".  "  --prima
0400: 72 79 6b 65 79 20 20 20 20 20 20 20 20 55 73 65  rykey        Use
0410: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 73   PRIMARY KEY ins
0420: 74 65 61 64 20 6f 66 20 55 4e 49 51 55 45 20 77  tead of UNIQUE w
0430: 68 65 72 65 20 61 70 70 72 6f 70 72 69 61 74 65  here appropriate
0440: 5c 6e 22 0a 20 20 22 20 20 2d 2d 72 65 70 72 65  \n".  "  --repre
0450: 70 61 72 65 20 20 20 20 20 20 20 20 20 52 65 70  pare         Rep
0460: 72 65 70 61 72 65 20 65 61 63 68 20 73 74 61 74  repare each stat
0470: 65 6d 65 6e 74 20 75 70 6f 6e 20 65 76 65 72 79  ement upon every
0480: 20 69 6e 76 6f 63 61 74 69 6f 6e 5c 6e 22 0a 20   invocation\n". 
0490: 20 22 20 20 2d 2d 73 63 72 61 74 63 68 20 4e 20   "  --scratch N 
04a0: 53 5a 20 20 20 20 20 20 43 6f 6e 66 69 67 75 72  SZ      Configur
04b0: 65 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79  e scratch memory
04c0: 20 66 6f 72 20 4e 20 73 6c 6f 74 73 20 6f 66 20   for N slots of 
04d0: 53 5a 20 62 79 74 65 73 20 65 61 63 68 5c 6e 22  SZ bytes each\n"
04e0: 0a 20 20 22 20 20 2d 2d 73 71 6c 6f 6e 6c 79 20  .  "  --sqlonly 
04f0: 20 20 20 20 20 20 20 20 20 20 4e 6f 2d 6f 70 2e            No-op.
0500: 20 20 4f 6e 6c 79 20 73 68 6f 77 20 74 68 65 20    Only show the 
0510: 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68  SQL that would h
0520: 61 76 65 20 62 65 65 6e 20 72 75 6e 2e 5c 6e 22  ave been run.\n"
0530: 0a 20 20 22 20 20 2d 2d 73 69 7a 65 20 4e 20 20  .  "  --size N  
0540: 20 20 20 20 20 20 20 20 20 20 52 65 6c 61 74 69            Relati
0550: 76 65 20 74 65 73 74 20 73 69 7a 65 2e 20 20 44  ve test size.  D
0560: 65 66 61 75 6c 74 3d 31 30 30 5c 6e 22 0a 20 20  efault=100\n".  
0570: 22 20 20 2d 2d 73 74 61 74 73 20 20 20 20 20 20  "  --stats      
0580: 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74         Show stat
0590: 69 73 74 69 63 73 20 61 74 20 74 68 65 20 65 6e  istics at the en
05a0: 64 5c 6e 22 0a 20 20 22 20 20 2d 2d 74 65 73 74  d\n".  "  --test
05b0: 73 65 74 20 54 20 20 20 20 20 20 20 20 20 52 75  set T         Ru
05c0: 6e 20 74 65 73 74 2d 73 65 74 20 54 5c 6e 22 0a  n test-set T\n".
05d0: 20 20 22 20 20 2d 2d 74 72 61 63 65 20 20 20 20    "  --trace    
05e0: 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 6f 6e           Turn on
05f0: 20 53 51 4c 20 74 72 61 63 69 6e 67 5c 6e 22 0a   SQL tracing\n".
0600: 20 20 22 20 20 2d 2d 75 74 66 31 36 62 65 20 20    "  --utf16be  
0610: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 65 78           Set tex
0620: 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 55 54  t encoding to UT
0630: 46 2d 31 36 42 45 5c 6e 22 0a 20 20 22 20 20 2d  F-16BE\n".  "  -
0640: 2d 75 74 66 31 36 6c 65 20 20 20 20 20 20 20 20  -utf16le        
0650: 20 20 20 53 65 74 20 74 65 78 74 20 65 6e 63 6f     Set text enco
0660: 64 69 6e 67 20 74 6f 20 55 54 46 2d 31 36 4c 45  ding to UTF-16LE
0670: 5c 6e 22 0a 20 20 22 20 20 2d 2d 77 69 74 68 6f  \n".  "  --witho
0680: 75 74 2d 72 6f 77 69 64 20 20 20 20 20 55 73 65  ut-rowid     Use
0690: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 77   WITHOUT ROWID w
06a0: 68 65 72 65 20 61 70 70 72 6f 70 72 69 61 74 65  here appropriate
06b0: 5c 6e 22 0a 3b 0a 0a 0a 23 69 6e 63 6c 75 64 65  \n".;...#include
06c0: 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e   "sqlite3.h".#in
06d0: 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e  clude <assert.h>
06e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
06f0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h>.#include <st
0700: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
0710: 20 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63   <stdarg.h>.#inc
0720: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0730: 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e  #include <ctype.
0740: 68 3e 0a 0a 2f 2a 20 41 6c 6c 20 67 6c 6f 62 61  h>../* All globa
0750: 6c 20 73 74 61 74 65 20 69 73 20 68 65 6c 64 20  l state is held 
0760: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
0770: 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  e */.static stru
0780: 63 74 20 47 6c 6f 62 61 6c 20 7b 0a 20 20 73 71  ct Global {.  sq
0790: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
07a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
07b0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 63 6f  open database co
07c0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71  nnection */.  sq
07d0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
07e0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72  t;       /* Curr
07f0: 65 6e 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ent SQL statemen
0800: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  t */.  sqlite3_i
0810: 6e 74 36 34 20 69 53 74 61 72 74 3b 20 20 20 20  nt64 iStart;    
0820: 20 20 2f 2a 20 53 74 61 72 74 2d 74 69 6d 65 20    /* Start-time 
0830: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
0840: 74 65 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  test */.  sqlite
0850: 33 5f 69 6e 74 36 34 20 69 54 6f 74 61 6c 3b 20  3_int64 iTotal; 
0860: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 69       /* Total ti
0870: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 62 57 69 74  me */.  int bWit
0880: 68 6f 75 74 52 6f 77 69 64 3b 20 20 20 20 20 20  houtRowid;      
0890: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d     /* True for -
08a0: 2d 77 69 74 68 6f 75 74 2d 72 6f 77 69 64 20 2a  -without-rowid *
08b0: 2f 0a 20 20 69 6e 74 20 62 52 65 70 72 65 70 61  /.  int bReprepa
08c0: 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  re;            /
08d0: 2a 20 54 72 75 65 20 74 6f 20 72 65 70 72 65 70  * True to reprep
08e0: 61 72 65 20 74 68 65 20 53 51 4c 20 6f 6e 20 65  are the SQL on e
08f0: 61 63 68 20 72 65 72 75 6e 20 2a 2f 0a 20 20 69  ach rerun */.  i
0900: 6e 74 20 62 53 71 6c 4f 6e 6c 79 3b 20 20 20 20  nt bSqlOnly;    
0910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0920: 65 20 74 6f 20 70 72 69 6e 74 20 74 68 65 20 53  e to print the S
0930: 51 4c 20 6f 6e 63 65 20 6f 6e 6c 79 20 2a 2f 0a  QL once only */.
0940: 20 20 69 6e 74 20 62 45 78 70 6c 61 69 6e 3b 20    int bExplain; 
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0960: 50 72 69 6e 74 20 53 51 4c 20 77 69 74 68 20 45  Print SQL with E
0970: 58 50 4c 41 49 4e 20 70 72 65 66 69 78 20 2a 2f  XPLAIN prefix */
0980: 0a 20 20 69 6e 74 20 73 7a 54 65 73 74 3b 20 20  .  int szTest;  
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
09a0: 20 53 63 61 6c 65 20 66 61 63 74 6f 72 20 66 6f   Scale factor fo
09b0: 72 20 74 65 73 74 20 69 74 65 72 61 74 69 6f 6e  r test iteration
09c0: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
09d0: 72 20 2a 7a 57 52 3b 20 20 20 20 20 20 20 20 20  r *zWR;         
09e0: 20 20 2f 2a 20 4d 69 67 68 74 20 62 65 20 57 49    /* Might be WI
09f0: 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a 20  THOUT ROWID */. 
0a00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4e   const char *zNN
0a10: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  ;           /* M
0a20: 69 67 68 74 20 62 65 20 4e 4f 54 20 4e 55 4c 4c  ight be NOT NULL
0a30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0a40: 20 2a 7a 50 4b 3b 20 20 20 20 20 20 20 20 20 20   *zPK;          
0a50: 20 2f 2a 20 4d 69 67 68 74 20 62 65 20 55 4e 49   /* Might be UNI
0a60: 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
0a70: 45 59 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  EY */.  unsigned
0a80: 20 69 6e 74 20 78 2c 20 79 3b 20 20 20 20 20 20   int x, y;      
0a90: 20 20 20 2f 2a 20 50 73 65 75 64 6f 2d 72 61 6e     /* Pseudo-ran
0aa0: 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
0ab0: 61 74 6f 72 20 73 74 61 74 65 20 2a 2f 0a 20 20  ator state */.  
0ac0: 69 6e 74 20 6e 52 65 73 75 6c 74 3b 20 20 20 20  int nResult;    
0ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
0ae0: 7a 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ze of the curren
0af0: 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 63 68  t result */.  ch
0b00: 61 72 20 7a 52 65 73 75 6c 74 5b 33 30 30 30 5d  ar zResult[3000]
0b10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74  ;        /* Text
0b20: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
0b30: 72 65 73 75 6c 74 20 2a 2f 0a 7d 20 67 3b 0a 0a  result */.} g;..
0b40: 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72  ./* Print an err
0b50: 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 65  or message and e
0b60: 78 69 74 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  xit */.static vo
0b70: 69 64 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 63  id fatal_error(c
0b80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c  onst char *zMsg,
0b90: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
0ba0: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
0bb0: 61 70 2c 20 7a 4d 73 67 29 3b 0a 20 20 76 66 70  ap, zMsg);.  vfp
0bc0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 7a 4d  rintf(stderr, zM
0bd0: 73 67 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  sg, ap);.  va_en
0be0: 64 28 61 70 29 3b 0a 20 20 65 78 69 74 28 31 29  d(ap);.  exit(1)
0bf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0c00: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
0c10: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67   hexadecimal dig
0c20: 69 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  it.  Return -1 i
0c30: 66 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69  f the input.** i
0c40: 73 20 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69  s not a hex digi
0c50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
0c60: 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 63   hexDigitValue(c
0c70: 68 61 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e  har c){.  if( c>
0c80: 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29  ='0' && c<='9' )
0c90: 20 72 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b   return c - '0';
0ca0: 0a 20 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26  .  if( c>='a' &&
0cb0: 20 63 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e   c<='f' ) return
0cc0: 20 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20   c - 'a' + 10;. 
0cd0: 20 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63   if( c>='A' && c
0ce0: 3c 3d 27 46 27 20 29 20 72 65 74 75 72 6e 20 63  <='F' ) return c
0cf0: 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72   - 'A' + 10;.  r
0d00: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 20  eturn -1;.}../* 
0d10: 50 72 6f 76 69 64 65 20 61 6e 20 61 6c 74 65 72  Provide an alter
0d20: 6e 61 74 69 76 65 20 74 6f 20 73 71 6c 69 74 65  native to sqlite
0d30: 33 5f 73 74 72 69 63 6d 70 28 29 20 69 6e 20 6f  3_stricmp() in o
0d40: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
0d50: 0a 2a 2a 20 53 51 4c 69 74 65 20 2a 2f 0a 23 69  .** SQLite */.#i
0d60: 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  f SQLITE_VERSION
0d70: 5f 4e 55 4d 42 45 52 3c 33 30 30 37 30 31 31 0a  _NUMBER<3007011.
0d80: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  # define sqlite3
0d90: 5f 73 74 72 69 63 6d 70 20 73 74 72 63 6d 70 0a  _stricmp strcmp.
0da0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0db0: 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20  terpret zArg as 
0dc0: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
0dd0: 2c 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20  , possibly with 
0de0: 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61  suffixes..*/.sta
0df0: 74 69 63 20 69 6e 74 20 69 6e 74 65 67 65 72 56  tic int integerV
0e00: 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20  alue(const char 
0e10: 2a 7a 41 72 67 29 7b 0a 20 20 73 71 6c 69 74 65  *zArg){.  sqlite
0e20: 33 5f 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20  3_int64 v = 0;. 
0e30: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
0e40: 72 75 63 74 20 7b 20 63 68 61 72 20 2a 7a 53 75  ruct { char *zSu
0e50: 66 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b  ffix; int iMult;
0e60: 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20   } aMult[] = {. 
0e70: 20 20 20 7b 20 22 4b 69 42 22 2c 20 31 30 32 34     { "KiB", 1024
0e80: 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c   },.    { "MiB",
0e90: 20 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20   1024*1024 },.  
0ea0: 20 20 7b 20 22 47 69 42 22 2c 20 31 30 32 34 2a    { "GiB", 1024*
0eb0: 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20  1024*1024 },.   
0ec0: 20 7b 20 22 4b 42 22 2c 20 20 31 30 30 30 20 7d   { "KB",  1000 }
0ed0: 2c 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20 20 31  ,.    { "MB",  1
0ee0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
0ef0: 22 47 42 22 2c 20 20 31 30 30 30 30 30 30 30 30  "GB",  100000000
0f00: 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20  0 },.    { "K", 
0f10: 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20    1000 },.    { 
0f20: 22 4d 22 2c 20 20 20 31 30 30 30 30 30 30 20 7d  "M",   1000000 }
0f30: 2c 0a 20 20 20 20 7b 20 22 47 22 2c 20 20 20 31  ,.    { "G",   1
0f40: 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d  000000000 },.  }
0f50: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
0f60: 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66   isNeg = 0;.  if
0f70: 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29  ( zArg[0]=='-' )
0f80: 7b 0a 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b  {.    isNeg = 1;
0f90: 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d  .    zArg++;.  }
0fa0: 65 6c 73 65 20 69 66 28 20 7a 41 72 67 5b 30 5d  else if( zArg[0]
0fb0: 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72  =='+' ){.    zAr
0fc0: 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  g++;.  }.  if( z
0fd0: 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a  Arg[0]=='0' && z
0fe0: 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20  Arg[1]=='x' ){. 
0ff0: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41     int x;.    zA
1000: 72 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69  rg += 2;.    whi
1010: 6c 65 28 20 28 78 20 3d 20 68 65 78 44 69 67 69  le( (x = hexDigi
1020: 74 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29  tValue(zArg[0]))
1030: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  >=0 ){.      v =
1040: 20 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20   (v<<4) + x;.   
1050: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d     zArg++;.    }
1060: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
1070: 69 6c 65 28 20 69 73 64 69 67 69 74 28 7a 41 72  ile( isdigit(zAr
1080: 67 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 76  g[0]) ){.      v
1090: 20 3d 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30   = v*10 + zArg[0
10a0: 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a  ] - '0';.      z
10b0: 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Arg++;.    }.  }
10c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
10d0: 7a 65 6f 66 28 61 4d 75 6c 74 29 2f 73 69 7a 65  zeof(aMult)/size
10e0: 6f 66 28 61 4d 75 6c 74 5b 30 5d 29 3b 20 69 2b  of(aMult[0]); i+
10f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1100: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c  te3_stricmp(aMul
1110: 74 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41  t[i].zSuffix, zA
1120: 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rg)==0 ){.      
1130: 76 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d  v *= aMult[i].iM
1140: 75 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ult;.      break
1150: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1160: 28 20 76 3e 30 78 37 66 66 66 66 66 66 66 20 29  ( v>0x7fffffff )
1170: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 70 61   fatal_error("pa
1180: 72 61 6d 65 74 65 72 20 74 6f 6f 20 6c 61 72 67  rameter too larg
1190: 65 20 2d 20 6d 61 78 20 32 31 34 37 34 38 33 36  e - max 21474836
11a0: 34 38 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  48");.  return (
11b0: 69 6e 74 29 28 69 73 4e 65 67 3f 20 2d 76 20 3a  int)(isNeg? -v :
11c0: 20 76 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72   v);.}../* Retur
11d0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 61  n the current wa
11e0: 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 2c 20 69  ll-clock time, i
11f0: 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 2a  n milliseconds *
1200: 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1210: 73 70 65 65 64 74 65 73 74 31 5f 74 69 6d 65 73  speedtest1_times
1220: 74 61 6d 70 28 76 6f 69 64 29 7b 0a 20 20 73 74  tamp(void){.  st
1230: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
1240: 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20 30 3b 0a   *clockVfs = 0;.
1250: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1260: 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  t;.  if( clockVf
1270: 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56 66 73 20  s==0 ) clockVfs 
1280: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1290: 6e 64 28 30 29 3b 0a 23 69 66 20 53 51 4c 49 54  nd(0);.#if SQLIT
12a0: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
12b0: 3e 3d 33 30 30 37 30 30 30 0a 20 20 69 66 28 20  >=3007000.  if( 
12c0: 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73 69  clockVfs->iVersi
12d0: 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b 56 66  on>=2 && clockVf
12e0: 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49  s->xCurrentTimeI
12f0: 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt64!=0 ){.    c
1300: 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e  lockVfs->xCurren
1310: 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b  tTimeInt64(clock
1320: 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73  Vfs, &t);.  }els
1330: 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1340: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63   double r;.    c
1350: 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e  lockVfs->xCurren
1360: 74 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20  tTime(clockVfs, 
1370: 26 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71  &r);.    t = (sq
1380: 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38  lite3_int64)(r*8
1390: 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a  6400000.0);.  }.
13a0: 20 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 2f    return t;.}../
13b0: 2a 20 52 65 74 75 72 6e 20 61 20 70 73 65 75 64  * Return a pseud
13c0: 6f 2d 72 61 6e 64 6f 6d 20 75 6e 73 69 67 6e 65  o-random unsigne
13d0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 75 6e 73  d integer */.uns
13e0: 69 67 6e 65 64 20 69 6e 74 20 73 70 65 65 64 74  igned int speedt
13f0: 65 73 74 31 5f 72 61 6e 64 6f 6d 28 76 6f 69 64  est1_random(void
1400: 29 7b 0a 20 20 67 2e 78 20 3d 20 28 67 2e 78 3e  ){.  g.x = (g.x>
1410: 3e 31 29 20 5e 20 28 28 31 2b 7e 28 67 2e 78 26  >1) ^ ((1+~(g.x&
1420: 31 29 29 20 26 20 30 78 64 30 30 30 30 30 30 31  1)) & 0xd0000001
1430: 29 3b 0a 20 20 67 2e 79 20 3d 20 67 2e 79 2a 31  );.  g.y = g.y*1
1440: 31 30 33 35 31 35 32 34 35 20 2b 20 31 32 33 34  103515245 + 1234
1450: 35 3b 0a 20 20 72 65 74 75 72 6e 20 67 2e 78 20  5;.  return g.x 
1460: 5e 20 67 2e 79 3b 0a 7d 0a 0a 2f 2a 20 4d 61 70  ^ g.y;.}../* Map
1470: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 77 69   the value in wi
1480: 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f  thin the range o
1490: 66 20 31 2e 2e 2e 6c 69 6d 69 74 20 69 6e 74 6f  f 1...limit into
14a0: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 6e 75 6d 62   another.** numb
14b0: 65 72 20 69 6e 20 61 20 77 61 79 20 74 68 61 74  er in a way that
14c0: 20 69 73 20 63 68 61 74 69 63 20 61 6e 64 20 69   is chatic and i
14d0: 6e 76 65 72 74 61 62 6c 65 2e 0a 2a 2f 0a 75 6e  nvertable..*/.un
14e0: 73 69 67 6e 65 64 20 73 77 69 7a 7a 6c 65 28 75  signed swizzle(u
14f0: 6e 73 69 67 6e 65 64 20 69 6e 2c 20 75 6e 73 69  nsigned in, unsi
1500: 67 6e 65 64 20 6c 69 6d 69 74 29 7b 0a 20 20 75  gned limit){.  u
1510: 6e 73 69 67 6e 65 64 20 6f 75 74 20 3d 20 30 3b  nsigned out = 0;
1520: 0a 20 20 77 68 69 6c 65 28 20 6c 69 6d 69 74 20  .  while( limit 
1530: 29 7b 0a 20 20 20 20 6f 75 74 20 3d 20 28 6f 75  ){.    out = (ou
1540: 74 3c 3c 31 29 20 7c 20 28 69 6e 26 31 29 3b 0a  t<<1) | (in&1);.
1550: 20 20 20 20 69 6e 20 3e 3e 3d 20 31 3b 0a 20 20      in >>= 1;.  
1560: 20 20 6c 69 6d 69 74 20 3e 3e 3d 20 31 3b 0a 20    limit >>= 1;. 
1570: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b   }.  return out;
1580: 0a 7d 0a 0a 2f 2a 20 52 6f 75 6e 64 20 75 70 20  .}../* Round up 
1590: 61 20 6e 75 6d 62 65 72 20 73 6f 20 74 68 61 74  a number so that
15a0: 20 69 74 20 69 73 20 61 20 70 6f 77 65 72 20 6f   it is a power o
15b0: 66 20 74 77 6f 20 6d 69 6e 75 73 20 6f 6e 65 0a  f two minus one.
15c0: 2a 2f 0a 75 6e 73 69 67 6e 65 64 20 72 6f 75 6e  */.unsigned roun
15d0: 64 75 70 5f 61 6c 6c 6f 6e 65 73 28 75 6e 73 69  dup_allones(unsi
15e0: 67 6e 65 64 20 6c 69 6d 69 74 29 7b 0a 20 20 75  gned limit){.  u
15f0: 6e 73 69 67 6e 65 64 20 6d 20 3d 20 31 3b 0a 20  nsigned m = 1;. 
1600: 20 77 68 69 6c 65 28 20 6d 3c 6c 69 6d 69 74 20   while( m<limit 
1610: 29 20 6d 20 3d 20 28 6d 3c 3c 31 29 2b 31 3b 0a  ) m = (m<<1)+1;.
1620: 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a 0a 2f    return m;.}../
1630: 2a 20 54 68 65 20 73 70 65 65 64 74 65 73 74 31  * The speedtest1
1640: 5f 6e 75 6d 62 65 72 6e 61 6d 65 20 70 72 6f 63  _numbername proc
1650: 65 64 75 72 65 20 62 65 6c 6f 77 20 63 6f 6e 76  edure below conv
1660: 65 72 74 73 20 69 74 73 20 61 72 67 6d 65 6e 74  erts its argment
1670: 20 28 61 6e 20 69 6e 74 65 67 65 72 29 0a 2a 2a   (an integer).**
1680: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 77   into a string w
1690: 68 69 63 68 20 69 73 20 74 68 65 20 45 6e 67 6c  hich is the Engl
16a0: 69 73 68 2d 6c 61 6e 67 75 61 67 65 20 6e 61 6d  ish-language nam
16b0: 65 20 66 6f 72 20 74 68 61 74 20 6e 75 6d 62 65  e for that numbe
16c0: 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
16d0: 65 64 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64  ed string should
16e0: 20 62 65 20 66 72 65 65 64 20 77 69 74 68 20 73   be freed with s
16f0: 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
1700: 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a  *.** Example:.**
1710: 0a 2a 2a 20 20 20 20 20 73 70 65 65 64 74 65 73  .**     speedtes
1720: 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 31 32  t1_numbername(12
1730: 33 29 20 20 20 2d 3e 20 20 22 6f 6e 65 20 68 75  3)   ->  "one hu
1740: 6e 64 72 65 64 20 74 77 65 6e 74 79 20 74 68 72  ndred twenty thr
1750: 65 65 22 0a 2a 2f 0a 69 6e 74 20 73 70 65 65 64  ee".*/.int speed
1760: 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65  test1_numbername
1770: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 2c  (unsigned int n,
1780: 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 69 6e 74   char *zOut, int
1790: 20 6e 4f 75 74 29 7b 0a 20 20 73 74 61 74 69 63   nOut){.  static
17a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 6e 65   const char *one
17b0: 73 5b 5d 20 3d 20 7b 20 20 22 7a 65 72 6f 22 2c  s[] = {  "zero",
17c0: 20 22 6f 6e 65 22 2c 20 22 74 77 6f 22 2c 20 22   "one", "two", "
17d0: 74 68 72 65 65 22 2c 20 22 66 6f 75 72 22 2c 20  three", "four", 
17e0: 22 66 69 76 65 22 2c 20 0a 20 20 20 20 20 20 20  "five", .       
17f0: 20 20 20 20 20 20 20 20 20 20 20 22 73 69 78 22             "six"
1800: 2c 20 22 73 65 76 65 6e 22 2c 20 22 65 69 67 68  , "seven", "eigh
1810: 74 22 2c 20 22 6e 69 6e 65 22 2c 20 22 74 65 6e  t", "nine", "ten
1820: 22 2c 20 22 65 6c 65 76 65 6e 22 2c 20 22 74 77  ", "eleven", "tw
1830: 65 6c 76 65 22 2c 20 0a 20 20 20 20 20 20 20 20  elve", .        
1840: 20 20 20 20 20 20 20 20 20 20 22 74 68 69 72 74            "thirt
1850: 65 65 6e 22 2c 20 22 66 6f 75 72 74 65 65 6e 22  een", "fourteen"
1860: 2c 20 22 66 69 66 74 65 65 6e 22 2c 20 22 73 69  , "fifteen", "si
1870: 78 74 65 65 6e 22 2c 20 22 73 65 76 65 6e 74 65  xteen", "sevente
1880: 65 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en",.           
1890: 20 20 20 20 20 20 20 22 65 69 67 68 74 65 65 6e         "eighteen
18a0: 22 2c 20 22 6e 69 6e 65 74 65 65 6e 22 20 7d 3b  ", "nineteen" };
18b0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
18c0: 63 68 61 72 20 2a 74 65 6e 73 5b 5d 20 3d 20 7b  char *tens[] = {
18d0: 20 22 22 2c 20 22 74 65 6e 22 2c 20 22 74 77 65   "", "ten", "twe
18e0: 6e 74 79 22 2c 20 22 74 68 69 72 74 79 22 2c 20  nty", "thirty", 
18f0: 22 66 6f 72 74 79 22 2c 0a 20 20 20 20 20 20 20  "forty",.       
1900: 20 20 20 20 20 20 20 20 20 20 22 66 69 66 74 79            "fifty
1910: 22 2c 20 22 73 69 78 74 79 22 2c 20 22 73 65 76  ", "sixty", "sev
1920: 65 6e 74 79 22 2c 20 22 65 69 67 68 74 79 22 2c  enty", "eighty",
1930: 20 22 6e 69 6e 65 74 79 22 20 7d 3b 0a 20 20 69   "ninety" };.  i
1940: 6e 74 20 69 20 3d 20 30 3b 0a 0a 20 20 69 66 28  nt i = 0;..  if(
1950: 20 6e 3e 3d 31 30 30 30 30 30 30 30 30 30 20 29   n>=1000000000 )
1960: 7b 0a 20 20 20 20 69 20 2b 3d 20 73 70 65 65 64  {.    i += speed
1970: 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65  test1_numbername
1980: 28 6e 2f 31 30 30 30 30 30 30 30 30 30 2c 20 7a  (n/1000000000, z
1990: 4f 75 74 2b 69 2c 20 6e 4f 75 74 2d 69 29 3b 0a  Out+i, nOut-i);.
19a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
19b0: 69 6e 74 66 28 6e 4f 75 74 2d 69 2c 20 7a 4f 75  intf(nOut-i, zOu
19c0: 74 2b 69 2c 20 22 20 62 69 6c 6c 69 6f 6e 22 29  t+i, " billion")
19d0: 3b 0a 20 20 20 20 69 20 2b 3d 20 28 69 6e 74 29  ;.    i += (int)
19e0: 73 74 72 6c 65 6e 28 7a 4f 75 74 2b 69 29 3b 0a  strlen(zOut+i);.
19f0: 20 20 20 20 6e 20 3d 20 6e 20 25 20 31 30 30 30      n = n % 1000
1a00: 30 30 30 30 30 30 3b 0a 20 20 7d 0a 20 20 69 66  000000;.  }.  if
1a10: 28 20 6e 3e 3d 31 30 30 30 30 30 30 20 29 7b 0a  ( n>=1000000 ){.
1a20: 20 20 20 20 69 66 28 20 69 20 26 26 20 69 3c 6e      if( i && i<n
1a30: 4f 75 74 2d 31 20 29 20 7a 4f 75 74 5b 69 2b 2b  Out-1 ) zOut[i++
1a40: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 20 2b  ] = ' ';.    i +
1a50: 3d 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d  = speedtest1_num
1a60: 62 65 72 6e 61 6d 65 28 6e 2f 31 30 30 30 30 30  bername(n/100000
1a70: 30 2c 20 7a 4f 75 74 2b 69 2c 20 6e 4f 75 74 2d  0, zOut+i, nOut-
1a80: 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  i);.    sqlite3_
1a90: 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 2c  snprintf(nOut-i,
1aa0: 20 7a 4f 75 74 2b 69 2c 20 22 20 6d 69 6c 6c 69   zOut+i, " milli
1ab0: 6f 6e 22 29 3b 0a 20 20 20 20 69 20 2b 3d 20 28  on");.    i += (
1ac0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 2b  int)strlen(zOut+
1ad0: 69 29 3b 0a 20 20 20 20 6e 20 3d 20 6e 20 25 20  i);.    n = n % 
1ae0: 31 30 30 30 30 30 30 3b 0a 20 20 7d 0a 20 20 69  1000000;.  }.  i
1af0: 66 28 20 6e 3e 3d 31 30 30 30 20 29 7b 0a 20 20  f( n>=1000 ){.  
1b00: 20 20 69 66 28 20 69 20 26 26 20 69 3c 6e 4f 75    if( i && i<nOu
1b10: 74 2d 31 20 29 20 7a 4f 75 74 5b 69 2b 2b 5d 20  t-1 ) zOut[i++] 
1b20: 3d 20 27 20 27 3b 0a 20 20 20 20 69 20 2b 3d 20  = ' ';.    i += 
1b30: 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d 62 65  speedtest1_numbe
1b40: 72 6e 61 6d 65 28 6e 2f 31 30 30 30 2c 20 7a 4f  rname(n/1000, zO
1b50: 75 74 2b 69 2c 20 6e 4f 75 74 2d 69 29 3b 0a 20  ut+i, nOut-i);. 
1b60: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1b70: 6e 74 66 28 6e 4f 75 74 2d 69 2c 20 7a 4f 75 74  ntf(nOut-i, zOut
1b80: 2b 69 2c 20 22 20 74 68 6f 75 73 61 6e 64 22 29  +i, " thousand")
1b90: 3b 0a 20 20 20 20 69 20 2b 3d 20 28 69 6e 74 29  ;.    i += (int)
1ba0: 73 74 72 6c 65 6e 28 7a 4f 75 74 2b 69 29 3b 0a  strlen(zOut+i);.
1bb0: 20 20 20 20 6e 20 3d 20 6e 20 25 20 31 30 30 30      n = n % 1000
1bc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 31  ;.  }.  if( n>=1
1bd0: 30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 20  00 ){.    if( i 
1be0: 26 26 20 69 3c 6e 4f 75 74 2d 31 20 29 20 7a 4f  && i<nOut-1 ) zO
1bf0: 75 74 5b 69 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  ut[i++] = ' ';. 
1c00: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1c10: 6e 74 66 28 6e 4f 75 74 2d 69 2c 20 7a 4f 75 74  ntf(nOut-i, zOut
1c20: 2b 69 2c 20 22 25 73 20 68 75 6e 64 72 65 64 22  +i, "%s hundred"
1c30: 2c 20 6f 6e 65 73 5b 6e 2f 31 30 30 5d 29 3b 0a  , ones[n/100]);.
1c40: 20 20 20 20 69 20 2b 3d 20 28 69 6e 74 29 73 74      i += (int)st
1c50: 72 6c 65 6e 28 7a 4f 75 74 2b 69 29 3b 0a 20 20  rlen(zOut+i);.  
1c60: 20 20 6e 20 3d 20 6e 20 25 20 31 30 30 3b 0a 20    n = n % 100;. 
1c70: 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 32 30 20 29   }.  if( n>=20 )
1c80: 7b 0a 20 20 20 20 69 66 28 20 69 20 26 26 20 69  {.    if( i && i
1c90: 3c 6e 4f 75 74 2d 31 20 29 20 7a 4f 75 74 5b 69  <nOut-1 ) zOut[i
1ca0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 73  ++] = ' ';.    s
1cb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1cc0: 6e 4f 75 74 2d 69 2c 20 7a 4f 75 74 2b 69 2c 20  nOut-i, zOut+i, 
1cd0: 22 25 73 22 2c 20 74 65 6e 73 5b 6e 2f 31 30 5d  "%s", tens[n/10]
1ce0: 29 3b 0a 20 20 20 20 69 20 2b 3d 20 28 69 6e 74  );.    i += (int
1cf0: 29 73 74 72 6c 65 6e 28 7a 4f 75 74 2b 69 29 3b  )strlen(zOut+i);
1d00: 0a 20 20 20 20 6e 20 3d 20 6e 20 25 20 31 30 3b  .    n = n % 10;
1d10: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
1d20: 7b 0a 20 20 20 20 69 66 28 20 69 20 26 26 20 69  {.    if( i && i
1d30: 3c 6e 4f 75 74 2d 31 20 29 20 7a 4f 75 74 5b 69  <nOut-1 ) zOut[i
1d40: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 73  ++] = ' ';.    s
1d50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1d60: 6e 4f 75 74 2d 69 2c 20 7a 4f 75 74 2b 69 2c 20  nOut-i, zOut+i, 
1d70: 22 25 73 22 2c 20 6f 6e 65 73 5b 6e 5d 29 3b 0a  "%s", ones[n]);.
1d80: 20 20 20 20 69 20 2b 3d 20 28 69 6e 74 29 73 74      i += (int)st
1d90: 72 6c 65 6e 28 7a 4f 75 74 2b 69 29 3b 0a 20 20  rlen(zOut+i);.  
1da0: 7d 0a 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a  }.  if( i==0 ){.
1db0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1dc0: 69 6e 74 66 28 6e 4f 75 74 2d 69 2c 20 7a 4f 75  intf(nOut-i, zOu
1dd0: 74 2b 69 2c 20 22 7a 65 72 6f 22 29 3b 0a 20 20  t+i, "zero");.  
1de0: 20 20 69 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c    i += (int)strl
1df0: 65 6e 28 7a 4f 75 74 2b 69 29 3b 0a 20 20 7d 0a  en(zOut+i);.  }.
1e00: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 0a    return i;.}...
1e10: 2f 2a 20 53 74 61 72 74 20 61 20 6e 65 77 20 74  /* Start a new t
1e20: 65 73 74 20 63 61 73 65 20 2a 2f 0a 23 64 65 66  est case */.#def
1e30: 69 6e 65 20 4e 41 4d 45 57 49 44 54 48 20 36 30  ine NAMEWIDTH 60
1e40: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
1e50: 61 72 20 7a 44 6f 74 73 5b 5d 20 3d 0a 20 20 22  ar zDots[] =.  "
1e60: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1e70: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1e80: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1e90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1ea0: 2e 2e 2e 2e 2e 2e 2e 22 3b 0a 76 6f 69 64 20 73  .......";.void s
1eb0: 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f  peedtest1_begin_
1ec0: 74 65 73 74 28 69 6e 74 20 69 54 65 73 74 4e 75  test(int iTestNu
1ed0: 6d 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  m, const char *z
1ee0: 54 65 73 74 4e 61 6d 65 2c 20 2e 2e 2e 29 7b 0a  TestName, ...){.
1ef0: 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73    int n = (int)s
1f00: 74 72 6c 65 6e 28 7a 54 65 73 74 4e 61 6d 65 29  trlen(zTestName)
1f10: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
1f20: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1f30: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
1f40: 65 73 74 4e 61 6d 65 29 3b 0a 20 20 7a 4e 61 6d  estName);.  zNam
1f50: 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  e = sqlite3_vmpr
1f60: 69 6e 74 66 28 7a 54 65 73 74 4e 61 6d 65 2c 20  intf(zTestName, 
1f70: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1f80: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
1f90: 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 69  rlen(zName);.  i
1fa0: 66 28 20 6e 3e 4e 41 4d 45 57 49 44 54 48 20 29  f( n>NAMEWIDTH )
1fb0: 7b 0a 20 20 20 20 7a 4e 61 6d 65 5b 4e 41 4d 45  {.    zName[NAME
1fc0: 57 49 44 54 48 5d 20 3d 20 30 3b 0a 20 20 20 20  WIDTH] = 0;.    
1fd0: 6e 20 3d 20 4e 41 4d 45 57 49 44 54 48 3b 0a 20  n = NAMEWIDTH;. 
1fe0: 20 7d 0a 20 20 69 66 28 20 67 2e 62 53 71 6c 4f   }.  if( g.bSqlO
1ff0: 6e 6c 79 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  nly ){.    print
2000: 66 28 22 2f 2a 20 25 34 64 20 2d 20 25 73 25 2e  f("/* %4d - %s%.
2010: 2a 73 20 2a 2f 5c 6e 22 2c 20 69 54 65 73 74 4e  *s */\n", iTestN
2020: 75 6d 2c 20 7a 4e 61 6d 65 2c 20 4e 41 4d 45 57  um, zName, NAMEW
2030: 49 44 54 48 2d 6e 2c 20 7a 44 6f 74 73 29 3b 0a  IDTH-n, zDots);.
2040: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
2050: 6e 74 66 28 22 25 34 64 20 2d 20 25 73 25 2e 2a  ntf("%4d - %s%.*
2060: 73 20 22 2c 20 69 54 65 73 74 4e 75 6d 2c 20 7a  s ", iTestNum, z
2070: 4e 61 6d 65 2c 20 4e 41 4d 45 57 49 44 54 48 2d  Name, NAMEWIDTH-
2080: 6e 2c 20 7a 44 6f 74 73 29 3b 0a 20 20 20 20 66  n, zDots);.    f
2090: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
20a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
20b0: 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 67 2e 6e 52  e(zName);.  g.nR
20c0: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 67 2e 69  esult = 0;.  g.i
20d0: 53 74 61 72 74 20 3d 20 73 70 65 65 64 74 65 73  Start = speedtes
20e0: 74 31 5f 74 69 6d 65 73 74 61 6d 70 28 29 3b 0a  t1_timestamp();.
20f0: 20 20 67 2e 78 20 3d 20 30 78 61 64 31 33 31 64    g.x = 0xad131d
2100: 30 62 3b 0a 20 20 67 2e 79 20 3d 20 30 78 34 34  0b;.  g.y = 0x44
2110: 66 39 65 61 63 38 3b 0a 7d 0a 0a 2f 2a 20 43 6f  f9eac8;.}../* Co
2120: 6d 70 6c 65 74 65 20 61 20 74 65 73 74 20 63 61  mplete a test ca
2130: 73 65 20 2a 2f 0a 76 6f 69 64 20 73 70 65 65 64  se */.void speed
2140: 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 76  test1_end_test(v
2150: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
2160: 69 6e 74 36 34 20 69 45 6c 61 70 73 65 54 69 6d  int64 iElapseTim
2170: 65 20 3d 20 73 70 65 65 64 74 65 73 74 31 5f 74  e = speedtest1_t
2180: 69 6d 65 73 74 61 6d 70 28 29 20 2d 20 67 2e 69  imestamp() - g.i
2190: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 21 67 2e  Start;.  if( !g.
21a0: 62 53 71 6c 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  bSqlOnly ){.    
21b0: 67 2e 69 54 6f 74 61 6c 20 2b 3d 20 69 45 6c 61  g.iTotal += iEla
21c0: 70 73 65 54 69 6d 65 3b 0a 20 20 20 20 70 72 69  pseTime;.    pri
21d0: 6e 74 66 28 22 25 34 64 2e 25 30 33 64 73 5c 6e  ntf("%4d.%03ds\n
21e0: 22 2c 20 28 69 6e 74 29 28 69 45 6c 61 70 73 65  ", (int)(iElapse
21f0: 54 69 6d 65 2f 31 30 30 30 29 2c 20 28 69 6e 74  Time/1000), (int
2200: 29 28 69 45 6c 61 70 73 65 54 69 6d 65 25 31 30  )(iElapseTime%10
2210: 30 30 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  00));.  }.  if( 
2220: 67 2e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  g.pStmt ){.    s
2230: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2240: 67 2e 70 53 74 6d 74 29 3b 0a 20 20 20 20 67 2e  g.pStmt);.    g.
2250: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  pStmt = 0;.  }.}
2260: 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 65 6e 64 20  ../* Report end 
2270: 6f 66 20 74 65 73 74 69 6e 67 20 2a 2f 0a 76 6f  of testing */.vo
2280: 69 64 20 73 70 65 65 64 74 65 73 74 31 5f 66 69  id speedtest1_fi
2290: 6e 61 6c 28 76 6f 69 64 29 7b 0a 20 20 69 66 28  nal(void){.  if(
22a0: 20 21 67 2e 62 53 71 6c 4f 6e 6c 79 20 29 7b 0a   !g.bSqlOnly ){.
22b0: 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 20      printf("    
22c0: 20 20 20 54 4f 54 41 4c 25 2e 2a 73 20 25 34 64     TOTAL%.*s %4d
22d0: 2e 25 30 33 64 73 5c 6e 22 2c 20 4e 41 4d 45 57  .%03ds\n", NAMEW
22e0: 49 44 54 48 2d 35 2c 20 7a 44 6f 74 73 2c 0a 20  IDTH-5, zDots,. 
22f0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
2300: 67 2e 69 54 6f 74 61 6c 2f 31 30 30 30 29 2c 20  g.iTotal/1000), 
2310: 28 69 6e 74 29 28 67 2e 69 54 6f 74 61 6c 25 31  (int)(g.iTotal%1
2320: 30 30 30 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  000));.  }.}../*
2330: 20 50 72 69 6e 74 20 61 6e 20 53 51 4c 20 73 74   Print an SQL st
2340: 61 74 65 6d 65 6e 74 20 74 6f 20 73 74 61 6e 64  atement to stand
2350: 61 72 64 20 6f 75 74 70 75 74 20 2a 2f 0a 73 74  ard output */.st
2360: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53  atic void printS
2370: 71 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ql(const char *z
2380: 53 71 6c 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  Sql){.  int n = 
2390: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c  (int)strlen(zSql
23a0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  );.  while( n>0 
23b0: 26 26 20 28 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27  && (zSql[n-1]=='
23c0: 3b 27 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 53  ;' || isspace(zS
23d0: 71 6c 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  ql[n-1])) ){ n--
23e0: 3b 20 7d 0a 20 20 69 66 28 20 67 2e 62 45 78 70  ; }.  if( g.bExp
23f0: 6c 61 69 6e 20 29 20 70 72 69 6e 74 66 28 22 45  lain ) printf("E
2400: 58 50 4c 41 49 4e 20 22 29 3b 0a 20 20 70 72 69  XPLAIN ");.  pri
2410: 6e 74 66 28 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e  ntf("%.*s;\n", n
2420: 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 67  , zSql);.  if( g
2430: 2e 62 45 78 70 6c 61 69 6e 0a 23 69 66 20 53 51  .bExplain.#if SQ
2440: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
2450: 42 45 52 3e 3d 33 30 30 37 30 31 30 20 0a 20 20  BER>=3007010 .  
2460: 20 26 26 20 28 20 73 71 6c 69 74 65 33 5f 73 74   && ( sqlite3_st
2470: 72 67 6c 6f 62 28 22 43 52 45 41 54 45 20 2a 22  rglob("CREATE *"
2480: 2c 20 7a 53 71 6c 29 3d 3d 30 0a 20 20 20 20 20  , zSql)==0.     
2490: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  || sqlite3_strgl
24a0: 6f 62 28 22 44 52 4f 50 20 2a 22 2c 20 7a 53 71  ob("DROP *", zSq
24b0: 6c 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73 71  l)==0.     || sq
24c0: 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 41  lite3_strglob("A
24d0: 4c 54 45 52 20 2a 22 2c 20 7a 53 71 6c 29 3d 3d  LTER *", zSql)==
24e0: 30 0a 20 20 20 20 20 20 29 0a 23 65 6e 64 69 66  0.      ).#endif
24f0: 0a 20 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  .  ){.    printf
2500: 28 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 2c 20 7a  ("%.*s;\n", n, z
2510: 53 71 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  Sql);.  }.}../* 
2520: 52 75 6e 20 53 51 4c 20 2a 2f 0a 76 6f 69 64 20  Run SQL */.void 
2530: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
2540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2550: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2560: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2570: 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72  *zSql;.  va_star
2580: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
2590: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
25a0: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
25b0: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
25c0: 28 61 70 29 3b 0a 20 20 69 66 28 20 67 2e 62 53  (ap);.  if( g.bS
25d0: 71 6c 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 72  qlOnly ){.    pr
25e0: 69 6e 74 53 71 6c 28 7a 53 71 6c 29 3b 0a 20 20  intSql(zSql);.  
25f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
2600: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2610: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
2620: 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a 53  e3_exec(g.db, zS
2630: 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  ql, 0, 0, &zErrM
2640: 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  sg);.    if( zEr
2650: 72 4d 73 67 20 29 20 66 61 74 61 6c 5f 65 72 72  rMsg ) fatal_err
2660: 6f 72 28 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  or("SQL error: %
2670: 73 5c 6e 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  s\n%s\n", zErrMs
2680: 67 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  g, zSql);.    if
2690: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26a0: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 65  ) fatal_error("e
26b0: 78 65 63 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22  xec error: %s\n"
26c0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
26d0: 28 67 2e 64 62 29 29 3b 0a 20 20 7d 0a 20 20 73  (g.db));.  }.  s
26e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
26f0: 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 65 70 61 72 65  );.}../* Prepare
2700: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
2710: 74 20 2a 2f 0a 76 6f 69 64 20 73 70 65 65 64 74  t */.void speedt
2720: 65 73 74 31 5f 70 72 65 70 61 72 65 28 63 6f 6e  est1_prepare(con
2730: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
2740: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2750: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
2760: 71 6c 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ql;.  va_start(a
2770: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
2780: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  Sql = sqlite3_vm
2790: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
27a0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
27b0: 29 3b 0a 20 20 69 66 28 20 67 2e 62 53 71 6c 4f  );.  if( g.bSqlO
27c0: 6e 6c 79 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  nly ){.    print
27d0: 53 71 6c 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  Sql(zSql);.  }el
27e0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se{.    int rc;.
27f0: 20 20 20 20 69 66 28 20 67 2e 70 53 74 6d 74 20      if( g.pStmt 
2800: 29 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  ) sqlite3_finali
2810: 7a 65 28 67 2e 70 53 74 6d 74 29 3b 0a 20 20 20  ze(g.pStmt);.   
2820: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2830: 65 70 61 72 65 5f 76 32 28 67 2e 64 62 2c 20 7a  epare_v2(g.db, z
2840: 53 71 6c 2c 20 2d 31 2c 20 26 67 2e 70 53 74 6d  Sql, -1, &g.pStm
2850: 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 0);.    if( r
2860: 63 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c  c ){.      fatal
2870: 5f 65 72 72 6f 72 28 22 53 51 4c 20 65 72 72 6f  _error("SQL erro
2880: 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
2890: 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b  3_errmsg(g.db));
28a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
28b0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
28c0: 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 61 6e 20 53 51  .}../* Run an SQ
28d0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 72 65 76  L statement prev
28e0: 69 6f 75 73 6c 79 20 70 72 65 70 61 72 65 64 20  iously prepared 
28f0: 2a 2f 0a 76 6f 69 64 20 73 70 65 65 64 74 65 73  */.void speedtes
2900: 74 31 5f 72 75 6e 28 76 6f 69 64 29 7b 0a 20 20  t1_run(void){.  
2910: 69 6e 74 20 69 2c 20 6e 2c 20 6c 65 6e 3b 0a 20  int i, n, len;. 
2920: 20 69 66 28 20 67 2e 62 53 71 6c 4f 6e 6c 79 20   if( g.bSqlOnly 
2930: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
2940: 72 74 28 20 67 2e 70 53 74 6d 74 20 29 3b 0a 20  rt( g.pStmt );. 
2950: 20 67 2e 6e 52 65 73 75 6c 74 20 3d 20 30 3b 0a   g.nResult = 0;.
2960: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
2970: 5f 73 74 65 70 28 67 2e 70 53 74 6d 74 29 3d 3d  _step(g.pStmt)==
2980: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
2990: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f    n = sqlite3_co
29a0: 6c 75 6d 6e 5f 63 6f 75 6e 74 28 67 2e 70 53 74  lumn_count(g.pSt
29b0: 6d 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  mt);.    for(i=0
29c0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
29d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29e0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
29f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2a00: 65 78 74 28 67 2e 70 53 74 6d 74 2c 20 69 29 3b  ext(g.pStmt, i);
2a10: 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  .      if( z==0 
2a20: 29 20 7a 20 3d 20 22 6e 69 6c 22 3b 0a 20 20 20  ) z = "nil";.   
2a30: 20 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74     len = (int)st
2a40: 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 20 20 69  rlen(z);.      i
2a50: 66 28 20 67 2e 6e 52 65 73 75 6c 74 2b 6c 65 6e  f( g.nResult+len
2a60: 3c 73 69 7a 65 6f 66 28 67 2e 7a 52 65 73 75 6c  <sizeof(g.zResul
2a70: 74 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  t)-2 ){.        
2a80: 69 66 28 20 67 2e 6e 52 65 73 75 6c 74 3e 30 20  if( g.nResult>0 
2a90: 29 20 67 2e 7a 52 65 73 75 6c 74 5b 67 2e 6e 52  ) g.zResult[g.nR
2aa0: 65 73 75 6c 74 2b 2b 5d 20 3d 20 27 20 27 3b 0a  esult++] = ' ';.
2ab0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 67          memcpy(g
2ac0: 2e 7a 52 65 73 75 6c 74 20 2b 20 67 2e 6e 52 65  .zResult + g.nRe
2ad0: 73 75 6c 74 2c 20 7a 2c 20 6c 65 6e 2b 31 29 3b  sult, z, len+1);
2ae0: 0a 20 20 20 20 20 20 20 20 67 2e 6e 52 65 73 75  .        g.nResu
2af0: 6c 74 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  lt += len;.     
2b00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
2b10: 66 28 20 67 2e 62 52 65 70 72 65 70 61 72 65 20  f( g.bReprepare 
2b20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2b30: 74 6d 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 73  tmt *pNew;.    s
2b40: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2b50: 32 28 67 2e 64 62 2c 20 73 71 6c 69 74 65 33 5f  2(g.db, sqlite3_
2b60: 73 71 6c 28 67 2e 70 53 74 6d 74 29 2c 20 2d 31  sql(g.pStmt), -1
2b70: 2c 20 26 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  , &pNew, 0);.   
2b80: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2b90: 65 28 67 2e 70 53 74 6d 74 29 3b 0a 20 20 20 20  e(g.pStmt);.    
2ba0: 67 2e 70 53 74 6d 74 20 3d 20 70 4e 65 77 3b 0a  g.pStmt = pNew;.
2bb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
2bc0: 69 74 65 33 5f 72 65 73 65 74 28 67 2e 70 53 74  ite3_reset(g.pSt
2bd0: 6d 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54  mt);.  }.}../* T
2be0: 68 65 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  he sqlite3_trace
2bf0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  () callback func
2c00: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
2c10: 6f 69 64 20 74 72 61 63 65 43 61 6c 6c 62 61 63  oid traceCallbac
2c20: 6b 28 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c  k(void *NotUsed,
2c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2c40: 6c 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69  l){.  int n = (i
2c50: 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 3b  nt)strlen(zSql);
2c60: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
2c70: 20 28 7a 53 71 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27   (zSql[n-1]==';'
2c80: 20 7c 7c 20 69 73 73 70 61 63 65 28 7a 53 71 6c   || isspace(zSql
2c90: 5b 6e 2d 31 5d 29 29 20 29 20 6e 2d 2d 3b 0a 20  [n-1])) ) n--;. 
2ca0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2cb0: 22 25 2e 2a 73 3b 5c 6e 22 2c 20 6e 2c 20 7a 53  "%.*s;\n", n, zS
2cc0: 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 53 75 62 73 74  ql);.}../* Subst
2cd0: 69 74 75 74 65 20 72 61 6e 64 6f 6d 28 29 20 66  itute random() f
2ce0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 67 69 76  unction that giv
2cf0: 65 73 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  es the same rand
2d00: 6f 6d 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6f  om.** sequence o
2d10: 6e 20 65 61 63 68 20 72 75 6e 2c 20 66 6f 72 20  n each run, for 
2d20: 72 65 70 65 61 74 61 62 69 6c 69 74 79 2e 20 2a  repeatability. *
2d30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 61  /.static void ra
2d40: 6e 64 6f 6d 46 75 6e 63 28 0a 20 20 73 71 6c 69  ndomFunc(.  sqli
2d50: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
2d60: 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55  text,.  int NotU
2d70: 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  sed,.  sqlite3_v
2d80: 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32 0a  alue **NotUsed2.
2d90: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  ){.  sqlite3_res
2da0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
2db0: 74 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  t, (sqlite3_int6
2dc0: 34 29 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e  4)speedtest1_ran
2dd0: 64 6f 6d 28 29 29 3b 0a 7d 0a 0a 2f 2a 20 45 73  dom());.}../* Es
2de0: 74 69 6d 61 74 65 20 74 68 65 20 73 71 75 61 72  timate the squar
2df0: 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 74  e root of an int
2e00: 65 67 65 72 20 2a 2f 0a 73 74 61 74 69 63 20 69  eger */.static i
2e10: 6e 74 20 65 73 74 5f 73 71 75 61 72 65 5f 72 6f  nt est_square_ro
2e20: 6f 74 28 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  ot(int x){.  int
2e30: 20 79 30 20 3d 20 78 2f 32 3b 0a 20 20 69 6e 74   y0 = x/2;.  int
2e40: 20 79 31 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   y1;.  int n;.  
2e50: 66 6f 72 28 6e 3d 30 3b 20 79 30 3e 30 20 26 26  for(n=0; y0>0 &&
2e60: 20 6e 3c 31 30 3b 20 6e 2b 2b 29 7b 0a 20 20 20   n<10; n++){.   
2e70: 20 79 31 20 3d 20 28 79 30 20 2b 20 78 2f 79 30   y1 = (y0 + x/y0
2e80: 29 2f 32 3b 0a 20 20 20 20 69 66 28 20 79 31 3d  )/2;.    if( y1=
2e90: 3d 79 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  =y0 ) break;.   
2ea0: 20 79 30 20 3d 20 79 31 3b 0a 20 20 7d 0a 20 20   y0 = y1;.  }.  
2eb0: 72 65 74 75 72 6e 20 79 30 3b 0a 7d 0a 0a 2f 2a  return y0;.}../*
2ec0: 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 61 6e 64  .** The main and
2ed0: 20 64 65 66 61 75 6c 74 20 74 65 73 74 73 65 74   default testset
2ee0: 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74 73 65 74  .*/.void testset
2ef0: 5f 6d 61 69 6e 28 76 6f 69 64 29 7b 0a 20 20 69  _main(void){.  i
2f00: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f20: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2f30: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 2f 2a 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 75  /* iteration cou
2f60: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b 20  nt */.  int sz; 
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2f90: 20 74 68 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20   the tables */. 
2fa0: 20 69 6e 74 20 6d 61 78 62 3b 20 20 20 20 20 20   int maxb;      
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fc0: 2a 20 4d 61 78 69 6d 75 6d 20 73 77 69 7a 7a 6c  * Maximum swizzl
2fd0: 65 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 75 6e  ed value */.  un
2fe0: 73 69 67 6e 65 64 20 78 31 2c 20 78 32 3b 20 20  signed x1, x2;  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3000: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69  arameters */.  i
3010: 6e 74 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  nt len;         
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3030: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 4e  Length of the zN
3040: 75 6d 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  um[] string */. 
3050: 20 63 68 61 72 20 7a 4e 75 6d 5b 32 30 30 30 5d   char zNum[2000]
3060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3070: 2a 20 41 20 6e 75 6d 62 65 72 20 6e 61 6d 65 20  * A number name 
3080: 2a 2f 0a 0a 20 20 73 7a 20 3d 20 6e 20 3d 20 67  */..  sz = n = g
3090: 2e 73 7a 54 65 73 74 2a 35 30 30 3b 0a 20 20 6d  .szTest*500;.  m
30a0: 61 78 62 20 3d 20 72 6f 75 6e 64 75 70 5f 61 6c  axb = roundup_al
30b0: 6c 6f 6e 65 73 28 73 7a 29 3b 0a 20 20 73 70 65  lones(sz);.  spe
30c0: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
30d0: 73 74 28 31 30 30 2c 20 22 25 64 20 49 4e 53 45  st(100, "%d INSE
30e0: 52 54 73 20 69 6e 74 6f 20 74 61 62 6c 65 20 77  RTs into table w
30f0: 69 74 68 20 6e 6f 20 69 6e 64 65 78 22 2c 20 6e  ith no index", n
3100: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
3110: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
3120: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
3130: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  ("CREATE TABLE t
3140: 31 28 61 20 49 4e 54 45 47 45 52 20 25 73 2c 20  1(a INTEGER %s, 
3150: 62 20 49 4e 54 45 47 45 52 20 25 73 2c 20 63 20  b INTEGER %s, c 
3160: 54 45 58 54 20 25 73 29 3b 22 2c 0a 20 20 20 20  TEXT %s);",.    
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e                g.
3180: 7a 4e 4e 2c 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 4e  zNN, g.zNN, g.zN
3190: 4e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  N);.  speedtest1
31a0: 5f 70 72 65 70 61 72 65 28 22 49 4e 53 45 52 54  _prepare("INSERT
31b0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
31c0: 3f 31 2c 3f 32 2c 3f 33 29 3b 20 2d 2d 20 20 25  ?1,?2,?3); --  %
31d0: 64 20 74 69 6d 65 73 22 2c 20 6e 29 3b 0a 20 20  d times", n);.  
31e0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69  for(i=1; i<=n; i
31f0: 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73 77  ++){.    x1 = sw
3200: 69 7a 7a 6c 65 28 69 2c 6d 61 78 62 29 3b 0a 20  izzle(i,maxb);. 
3210: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75     speedtest1_nu
3220: 6d 62 65 72 6e 61 6d 65 28 78 31 2c 20 7a 4e 75  mbername(x1, zNu
3230: 6d 2c 20 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 29  m, sizeof(zNum))
3240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
3250: 6e 64 5f 69 6e 74 36 34 28 67 2e 70 53 74 6d 74  nd_int64(g.pStmt
3260: 2c 20 31 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e  , 1, (sqlite3_in
3270: 74 36 34 29 78 31 29 3b 0a 20 20 20 20 73 71 6c  t64)x1);.    sql
3280: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
3290: 70 53 74 6d 74 2c 20 32 2c 20 69 29 3b 0a 20 20  pStmt, 2, i);.  
32a0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
32b0: 65 78 74 28 67 2e 70 53 74 6d 74 2c 20 33 2c 20  ext(g.pStmt, 3, 
32c0: 7a 4e 75 6d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zNum, -1, SQLITE
32d0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 70  _STATIC);.    sp
32e0: 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a  eedtest1_run();.
32f0: 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31    }.  speedtest1
3300: 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b  _exec("COMMIT");
3310: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
3320: 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20  d_test();...  n 
3330: 3d 20 73 7a 3b 0a 20 20 73 70 65 65 64 74 65 73  = sz;.  speedtes
3340: 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 31  t1_begin_test(11
3350: 30 2c 20 22 25 64 20 6f 72 64 65 72 65 64 20 49  0, "%d ordered I
3360: 4e 53 45 52 54 53 20 77 69 74 68 20 6f 6e 65 20  NSERTS with one 
3370: 69 6e 64 65 78 2f 50 4b 22 2c 20 6e 29 3b 0a 20  index/PK", n);. 
3380: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
3390: 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65  ("BEGIN");.  spe
33a0: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 52  edtest1_exec("CR
33b0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 20  EATE TABLE t2(a 
33c0: 49 4e 54 45 47 45 52 20 25 73 20 25 73 2c 20 62  INTEGER %s %s, b
33d0: 20 49 4e 54 45 47 45 52 20 25 73 2c 20 63 20 54   INTEGER %s, c T
33e0: 45 58 54 20 25 73 29 20 25 73 22 2c 0a 20 20 20  EXT %s) %s",.   
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 67 2e 7a 4e 4e 2c 20 67 2e 7a 50 4b 2c 20 67 2e  g.zNN, g.zPK, g.
3410: 7a 4e 4e 2c 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 57  zNN, g.zNN, g.zW
3420: 52 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  R);.  speedtest1
3430: 5f 70 72 65 70 61 72 65 28 22 49 4e 53 45 52 54  _prepare("INSERT
3440: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
3450: 3f 31 2c 3f 32 2c 3f 33 29 3b 20 2d 2d 20 25 64  ?1,?2,?3); -- %d
3460: 20 74 69 6d 65 73 22 2c 20 6e 29 3b 0a 20 20 66   times", n);.  f
3470: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b  or(i=1; i<=n; i+
3480: 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73 77 69  +){.    x1 = swi
3490: 7a 7a 6c 65 28 69 2c 6d 61 78 62 29 3b 0a 20 20  zzle(i,maxb);.  
34a0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d    speedtest1_num
34b0: 62 65 72 6e 61 6d 65 28 78 31 2c 20 7a 4e 75 6d  bername(x1, zNum
34c0: 2c 20 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 29 3b  , sizeof(zNum));
34d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
34e0: 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31  d_int(g.pStmt, 1
34f0: 2c 20 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , i);.    sqlite
3500: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 67 2e 70  3_bind_int64(g.p
3510: 53 74 6d 74 2c 20 32 2c 20 28 73 71 6c 69 74 65  Stmt, 2, (sqlite
3520: 33 5f 69 6e 74 36 34 29 78 31 29 3b 0a 20 20 20  3_int64)x1);.   
3530: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
3540: 78 74 28 67 2e 70 53 74 6d 74 2c 20 33 2c 20 7a  xt(g.pStmt, 3, z
3550: 4e 75 6d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Num, -1, SQLITE_
3560: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 70 65  STATIC);.    spe
3570: 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20  edtest1_run();. 
3580: 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f   }.  speedtest1_
3590: 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b 0a  exec("COMMIT");.
35a0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64    speedtest1_end
35b0: 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20 3d  _test();...  n =
35c0: 20 73 7a 3b 0a 20 20 73 70 65 65 64 74 65 73 74   sz;.  speedtest
35d0: 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 32 30  1_begin_test(120
35e0: 2c 20 22 25 64 20 75 6e 6f 72 64 65 72 65 64 20  , "%d unordered 
35f0: 49 4e 53 45 52 54 53 20 77 69 74 68 20 6f 6e 65  INSERTS with one
3600: 20 69 6e 64 65 78 2f 50 4b 22 2c 20 6e 29 3b 0a   index/PK", n);.
3610: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
3620: 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70  c("BEGIN");.  sp
3630: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43  eedtest1_exec("C
3640: 52 45 41 54 45 20 54 41 42 4c 45 20 74 33 28 61  REATE TABLE t3(a
3650: 20 49 4e 54 45 47 45 52 20 25 73 20 25 73 2c 20   INTEGER %s %s, 
3660: 62 20 49 4e 54 45 47 45 52 20 25 73 2c 20 63 20  b INTEGER %s, c 
3670: 54 45 58 54 20 25 73 29 20 25 73 22 2c 0a 20 20  TEXT %s) %s",.  
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 50 4b 2c 20 67   g.zNN, g.zPK, g
36a0: 2e 7a 4e 4e 2c 20 67 2e 7a 4e 4e 2c 20 67 2e 7a  .zNN, g.zNN, g.z
36b0: 57 52 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  WR);.  speedtest
36c0: 31 5f 70 72 65 70 61 72 65 28 22 49 4e 53 45 52  1_prepare("INSER
36d0: 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53  T INTO t3 VALUES
36e0: 28 3f 31 2c 3f 32 2c 3f 33 29 3b 20 2d 2d 20 25  (?1,?2,?3); -- %
36f0: 64 20 74 69 6d 65 73 22 2c 20 6e 29 3b 0a 20 20  d times", n);.  
3700: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69  for(i=1; i<=n; i
3710: 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73 77  ++){.    x1 = sw
3720: 69 7a 7a 6c 65 28 69 2c 6d 61 78 62 29 3b 0a 20  izzle(i,maxb);. 
3730: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75     speedtest1_nu
3740: 6d 62 65 72 6e 61 6d 65 28 78 31 2c 20 7a 4e 75  mbername(x1, zNu
3750: 6d 2c 20 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 29  m, sizeof(zNum))
3760: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
3770: 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20  nd_int(g.pStmt, 
3780: 32 2c 20 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  2, i);.    sqlit
3790: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 67 2e  e3_bind_int64(g.
37a0: 70 53 74 6d 74 2c 20 31 2c 20 28 73 71 6c 69 74  pStmt, 1, (sqlit
37b0: 65 33 5f 69 6e 74 36 34 29 78 31 29 3b 0a 20 20  e3_int64)x1);.  
37c0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
37d0: 65 78 74 28 67 2e 70 53 74 6d 74 2c 20 33 2c 20  ext(g.pStmt, 3, 
37e0: 7a 4e 75 6d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zNum, -1, SQLITE
37f0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 70  _STATIC);.    sp
3800: 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a  eedtest1_run();.
3810: 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31    }.  speedtest1
3820: 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b  _exec("COMMIT");
3830: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
3840: 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20  d_test();...  n 
3850: 3d 20 32 35 3b 0a 20 20 73 70 65 65 64 74 65 73  = 25;.  speedtes
3860: 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 33  t1_begin_test(13
3870: 30 2c 20 22 25 64 20 53 45 4c 45 43 54 53 2c 20  0, "%d SELECTS, 
3880: 6e 75 6d 65 72 69 63 20 42 45 54 57 45 45 4e 2c  numeric BETWEEN,
3890: 20 75 6e 69 6e 64 65 78 65 64 22 2c 20 6e 29 3b   unindexed", n);
38a0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
38b0: 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73  ec("BEGIN");.  s
38c0: 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72  peedtest1_prepar
38d0: 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54 20 63  e(.    "SELECT c
38e0: 6f 75 6e 74 28 2a 29 2c 20 61 76 67 28 62 29 2c  ount(*), avg(b),
38f0: 20 73 75 6d 28 6c 65 6e 67 74 68 28 63 29 29 20   sum(length(c)) 
3900: 46 52 4f 4d 20 74 31 5c 6e 22 0a 20 20 20 20 22  FROM t1\n".    "
3910: 20 57 48 45 52 45 20 62 20 42 45 54 57 45 45 4e   WHERE b BETWEEN
3920: 20 3f 31 20 41 4e 44 20 3f 32 3b 20 2d 2d 20 25   ?1 AND ?2; -- %
3930: 64 20 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b  d times", n.  );
3940: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
3950: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d  ; i++){.    x1 =
3960: 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64   speedtest1_rand
3970: 6f 6d 28 29 25 6d 61 78 62 3b 0a 20 20 20 20 78  om()%maxb;.    x
3980: 32 20 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72  2 = speedtest1_r
3990: 61 6e 64 6f 6d 28 29 25 31 30 20 2b 20 73 7a 2f  andom()%10 + sz/
39a0: 35 30 30 30 20 2b 20 78 31 3b 0a 20 20 20 20 73  5000 + x1;.    s
39b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
39c0: 67 2e 70 53 74 6d 74 2c 20 31 2c 20 78 31 29 3b  g.pStmt, 1, x1);
39d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
39e0: 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 32  d_int(g.pStmt, 2
39f0: 2c 20 78 32 29 3b 0a 20 20 20 20 73 70 65 65 64  , x2);.    speed
3a00: 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 7d  test1_run();.  }
3a10: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
3a20: 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20  ec("COMMIT");.  
3a30: 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74  speedtest1_end_t
3a40: 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20 3d 20 31  est();...  n = 1
3a50: 30 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  0;.  speedtest1_
3a60: 62 65 67 69 6e 5f 74 65 73 74 28 31 34 30 2c 20  begin_test(140, 
3a70: 22 25 64 20 53 45 4c 45 43 54 53 2c 20 4c 49 4b  "%d SELECTS, LIK
3a80: 45 2c 20 75 6e 69 6e 64 65 78 65 64 22 2c 20 6e  E, unindexed", n
3a90: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
3aa0: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
3ab0: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
3ac0: 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54  are(.    "SELECT
3ad0: 20 63 6f 75 6e 74 28 2a 29 2c 20 61 76 67 28 62   count(*), avg(b
3ae0: 29 2c 20 73 75 6d 28 6c 65 6e 67 74 68 28 63 29  ), sum(length(c)
3af0: 29 20 46 52 4f 4d 20 74 31 5c 6e 22 0a 20 20 20  ) FROM t1\n".   
3b00: 20 22 20 57 48 45 52 45 20 63 20 4c 49 4b 45 20   " WHERE c LIKE 
3b10: 3f 31 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73 22  ?1; -- %d times"
3b20: 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69  , n.  );.  for(i
3b30: 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a  =1; i<=n; i++){.
3b40: 20 20 20 20 78 31 20 3d 20 73 70 65 65 64 74 65      x1 = speedte
3b50: 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 6d 61 78  st1_random()%max
3b60: 62 3b 0a 20 20 20 20 7a 4e 75 6d 5b 30 5d 20 3d  b;.    zNum[0] =
3b70: 20 27 25 27 3b 0a 20 20 20 20 6c 65 6e 20 3d 20   '%';.    len = 
3b80: 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d 62 65  speedtest1_numbe
3b90: 72 6e 61 6d 65 28 69 2c 20 7a 4e 75 6d 2b 31 2c  rname(i, zNum+1,
3ba0: 20 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2d 32 29   sizeof(zNum)-2)
3bb0: 3b 0a 20 20 20 20 7a 4e 75 6d 5b 6c 65 6e 5d 20  ;.    zNum[len] 
3bc0: 3d 20 27 25 27 3b 0a 20 20 20 20 7a 4e 75 6d 5b  = '%';.    zNum[
3bd0: 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  len+1] = 0;.    
3be0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
3bf0: 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 7a 4e  t(g.pStmt, 1, zN
3c00: 75 6d 2c 20 6c 65 6e 2c 20 53 51 4c 49 54 45 5f  um, len, SQLITE_
3c10: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 70 65  STATIC);.    spe
3c20: 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20  edtest1_run();. 
3c30: 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f   }.  speedtest1_
3c40: 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b 0a  exec("COMMIT");.
3c50: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64    speedtest1_end
3c60: 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20 3d  _test();...  n =
3c70: 20 31 30 3b 0a 20 20 73 70 65 65 64 74 65 73 74   10;.  speedtest
3c80: 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 34 32  1_begin_test(142
3c90: 2c 20 22 25 64 20 53 45 4c 45 43 54 53 20 77 2f  , "%d SELECTS w/
3ca0: 4f 52 44 45 52 20 42 59 2c 20 75 6e 69 6e 64 65  ORDER BY, uninde
3cb0: 78 65 64 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65  xed", n);.  spee
3cc0: 64 74 65 73 74 31 5f 65 78 65 63 28 22 42 45 47  dtest1_exec("BEG
3cd0: 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IN");.  speedtes
3ce0: 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20  t1_prepare(.    
3cf0: 22 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  "SELECT a, b, c 
3d00: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 63 20  FROM t1 WHERE c 
3d10: 4c 49 4b 45 20 3f 31 5c 6e 22 0a 20 20 20 20 22  LIKE ?1\n".    "
3d20: 20 4f 52 44 45 52 20 42 59 20 61 3b 20 2d 2d 20   ORDER BY a; -- 
3d30: 25 64 20 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29  %d times", n.  )
3d40: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
3d50: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20  n; i++){.    x1 
3d60: 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e  = speedtest1_ran
3d70: 64 6f 6d 28 29 25 6d 61 78 62 3b 0a 20 20 20 20  dom()%maxb;.    
3d80: 7a 4e 75 6d 5b 30 5d 20 3d 20 27 25 27 3b 0a 20  zNum[0] = '%';. 
3d90: 20 20 20 6c 65 6e 20 3d 20 73 70 65 65 64 74 65     len = speedte
3da0: 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 69  st1_numbername(i
3db0: 2c 20 7a 4e 75 6d 2b 31 2c 20 73 69 7a 65 6f 66  , zNum+1, sizeof
3dc0: 28 7a 4e 75 6d 29 2d 32 29 3b 0a 20 20 20 20 7a  (zNum)-2);.    z
3dd0: 4e 75 6d 5b 6c 65 6e 5d 20 3d 20 27 25 27 3b 0a  Num[len] = '%';.
3de0: 20 20 20 20 7a 4e 75 6d 5b 6c 65 6e 2b 31 5d 20      zNum[len+1] 
3df0: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
3e00: 5f 62 69 6e 64 5f 74 65 78 74 28 67 2e 70 53 74  _bind_text(g.pSt
3e10: 6d 74 2c 20 31 2c 20 7a 4e 75 6d 2c 20 6c 65 6e  mt, 1, zNum, len
3e20: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
3e30: 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  ;.    speedtest1
3e40: 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70  _run();.  }.  sp
3e50: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43  eedtest1_exec("C
3e60: 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64  OMMIT");.  speed
3e70: 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29  test1_end_test()
3e80: 3b 0a 0a 20 20 6e 20 3d 20 31 30 3b 20 2f 2f 67  ;..  n = 10; //g
3e90: 2e 73 7a 54 65 73 74 2f 35 3b 0a 20 20 73 70 65  .szTest/5;.  spe
3ea0: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
3eb0: 73 74 28 31 34 35 2c 20 22 25 64 20 53 45 4c 45  st(145, "%d SELE
3ec0: 43 54 53 20 77 2f 4f 52 44 45 52 20 42 59 20 61  CTS w/ORDER BY a
3ed0: 6e 64 20 4c 49 4d 49 54 2c 20 75 6e 69 6e 64 65  nd LIMIT, uninde
3ee0: 78 65 64 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65  xed", n);.  spee
3ef0: 64 74 65 73 74 31 5f 65 78 65 63 28 22 42 45 47  dtest1_exec("BEG
3f00: 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IN");.  speedtes
3f10: 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20  t1_prepare(.    
3f20: 22 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20  "SELECT a, b, c 
3f30: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 63 20  FROM t1 WHERE c 
3f40: 4c 49 4b 45 20 3f 31 5c 6e 22 0a 20 20 20 20 22  LIKE ?1\n".    "
3f50: 20 4f 52 44 45 52 20 42 59 20 61 20 4c 49 4d 49   ORDER BY a LIMI
3f60: 54 20 31 30 3b 20 2d 2d 20 25 64 20 74 69 6d 65  T 10; -- %d time
3f70: 73 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72  s", n.  );.  for
3f80: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
3f90: 7b 0a 20 20 20 20 78 31 20 3d 20 73 70 65 65 64  {.    x1 = speed
3fa0: 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 6d  test1_random()%m
3fb0: 61 78 62 3b 0a 20 20 20 20 7a 4e 75 6d 5b 30 5d  axb;.    zNum[0]
3fc0: 20 3d 20 27 25 27 3b 0a 20 20 20 20 6c 65 6e 20   = '%';.    len 
3fd0: 3d 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d  = speedtest1_num
3fe0: 62 65 72 6e 61 6d 65 28 69 2c 20 7a 4e 75 6d 2b  bername(i, zNum+
3ff0: 31 2c 20 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2d  1, sizeof(zNum)-
4000: 32 29 3b 0a 20 20 20 20 7a 4e 75 6d 5b 6c 65 6e  2);.    zNum[len
4010: 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20 7a 4e 75  ] = '%';.    zNu
4020: 6d 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20  m[len+1] = 0;.  
4030: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
4040: 65 78 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20  ext(g.pStmt, 1, 
4050: 7a 4e 75 6d 2c 20 6c 65 6e 2c 20 53 51 4c 49 54  zNum, len, SQLIT
4060: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
4070: 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b  peedtest1_run();
4080: 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74  .  }.  speedtest
4090: 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29  1_exec("COMMIT")
40a0: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
40b0: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 73  nd_test();...  s
40c0: 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f  peedtest1_begin_
40d0: 74 65 73 74 28 31 35 30 2c 20 22 43 52 45 41 54  test(150, "CREAT
40e0: 45 20 49 4e 44 45 58 20 66 69 76 65 20 74 69 6d  E INDEX five tim
40f0: 65 73 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  es");.  speedtes
4100: 74 31 5f 65 78 65 63 28 22 42 45 47 49 4e 3b 22  t1_exec("BEGIN;"
4110: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
4120: 65 78 65 63 28 22 43 52 45 41 54 45 20 55 4e 49  exec("CREATE UNI
4130: 51 55 45 20 49 4e 44 45 58 20 74 31 62 20 4f 4e  QUE INDEX t1b ON
4140: 20 74 31 28 62 29 3b 22 29 3b 0a 20 20 73 70 65   t1(b);");.  spe
4150: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 52  edtest1_exec("CR
4160: 45 41 54 45 20 49 4e 44 45 58 20 74 31 63 20 4f  EATE INDEX t1c O
4170: 4e 20 74 31 28 63 29 3b 22 29 3b 0a 20 20 73 70  N t1(c);");.  sp
4180: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43  eedtest1_exec("C
4190: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
41a0: 45 58 20 74 32 62 20 4f 4e 20 74 32 28 62 29 3b  EX t2b ON t2(b);
41b0: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
41c0: 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 49 4e  _exec("CREATE IN
41d0: 44 45 58 20 74 32 63 20 4f 4e 20 74 32 28 63 20  DEX t2c ON t2(c 
41e0: 44 45 53 43 29 3b 22 29 3b 0a 20 20 73 70 65 65  DESC);");.  spee
41f0: 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 52 45  dtest1_exec("CRE
4200: 41 54 45 20 49 4e 44 45 58 20 74 33 62 63 20 4f  ATE INDEX t3bc O
4210: 4e 20 74 33 28 62 2c 63 29 3b 22 29 3b 0a 20 20  N t3(b,c);");.  
4220: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
4230: 22 43 4f 4d 4d 49 54 3b 22 29 3b 0a 20 20 73 70  "COMMIT;");.  sp
4240: 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73  eedtest1_end_tes
4250: 74 28 29 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 2f  t();...  n = sz/
4260: 35 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  5;.  speedtest1_
4270: 62 65 67 69 6e 5f 74 65 73 74 28 31 36 30 2c 20  begin_test(160, 
4280: 22 25 64 20 53 45 4c 45 43 54 53 2c 20 6e 75 6d  "%d SELECTS, num
4290: 65 72 69 63 20 42 45 54 57 45 45 4e 2c 20 69 6e  eric BETWEEN, in
42a0: 64 65 78 65 64 22 2c 20 6e 29 3b 0a 20 20 73 70  dexed", n);.  sp
42b0: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 42  eedtest1_exec("B
42c0: 45 47 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74  EGIN");.  speedt
42d0: 65 73 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20  est1_prepare(.  
42e0: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
42f0: 2a 29 2c 20 61 76 67 28 62 29 2c 20 73 75 6d 28  *), avg(b), sum(
4300: 6c 65 6e 67 74 68 28 63 29 29 20 46 52 4f 4d 20  length(c)) FROM 
4310: 74 31 5c 6e 22 0a 20 20 20 20 22 20 57 48 45 52  t1\n".    " WHER
4320: 45 20 62 20 42 45 54 57 45 45 4e 20 3f 31 20 41  E b BETWEEN ?1 A
4330: 4e 44 20 3f 32 3b 20 2d 2d 20 25 64 20 74 69 6d  ND ?2; -- %d tim
4340: 65 73 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f  es", n.  );.  fo
4350: 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b  r(i=1; i<=n; i++
4360: 29 7b 0a 20 20 20 20 78 31 20 3d 20 73 70 65 65  ){.    x1 = spee
4370: 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25  dtest1_random()%
4380: 6d 61 78 62 3b 0a 20 20 20 20 78 32 20 3d 20 73  maxb;.    x2 = s
4390: 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d  peedtest1_random
43a0: 28 29 25 31 30 20 2b 20 73 7a 2f 35 30 30 30 20  ()%10 + sz/5000 
43b0: 2b 20 78 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  + x1;.    sqlite
43c0: 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74  3_bind_int(g.pSt
43d0: 6d 74 2c 20 31 2c 20 78 31 29 3b 0a 20 20 20 20  mt, 1, x1);.    
43e0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
43f0: 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 78 32 29  (g.pStmt, 2, x2)
4400: 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  ;.    speedtest1
4410: 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70  _run();.  }.  sp
4420: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43  eedtest1_exec("C
4430: 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64  OMMIT");.  speed
4440: 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29  test1_end_test()
4450: 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 2f 35 3b 0a  ;...  n = sz/5;.
4460: 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67    speedtest1_beg
4470: 69 6e 5f 74 65 73 74 28 31 36 31 2c 20 22 25 64  in_test(161, "%d
4480: 20 53 45 4c 45 43 54 53 2c 20 6e 75 6d 65 72 69   SELECTS, numeri
4490: 63 20 42 45 54 57 45 45 4e 2c 20 50 4b 22 2c 20  c BETWEEN, PK", 
44a0: 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  n);.  speedtest1
44b0: 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a  _exec("BEGIN");.
44c0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65    speedtest1_pre
44d0: 70 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43  pare(.    "SELEC
44e0: 54 20 63 6f 75 6e 74 28 2a 29 2c 20 61 76 67 28  T count(*), avg(
44f0: 62 29 2c 20 73 75 6d 28 6c 65 6e 67 74 68 28 63  b), sum(length(c
4500: 29 29 20 46 52 4f 4d 20 74 32 5c 6e 22 0a 20 20  )) FROM t2\n".  
4510: 20 20 22 20 57 48 45 52 45 20 61 20 42 45 54 57    " WHERE a BETW
4520: 45 45 4e 20 3f 31 20 41 4e 44 20 3f 32 3b 20 2d  EEN ?1 AND ?2; -
4530: 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e 0a 20  - %d times", n. 
4540: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
4550: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78  <=n; i++){.    x
4560: 31 20 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72  1 = speedtest1_r
4570: 61 6e 64 6f 6d 28 29 25 6d 61 78 62 3b 0a 20 20  andom()%maxb;.  
4580: 20 20 78 32 20 3d 20 73 70 65 65 64 74 65 73 74    x2 = speedtest
4590: 31 5f 72 61 6e 64 6f 6d 28 29 25 31 30 20 2b 20  1_random()%10 + 
45a0: 73 7a 2f 35 30 30 30 20 2b 20 78 31 3b 0a 20 20  sz/5000 + x1;.  
45b0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
45c0: 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 78  nt(g.pStmt, 1, x
45d0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
45e0: 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74  bind_int(g.pStmt
45f0: 2c 20 32 2c 20 78 32 29 3b 0a 20 20 20 20 73 70  , 2, x2);.    sp
4600: 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a  eedtest1_run();.
4610: 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31    }.  speedtest1
4620: 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b  _exec("COMMIT");
4630: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
4640: 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20  d_test();...  n 
4650: 3d 20 73 7a 2f 35 3b 0a 20 20 73 70 65 65 64 74  = sz/5;.  speedt
4660: 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28  est1_begin_test(
4670: 31 37 30 2c 20 22 25 64 20 53 45 4c 45 43 54 53  170, "%d SELECTS
4680: 2c 20 74 65 78 74 20 42 45 54 57 45 45 4e 2c 20  , text BETWEEN, 
4690: 69 6e 64 65 78 65 64 22 2c 20 6e 29 3b 0a 20 20  indexed", n);.  
46a0: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
46b0: 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65 65  "BEGIN");.  spee
46c0: 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 0a  dtest1_prepare(.
46d0: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
46e0: 74 28 2a 29 2c 20 61 76 67 28 62 29 2c 20 73 75  t(*), avg(b), su
46f0: 6d 28 6c 65 6e 67 74 68 28 63 29 29 20 46 52 4f  m(length(c)) FRO
4700: 4d 20 74 31 5c 6e 22 0a 20 20 20 20 22 20 57 48  M t1\n".    " WH
4710: 45 52 45 20 63 20 42 45 54 57 45 45 4e 20 3f 31  ERE c BETWEEN ?1
4720: 20 41 4e 44 20 28 3f 31 7c 7c 27 7e 27 29 3b 20   AND (?1||'~'); 
4730: 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e 0a  -- %d times", n.
4740: 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20    );.  for(i=1; 
4750: 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=n; i++){.    
4760: 78 31 20 3d 20 73 77 69 7a 7a 6c 65 28 69 2c 20  x1 = swizzle(i, 
4770: 6d 61 78 62 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  maxb);.    len =
4780: 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d 62   speedtest1_numb
4790: 65 72 6e 61 6d 65 28 78 31 2c 20 7a 4e 75 6d 2c  ername(x1, zNum,
47a0: 20 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2d 31 29   sizeof(zNum)-1)
47b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
47c0: 6e 64 5f 74 65 78 74 28 67 2e 70 53 74 6d 74 2c  nd_text(g.pStmt,
47d0: 20 31 2c 20 7a 4e 75 6d 2c 20 6c 65 6e 2c 20 53   1, zNum, len, S
47e0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
47f0: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75     speedtest1_ru
4800: 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64  n();.  }.  speed
4810: 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d  test1_exec("COMM
4820: 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IT");.  speedtes
4830: 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a  t1_end_test();..
4840: 20 20 6e 20 3d 20 73 7a 3b 0a 20 20 73 70 65 65    n = sz;.  spee
4850: 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73  dtest1_begin_tes
4860: 74 28 31 38 30 2c 20 22 25 64 20 49 4e 53 45 52  t(180, "%d INSER
4870: 54 53 20 77 69 74 68 20 74 68 72 65 65 20 69 6e  TS with three in
4880: 64 65 78 65 73 22 2c 20 6e 29 3b 0a 20 20 73 70  dexes", n);.  sp
4890: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 42  eedtest1_exec("B
48a0: 45 47 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74  EGIN");.  speedt
48b0: 65 73 74 31 5f 65 78 65 63 28 0a 20 20 20 20 22  est1_exec(.    "
48c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 34 28  CREATE TABLE t4(
48d0: 5c 6e 22 0a 20 20 20 20 22 20 20 61 20 49 4e 54  \n".    "  a INT
48e0: 45 47 45 52 20 25 73 20 25 73 2c 5c 6e 22 0a 20  EGER %s %s,\n". 
48f0: 20 20 20 22 20 20 62 20 49 4e 54 45 47 45 52 20     "  b INTEGER 
4900: 25 73 2c 5c 6e 22 0a 20 20 20 20 22 20 20 63 20  %s,\n".    "  c 
4910: 54 45 58 54 20 25 73 5c 6e 22 0a 20 20 20 20 22  TEXT %s\n".    "
4920: 29 20 25 73 22 2c 0a 20 20 20 20 67 2e 7a 4e 4e  ) %s",.    g.zNN
4930: 2c 20 67 2e 7a 50 4b 2c 20 67 2e 7a 4e 4e 2c 20  , g.zPK, g.zNN, 
4940: 67 2e 7a 4e 4e 2c 20 67 2e 7a 57 52 29 3b 0a 20  g.zNN, g.zWR);. 
4950: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
4960: 28 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 74  ("CREATE INDEX t
4970: 34 62 20 4f 4e 20 74 34 28 62 29 22 29 3b 0a 20  4b ON t4(b)");. 
4980: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
4990: 28 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 74  ("CREATE INDEX t
49a0: 34 63 20 4f 4e 20 74 34 28 63 29 22 29 3b 0a 20  4c ON t4(c)");. 
49b0: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
49c0: 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 34  ("INSERT INTO t4
49d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
49e0: 31 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  1");.  speedtest
49f0: 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29  1_exec("COMMIT")
4a00: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
4a10: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 6e 20  nd_test();..  n 
4a20: 3d 20 73 7a 3b 0a 20 20 73 70 65 65 64 74 65 73  = sz;.  speedtes
4a30: 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 39  t1_begin_test(19
4a40: 30 2c 20 22 44 45 4c 45 54 45 20 61 6e 64 20 52  0, "DELETE and R
4a50: 45 46 49 4c 4c 20 6f 6e 65 20 74 61 62 6c 65 22  EFILL one table"
4a60: 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73  , n);.  speedtes
4a70: 74 31 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20  t1_exec("DELETE 
4a80: 46 52 4f 4d 20 74 32 3b 22 29 3b 0a 20 20 73 70  FROM t2;");.  sp
4a90: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 49  eedtest1_exec("I
4aa0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
4ab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 22  LECT * FROM t1;"
4ac0: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
4ad0: 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20  end_test();...  
4ae0: 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e  speedtest1_begin
4af0: 5f 74 65 73 74 28 32 30 30 2c 20 22 56 41 43 55  _test(200, "VACU
4b00: 55 4d 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  UM");.  speedtes
4b10: 74 31 5f 65 78 65 63 28 22 56 41 43 55 55 4d 22  t1_exec("VACUUM"
4b20: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
4b30: 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20  end_test();...  
4b40: 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e  speedtest1_begin
4b50: 5f 74 65 73 74 28 32 31 30 2c 20 22 41 4c 54 45  _test(210, "ALTE
4b60: 52 20 54 41 42 4c 45 20 41 44 44 20 43 4f 4c 55  R TABLE ADD COLU
4b70: 4d 4e 2c 20 61 6e 64 20 71 75 65 72 79 22 29 3b  MN, and query");
4b80: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
4b90: 65 63 28 22 41 4c 54 45 52 20 54 41 42 4c 45 20  ec("ALTER TABLE 
4ba0: 74 32 20 41 44 44 20 43 4f 4c 55 4d 4e 20 64 20  t2 ADD COLUMN d 
4bb0: 44 45 46 41 55 4c 54 20 31 32 33 22 29 3b 0a 20  DEFAULT 123");. 
4bc0: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
4bd0: 28 22 53 45 4c 45 43 54 20 73 75 6d 28 64 29 20  ("SELECT sum(d) 
4be0: 46 52 4f 4d 20 74 32 22 29 3b 0a 20 20 73 70 65  FROM t2");.  spe
4bf0: 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74  edtest1_end_test
4c00: 28 29 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 2f 35  ();...  n = sz/5
4c10: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62  ;.  speedtest1_b
4c20: 65 67 69 6e 5f 74 65 73 74 28 32 33 30 2c 20 22  egin_test(230, "
4c30: 25 64 20 55 50 44 41 54 45 53 2c 20 6e 75 6d 65  %d UPDATES, nume
4c40: 72 69 63 20 42 45 54 57 45 45 4e 2c 20 69 6e 64  ric BETWEEN, ind
4c50: 65 78 65 64 22 2c 20 6e 29 3b 0a 20 20 73 70 65  exed", n);.  spe
4c60: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 42 45  edtest1_exec("BE
4c70: 47 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65  GIN");.  speedte
4c80: 73 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20  st1_prepare(.   
4c90: 20 22 55 50 44 41 54 45 20 74 32 20 53 45 54 20   "UPDATE t2 SET 
4ca0: 64 3d 62 2a 32 20 57 48 45 52 45 20 62 20 42 45  d=b*2 WHERE b BE
4cb0: 54 57 45 45 4e 20 3f 31 20 41 4e 44 20 3f 32 3b  TWEEN ?1 AND ?2;
4cc0: 20 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e   -- %d times", n
4cd0: 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  .  );.  for(i=1;
4ce0: 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=n; i++){.   
4cf0: 20 78 31 20 3d 20 73 70 65 65 64 74 65 73 74 31   x1 = speedtest1
4d00: 5f 72 61 6e 64 6f 6d 28 29 25 6d 61 78 62 3b 0a  _random()%maxb;.
4d10: 20 20 20 20 78 32 20 3d 20 73 70 65 65 64 74 65      x2 = speedte
4d20: 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 31 30 20  st1_random()%10 
4d30: 2b 20 73 7a 2f 35 30 30 30 20 2b 20 78 31 3b 0a  + sz/5000 + x1;.
4d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
4d50: 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c  _int(g.pStmt, 1,
4d60: 20 78 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   x1);.    sqlite
4d70: 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74  3_bind_int(g.pSt
4d80: 6d 74 2c 20 32 2c 20 78 32 29 3b 0a 20 20 20 20  mt, 2, x2);.    
4d90: 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29  speedtest1_run()
4da0: 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73  ;.  }.  speedtes
4db0: 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22  t1_exec("COMMIT"
4dc0: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
4dd0: 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20  end_test();...  
4de0: 6e 20 3d 20 73 7a 3b 0a 20 20 73 70 65 65 64 74  n = sz;.  speedt
4df0: 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28  est1_begin_test(
4e00: 32 34 30 2c 20 22 25 64 20 55 50 44 41 54 45 53  240, "%d UPDATES
4e10: 20 6f 66 20 69 6e 64 69 76 69 64 75 61 6c 20 72   of individual r
4e20: 6f 77 73 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65  ows", n);.  spee
4e30: 64 74 65 73 74 31 5f 65 78 65 63 28 22 42 45 47  dtest1_exec("BEG
4e40: 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IN");.  speedtes
4e50: 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20  t1_prepare(.    
4e60: 22 55 50 44 41 54 45 20 74 32 20 53 45 54 20 64  "UPDATE t2 SET d
4e70: 3d 62 2a 33 20 57 48 45 52 45 20 61 3d 3f 31 3b  =b*3 WHERE a=?1;
4e80: 20 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e   -- %d times", n
4e90: 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  .  );.  for(i=1;
4ea0: 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=n; i++){.   
4eb0: 20 78 31 20 3d 20 73 70 65 65 64 74 65 73 74 31   x1 = speedtest1
4ec0: 5f 72 61 6e 64 6f 6d 28 29 25 73 7a 20 2b 20 31  _random()%sz + 1
4ed0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
4ee0: 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20  nd_int(g.pStmt, 
4ef0: 31 2c 20 78 31 29 3b 0a 20 20 20 20 73 70 65 65  1, x1);.    spee
4f00: 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20  dtest1_run();.  
4f10: 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  }.  speedtest1_e
4f20: 78 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b 0a 20  xec("COMMIT");. 
4f30: 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f   speedtest1_end_
4f40: 74 65 73 74 28 29 3b 0a 0a 20 20 73 70 65 65 64  test();..  speed
4f50: 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74  test1_begin_test
4f60: 28 32 35 30 2c 20 22 4f 6e 65 20 62 69 67 20 55  (250, "One big U
4f70: 50 44 41 54 45 20 6f 66 20 74 68 65 20 77 68 6f  PDATE of the who
4f80: 6c 65 20 25 64 2d 72 6f 77 20 74 61 62 6c 65 22  le %d-row table"
4f90: 2c 20 73 7a 29 3b 0a 20 20 73 70 65 65 64 74 65  , sz);.  speedte
4fa0: 73 74 31 5f 65 78 65 63 28 22 55 50 44 41 54 45  st1_exec("UPDATE
4fb0: 20 74 32 20 53 45 54 20 64 3d 62 2a 34 22 29 3b   t2 SET d=b*4");
4fc0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
4fd0: 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 73 70  d_test();...  sp
4fe0: 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74  eedtest1_begin_t
4ff0: 65 73 74 28 32 36 30 2c 20 22 51 75 65 72 79 20  est(260, "Query 
5000: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 61 66 74  added column aft
5010: 65 72 20 66 69 6c 6c 69 6e 67 22 29 3b 0a 20 20  er filling");.  
5020: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
5030: 22 53 45 4c 45 43 54 20 73 75 6d 28 64 29 20 46  "SELECT sum(d) F
5040: 52 4f 4d 20 74 32 22 29 3b 0a 20 20 73 70 65 65  ROM t2");.  spee
5050: 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28  dtest1_end_test(
5060: 29 3b 0a 0a 0a 0a 20 20 6e 20 3d 20 73 7a 2f 35  );....  n = sz/5
5070: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62  ;.  speedtest1_b
5080: 65 67 69 6e 5f 74 65 73 74 28 32 37 30 2c 20 22  egin_test(270, "
5090: 25 64 20 44 45 4c 45 54 45 73 2c 20 6e 75 6d 65  %d DELETEs, nume
50a0: 72 69 63 20 42 45 54 57 45 45 4e 2c 20 69 6e 64  ric BETWEEN, ind
50b0: 65 78 65 64 22 2c 20 6e 29 3b 0a 20 20 73 70 65  exed", n);.  spe
50c0: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 42 45  edtest1_exec("BE
50d0: 47 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65  GIN");.  speedte
50e0: 73 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20  st1_prepare(.   
50f0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32   "DELETE FROM t2
5100: 20 57 48 45 52 45 20 62 20 42 45 54 57 45 45 4e   WHERE b BETWEEN
5110: 20 3f 31 20 41 4e 44 20 3f 32 3b 20 2d 2d 20 25   ?1 AND ?2; -- %
5120: 64 20 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b  d times", n.  );
5130: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
5140: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d  ; i++){.    x1 =
5150: 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64   speedtest1_rand
5160: 6f 6d 28 29 25 6d 61 78 62 20 2b 20 31 3b 0a 20  om()%maxb + 1;. 
5170: 20 20 20 78 32 20 3d 20 73 70 65 65 64 74 65 73     x2 = speedtes
5180: 74 31 5f 72 61 6e 64 6f 6d 28 29 25 31 30 20 2b  t1_random()%10 +
5190: 20 73 7a 2f 35 30 30 30 20 2b 20 78 31 3b 0a 20   sz/5000 + x1;. 
51a0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
51b0: 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20  int(g.pStmt, 1, 
51c0: 78 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  x1);.    sqlite3
51d0: 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d  _bind_int(g.pStm
51e0: 74 2c 20 32 2c 20 78 32 29 3b 0a 20 20 20 20 73  t, 2, x2);.    s
51f0: 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b  peedtest1_run();
5200: 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74  .  }.  speedtest
5210: 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29  1_exec("COMMIT")
5220: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
5230: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e  nd_test();...  n
5240: 20 3d 20 73 7a 3b 0a 20 20 73 70 65 65 64 74 65   = sz;.  speedte
5250: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 32  st1_begin_test(2
5260: 38 30 2c 20 22 25 64 20 44 45 4c 45 54 45 73 20  80, "%d DELETEs 
5270: 6f 66 20 69 6e 64 69 76 69 64 75 61 6c 20 72 6f  of individual ro
5280: 77 73 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64  ws", n);.  speed
5290: 74 65 73 74 31 5f 65 78 65 63 28 22 42 45 47 49  test1_exec("BEGI
52a0: 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  N");.  speedtest
52b0: 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20 22  1_prepare(.    "
52c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 33 20 57  DELETE FROM t3 W
52d0: 48 45 52 45 20 61 3d 3f 31 3b 20 2d 2d 20 25 64  HERE a=?1; -- %d
52e0: 20 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b 0a   times", n.  );.
52f0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b    for(i=1; i<=n;
5300: 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20   i++){.    x1 = 
5310: 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f  speedtest1_rando
5320: 6d 28 29 25 73 7a 20 2b 20 31 3b 0a 20 20 20 20  m()%sz + 1;.    
5330: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
5340: 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 78 31 29  (g.pStmt, 1, x1)
5350: 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  ;.    speedtest1
5360: 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70  _run();.  }.  sp
5370: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43  eedtest1_exec("C
5380: 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64  OMMIT");.  speed
5390: 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29  test1_end_test()
53a0: 3b 0a 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31  ;...  speedtest1
53b0: 5f 62 65 67 69 6e 5f 74 65 73 74 28 32 39 30 2c  _begin_test(290,
53c0: 20 22 52 65 66 69 6c 6c 20 74 77 6f 20 25 64 2d   "Refill two %d-
53d0: 72 6f 77 20 74 61 62 6c 65 73 20 75 73 69 6e 67  row tables using
53e0: 20 52 45 50 4c 41 43 45 22 2c 20 73 7a 29 3b 0a   REPLACE", sz);.
53f0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
5400: 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  c("REPLACE INTO 
5410: 74 32 28 61 2c 62 2c 63 29 20 53 45 4c 45 43 54  t2(a,b,c) SELECT
5420: 20 61 2c 62 2c 63 20 46 52 4f 4d 20 74 31 22 29   a,b,c FROM t1")
5430: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
5440: 78 65 63 28 22 52 45 50 4c 41 43 45 20 49 4e 54  xec("REPLACE INT
5450: 4f 20 74 33 28 61 2c 62 2c 63 29 20 53 45 4c 45  O t3(a,b,c) SELE
5460: 43 54 20 61 2c 62 2c 63 20 46 52 4f 4d 20 74 31  CT a,b,c FROM t1
5470: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
5480: 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20  _end_test();..  
5490: 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e  speedtest1_begin
54a0: 5f 74 65 73 74 28 33 30 30 2c 20 22 52 65 66 69  _test(300, "Refi
54b0: 6c 6c 20 61 20 25 64 2d 72 6f 77 20 74 61 62 6c  ll a %d-row tabl
54c0: 65 20 75 73 69 6e 67 20 28 62 26 31 29 3d 3d 28  e using (b&1)==(
54d0: 61 26 31 29 22 2c 20 73 7a 29 3b 0a 20 20 73 70  a&1)", sz);.  sp
54e0: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 44  eedtest1_exec("D
54f0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 22 29  ELETE FROM t2;")
5500: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
5510: 78 65 63 28 22 49 4e 53 45 52 54 20 49 4e 54 4f  xec("INSERT INTO
5520: 20 74 32 28 61 2c 62 2c 63 29 5c 6e 22 0a 20 20   t2(a,b,c)\n".  
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 22 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 20 46  " SELECT a,b,c F
5550: 52 4f 4d 20 74 31 20 20 57 48 45 52 45 20 28 62  ROM t1  WHERE (b
5560: 26 31 29 3d 3d 28 61 26 31 29 3b 22 29 3b 0a 20  &1)==(a&1);");. 
5570: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
5580: 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32  ("INSERT INTO t2
5590: 28 61 2c 62 2c 63 29 5c 6e 22 0a 20 20 20 20 20  (a,b,c)\n".     
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 53               " S
55b0: 45 4c 45 43 54 20 61 2c 62 2c 63 20 46 52 4f 4d  ELECT a,b,c FROM
55c0: 20 74 31 20 20 57 48 45 52 45 20 28 62 26 31 29   t1  WHERE (b&1)
55d0: 3c 3e 28 61 26 31 29 3b 22 29 3b 0a 20 20 73 70  <>(a&1);");.  sp
55e0: 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73  eedtest1_end_tes
55f0: 74 28 29 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 2f  t();...  n = sz/
5600: 35 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  5;.  speedtest1_
5610: 62 65 67 69 6e 5f 74 65 73 74 28 33 31 30 2c 20  begin_test(310, 
5620: 22 25 64 20 66 6f 75 72 2d 77 61 79 73 20 6a 6f  "%d four-ways jo
5630: 69 6e 73 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65  ins", n);.  spee
5640: 64 74 65 73 74 31 5f 65 78 65 63 28 22 42 45 47  dtest1_exec("BEG
5650: 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IN");.  speedtes
5660: 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20  t1_prepare(.    
5670: 22 53 45 4c 45 43 54 20 74 31 2e 63 20 46 52 4f  "SELECT t1.c FRO
5680: 4d 20 74 31 2c 20 74 32 2c 20 74 33 2c 20 74 34  M t1, t2, t3, t4
5690: 5c 6e 22 0a 20 20 20 20 22 20 57 48 45 52 45 20  \n".    " WHERE 
56a0: 74 34 2e 61 20 42 45 54 57 45 45 4e 20 3f 31 20  t4.a BETWEEN ?1 
56b0: 41 4e 44 20 3f 32 5c 6e 22 0a 20 20 20 20 22 20  AND ?2\n".    " 
56c0: 20 20 41 4e 44 20 74 33 2e 61 3d 74 34 2e 62 5c    AND t3.a=t4.b\
56d0: 6e 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20 74  n".    "   AND t
56e0: 32 2e 61 3d 74 33 2e 62 5c 6e 22 0a 20 20 20 20  2.a=t3.b\n".    
56f0: 22 20 20 20 41 4e 44 20 74 31 2e 63 3d 74 32 2e  "   AND t1.c=t2.
5700: 63 22 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d  c".  );.  for(i=
5710: 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20  1; i<=n; i++){. 
5720: 20 20 20 78 31 20 3d 20 73 70 65 65 64 74 65 73     x1 = speedtes
5730: 74 31 5f 72 61 6e 64 6f 6d 28 29 25 73 7a 20 2b  t1_random()%sz +
5740: 20 31 3b 0a 20 20 20 20 78 32 20 3d 20 73 70 65   1;.    x2 = spe
5750: 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29  edtest1_random()
5760: 25 31 30 20 2b 20 78 31 20 2b 20 34 3b 0a 20 20  %10 + x1 + 4;.  
5770: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
5780: 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 78  nt(g.pStmt, 1, x
5790: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
57a0: 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74  bind_int(g.pStmt
57b0: 2c 20 32 2c 20 78 32 29 3b 0a 20 20 20 20 73 70  , 2, x2);.    sp
57c0: 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a  eedtest1_run();.
57d0: 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31    }.  speedtest1
57e0: 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b  _exec("COMMIT");
57f0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
5800: 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 73 70 65  d_test();..  spe
5810: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
5820: 73 74 28 33 32 30 2c 20 22 73 75 62 71 75 65 72  st(320, "subquer
5830: 79 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  y in result set"
5840: 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73  , n);.  speedtes
5850: 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20  t1_prepare(.    
5860: 22 53 45 4c 45 43 54 20 73 75 6d 28 61 29 2c 20  "SELECT sum(a), 
5870: 6d 61 78 28 63 29 2c 5c 6e 22 0a 20 20 20 20 22  max(c),\n".    "
5880: 20 20 20 20 20 20 20 61 76 67 28 28 53 45 4c 45         avg((SELE
5890: 43 54 20 61 20 46 52 4f 4d 20 74 32 20 57 48 45  CT a FROM t2 WHE
58a0: 52 45 20 35 2b 74 32 2e 62 3d 74 31 2e 62 29 20  RE 5+t2.b=t1.b) 
58b0: 41 4e 44 20 72 6f 77 69 64 3c 3f 31 29 2c 20 6d  AND rowid<?1), m
58c0: 61 78 28 63 29 5c 6e 22 0a 20 20 20 20 22 20 46  ax(c)\n".    " F
58d0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77  ROM t1 WHERE row
58e0: 69 64 3c 3f 31 3b 22 0a 20 20 29 3b 0a 20 20 73  id<?1;".  );.  s
58f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
5900: 67 2e 70 53 74 6d 74 2c 20 31 2c 20 65 73 74 5f  g.pStmt, 1, est_
5910: 73 71 75 61 72 65 5f 72 6f 6f 74 28 67 2e 73 7a  square_root(g.sz
5920: 54 65 73 74 29 2a 35 30 29 3b 0a 20 20 73 70 65  Test)*50);.  spe
5930: 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20  edtest1_run();. 
5940: 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f   speedtest1_end_
5950: 74 65 73 74 28 29 3b 0a 0a 20 20 73 70 65 65 64  test();..  speed
5960: 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74  test1_begin_test
5970: 28 39 38 30 2c 20 22 50 52 41 47 4d 41 20 69 6e  (980, "PRAGMA in
5980: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22 29 3b  tegrity_check");
5990: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
59a0: 65 63 28 22 50 52 41 47 4d 41 20 69 6e 74 65 67  ec("PRAGMA integ
59b0: 72 69 74 79 5f 63 68 65 63 6b 22 29 3b 0a 20 20  rity_check");.  
59c0: 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74  speedtest1_end_t
59d0: 65 73 74 28 29 3b 0a 0a 0a 20 20 73 70 65 65 64  est();...  speed
59e0: 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74  test1_begin_test
59f0: 28 39 39 30 2c 20 22 41 4e 41 4c 59 5a 45 22 29  (990, "ANALYZE")
5a00: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
5a10: 78 65 63 28 22 41 4e 41 4c 59 5a 45 22 29 3b 0a  xec("ANALYZE");.
5a20: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64    speedtest1_end
5a30: 5f 74 65 73 74 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _test();.}../*.*
5a40: 2a 20 41 20 74 65 73 74 73 65 74 20 66 6f 72 20  * A testset for 
5a50: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
5a60: 72 65 73 73 69 6f 6e 73 2e 20 20 54 68 69 73 20  ressions.  This 
5a70: 65 78 65 72 63 69 73 65 73 20 63 6f 64 65 0a 2a  exercises code.*
5a80: 2a 20 66 6f 72 20 76 69 65 77 73 2c 20 73 75 62  * for views, sub
5a90: 71 75 65 72 69 65 73 2c 20 63 6f 2d 72 6f 75 74  queries, co-rout
5aa0: 69 6e 65 73 2c 20 65 74 63 2e 0a 2a 2f 0a 76 6f  ines, etc..*/.vo
5ab0: 69 64 20 74 65 73 74 73 65 74 5f 63 74 65 28 76  id testset_cte(v
5ac0: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
5ad0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 50 75 7a  onst char *azPuz
5ae0: 7a 6c 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  zle[] = {.    /*
5af0: 20 45 61 73 79 20 2a 2f 0a 20 20 20 20 22 35 33   Easy */.    "53
5b00: 34 2e 2e 2e 39 2e 2e 22 0a 20 20 20 20 22 36 37  4...9..".    "67
5b10: 2e 31 39 35 2e 2e 2e 22 0a 20 20 20 20 22 2e 39  .195...".    ".9
5b20: 38 2e 2e 2e 2e 36 2e 22 0a 20 20 20 20 22 38 2e  8....6.".    "8.
5b30: 2e 2e 36 2e 2e 2e 33 22 0a 20 20 20 20 22 34 2e  ..6...3".    "4.
5b40: 2e 38 2e 33 2e 2e 31 22 0a 20 20 20 20 22 2e 2e  .8.3..1".    "..
5b50: 2e 2e 32 2e 2e 2e 36 22 0a 20 20 20 20 22 2e 36  ..2...6".    ".6
5b60: 2e 2e 2e 2e 32 38 2e 22 0a 20 20 20 20 22 2e 2e  ....28.".    "..
5b70: 2e 34 31 39 2e 2e 35 22 0a 20 20 20 20 22 2e 2e  .419..5".    "..
5b80: 2e 32 38 2e 2e 37 39 22 2c 0a 0a 20 20 20 20 2f  .28..79",..    /
5b90: 2a 20 4d 65 64 69 75 6d 20 2a 2f 0a 20 20 20 20  * Medium */.    
5ba0: 22 35 33 2e 2e 2e 2e 39 2e 2e 22 0a 20 20 20 20  "53....9..".    
5bb0: 22 36 2e 2e 31 39 35 2e 2e 2e 22 0a 20 20 20 20  "6..195...".    
5bc0: 22 2e 39 38 2e 2e 2e 2e 36 2e 22 0a 20 20 20 20  ".98....6.".    
5bd0: 22 38 2e 2e 2e 36 2e 2e 2e 33 22 0a 20 20 20 20  "8...6...3".    
5be0: 22 34 2e 2e 38 2e 33 2e 2e 31 22 0a 20 20 20 20  "4..8.3..1".    
5bf0: 22 2e 2e 2e 2e 32 2e 2e 2e 36 22 0a 20 20 20 20  "....2...6".    
5c00: 22 2e 36 2e 2e 2e 2e 32 38 2e 22 0a 20 20 20 20  ".6....28.".    
5c10: 22 2e 2e 2e 34 31 39 2e 2e 35 22 0a 20 20 20 20  "...419..5".    
5c20: 22 2e 2e 2e 2e 38 2e 2e 37 39 22 2c 0a 0a 20 20  "....8..79",..  
5c30: 20 20 2f 2a 20 48 61 72 64 20 2a 2f 0a 20 20 20    /* Hard */.   
5c40: 20 22 35 33 2e 2e 2e 2e 2e 2e 2e 22 0a 20 20 20   "53.......".   
5c50: 20 22 36 2e 2e 31 39 35 2e 2e 2e 22 0a 20 20 20   "6..195...".   
5c60: 20 22 2e 39 38 2e 2e 2e 2e 36 2e 22 0a 20 20 20   ".98....6.".   
5c70: 20 22 38 2e 2e 2e 36 2e 2e 2e 33 22 0a 20 20 20   "8...6...3".   
5c80: 20 22 34 2e 2e 38 2e 33 2e 2e 31 22 0a 20 20 20   "4..8.3..1".   
5c90: 20 22 2e 2e 2e 2e 32 2e 2e 2e 36 22 0a 20 20 20   "....2...6".   
5ca0: 20 22 2e 36 2e 2e 2e 2e 32 38 2e 22 0a 20 20 20   ".6....28.".   
5cb0: 20 22 2e 2e 2e 34 31 39 2e 2e 35 22 0a 20 20 20   "...419..5".   
5cc0: 20 22 2e 2e 2e 2e 38 2e 2e 37 39 22 2c 0a 20 20   "....8..79",.  
5cd0: 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
5ce0: 2a 7a 50 75 7a 3b 0a 20 20 64 6f 75 62 6c 65 20  *zPuz;.  double 
5cf0: 72 53 70 61 63 69 6e 67 3b 0a 20 20 69 6e 74 20  rSpacing;.  int 
5d00: 6e 45 6c 65 6d 3b 0a 0a 20 20 69 66 28 20 67 2e  nElem;..  if( g.
5d10: 73 7a 54 65 73 74 3c 32 35 20 29 7b 0a 20 20 20  szTest<25 ){.   
5d20: 20 7a 50 75 7a 20 3d 20 61 7a 50 75 7a 7a 6c 65   zPuz = azPuzzle
5d30: 5b 30 5d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  [0];.  }else if(
5d40: 20 67 2e 73 7a 54 65 73 74 3c 37 30 20 29 7b 0a   g.szTest<70 ){.
5d50: 20 20 20 20 7a 50 75 7a 20 3d 20 61 7a 50 75 7a      zPuz = azPuz
5d60: 7a 6c 65 5b 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b  zle[1];.  }else{
5d70: 0a 20 20 20 20 7a 50 75 7a 20 3d 20 61 7a 50 75  .    zPuz = azPu
5d80: 7a 7a 6c 65 5b 32 5d 3b 0a 20 20 7d 0a 20 20 73  zzle[2];.  }.  s
5d90: 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f  peedtest1_begin_
5da0: 74 65 73 74 28 31 30 30 2c 20 22 53 75 64 6f 6b  test(100, "Sudok
5db0: 75 20 77 69 74 68 20 72 65 63 75 72 73 69 76 65  u with recursive
5dc0: 20 27 64 69 67 69 74 73 27 22 29 3b 0a 20 20 73   'digits'");.  s
5dd0: 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72  peedtest1_prepar
5de0: 65 28 0a 20 20 20 20 22 57 49 54 48 20 52 45 43  e(.    "WITH REC
5df0: 55 52 53 49 56 45 5c 6e 22 0a 20 20 20 20 22 20  URSIVE\n".    " 
5e00: 20 69 6e 70 75 74 28 73 75 64 29 20 41 53 20 28   input(sud) AS (
5e10: 56 41 4c 55 45 53 28 3f 31 29 29 2c 5c 6e 22 0a  VALUES(?1)),\n".
5e20: 20 20 20 20 22 20 20 64 69 67 69 74 73 28 7a 2c      "  digits(z,
5e30: 6c 70 29 20 41 53 20 28 5c 6e 22 0a 20 20 20 20  lp) AS (\n".    
5e40: 22 20 20 20 20 56 41 4c 55 45 53 28 27 31 27 2c  "    VALUES('1',
5e50: 20 31 29 5c 6e 22 0a 20 20 20 20 22 20 20 20 20   1)\n".    "    
5e60: 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 0a 20 20 20  UNION ALL\n".   
5e70: 20 22 20 20 20 20 53 45 4c 45 43 54 20 43 41 53   "    SELECT CAS
5e80: 54 28 6c 70 2b 31 20 41 53 20 54 45 58 54 29 2c  T(lp+1 AS TEXT),
5e90: 20 6c 70 2b 31 20 46 52 4f 4d 20 64 69 67 69 74   lp+1 FROM digit
5ea0: 73 20 57 48 45 52 45 20 6c 70 3c 39 5c 6e 22 0a  s WHERE lp<9\n".
5eb0: 20 20 20 20 22 20 20 29 2c 5c 6e 22 0a 20 20 20      "  ),\n".   
5ec0: 20 22 20 20 78 28 73 2c 20 69 6e 64 29 20 41 53   "  x(s, ind) AS
5ed0: 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53   (\n".    "    S
5ee0: 45 4c 45 43 54 20 73 75 64 2c 20 69 6e 73 74 72  ELECT sud, instr
5ef0: 28 73 75 64 2c 20 27 2e 27 29 20 46 52 4f 4d 20  (sud, '.') FROM 
5f00: 69 6e 70 75 74 5c 6e 22 0a 20 20 20 20 22 20 20  input\n".    "  
5f10: 20 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 0a 20    UNION ALL\n". 
5f20: 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 5c 6e     "    SELECT\n
5f30: 22 0a 20 20 20 20 22 20 20 20 20 20 20 73 75 62  ".    "      sub
5f40: 73 74 72 28 73 2c 20 31 2c 20 69 6e 64 2d 31 29  str(s, 1, ind-1)
5f50: 20 7c 7c 20 7a 20 7c 7c 20 73 75 62 73 74 72 28   || z || substr(
5f60: 73 2c 20 69 6e 64 2b 31 29 2c 5c 6e 22 0a 20 20  s, ind+1),\n".  
5f70: 20 20 22 20 20 20 20 20 20 69 6e 73 74 72 28 20    "      instr( 
5f80: 73 75 62 73 74 72 28 73 2c 20 31 2c 20 69 6e 64  substr(s, 1, ind
5f90: 2d 31 29 20 7c 7c 20 7a 20 7c 7c 20 73 75 62 73  -1) || z || subs
5fa0: 74 72 28 73 2c 20 69 6e 64 2b 31 29 2c 20 27 2e  tr(s, ind+1), '.
5fb0: 27 20 29 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ' )\n".    "    
5fc0: 20 46 52 4f 4d 20 78 2c 20 64 69 67 69 74 73 20   FROM x, digits 
5fd0: 41 53 20 7a 5c 6e 22 0a 20 20 20 20 22 20 20 20  AS z\n".    "   
5fe0: 20 57 48 45 52 45 20 69 6e 64 3e 30 5c 6e 22 0a   WHERE ind>0\n".
5ff0: 20 20 20 20 22 20 20 20 20 20 20 41 4e 44 20 4e      "      AND N
6000: 4f 54 20 45 58 49 53 54 53 20 28 5c 6e 22 0a 20  OT EXISTS (\n". 
6010: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20     "            
6020: 53 45 4c 45 43 54 20 31 5c 6e 22 0a 20 20 20 20  SELECT 1\n".    
6030: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  "              F
6040: 52 4f 4d 20 64 69 67 69 74 73 20 41 53 20 6c 70  ROM digits AS lp
6050: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
6060: 20 20 20 20 20 20 57 48 45 52 45 20 7a 2e 7a 20        WHERE z.z 
6070: 3d 20 73 75 62 73 74 72 28 73 2c 20 28 28 69 6e  = substr(s, ((in
6080: 64 2d 31 29 2f 39 29 2a 39 20 2b 20 6c 70 2c 20  d-1)/9)*9 + lp, 
6090: 31 29 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  1)\n".    "     
60a0: 20 20 20 20 20 20 20 20 20 20 20 4f 52 20 7a 2e             OR z.
60b0: 7a 20 3d 20 73 75 62 73 74 72 28 73 2c 20 28 28  z = substr(s, ((
60c0: 69 6e 64 2d 31 29 25 25 39 29 20 2b 20 28 6c 70  ind-1)%%9) + (lp
60d0: 2d 31 29 2a 39 20 2b 20 31 2c 20 31 29 5c 6e 22  -1)*9 + 1, 1)\n"
60e0: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
60f0: 20 20 20 20 20 20 4f 52 20 7a 2e 7a 20 3d 20 73        OR z.z = s
6100: 75 62 73 74 72 28 73 2c 20 28 28 28 69 6e 64 2d  ubstr(s, (((ind-
6110: 31 29 2f 33 29 20 25 25 20 33 29 20 2a 20 33 5c  1)/3) %% 3) * 3\
6120: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  n".    "        
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 2b 20 28 28 69 6e 64 2d 31 29 2f 32 37 29 20 2a  + ((ind-1)/27) *
6150: 20 32 37 20 2b 20 6c 70 5c 6e 22 0a 20 20 20 20   27 + lp\n".    
6160: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6170: 20 20 20 20 20 20 20 20 20 2b 20 28 28 6c 70 2d           + ((lp-
6180: 31 29 20 2f 20 33 29 20 2a 20 36 2c 20 31 29 5c  1) / 3) * 6, 1)\
6190: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  n".    "        
61a0: 20 29 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e   )\n".    "  )\n
61b0: 22 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73 20  ".    "SELECT s 
61c0: 46 52 4f 4d 20 78 20 57 48 45 52 45 20 69 6e 64  FROM x WHERE ind
61d0: 3d 30 3b 22 0a 20 20 29 3b 0a 20 20 73 71 6c 69  =0;".  );.  sqli
61e0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 67 2e  te3_bind_text(g.
61f0: 70 53 74 6d 74 2c 20 31 2c 20 7a 50 75 7a 2c 20  pStmt, 1, zPuz, 
6200: 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
6210: 43 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  C);.  speedtest1
6220: 5f 72 75 6e 28 29 3b 0a 20 20 73 70 65 65 64 74  _run();.  speedt
6230: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
6240: 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62  ..  speedtest1_b
6250: 65 67 69 6e 5f 74 65 73 74 28 32 30 30 2c 20 22  egin_test(200, "
6260: 53 75 64 6f 6b 75 20 77 69 74 68 20 56 41 4c 55  Sudoku with VALU
6270: 45 53 20 27 64 69 67 69 74 73 27 22 29 3b 0a 20  ES 'digits'");. 
6280: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
6290: 61 72 65 28 0a 20 20 20 20 22 57 49 54 48 20 52  are(.    "WITH R
62a0: 45 43 55 52 53 49 56 45 5c 6e 22 0a 20 20 20 20  ECURSIVE\n".    
62b0: 22 20 20 69 6e 70 75 74 28 73 75 64 29 20 41 53  "  input(sud) AS
62c0: 20 28 56 41 4c 55 45 53 28 3f 31 29 29 2c 5c 6e   (VALUES(?1)),\n
62d0: 22 0a 20 20 20 20 22 20 20 64 69 67 69 74 73 28  ".    "  digits(
62e0: 7a 2c 6c 70 29 20 41 53 20 28 56 41 4c 55 45 53  z,lp) AS (VALUES
62f0: 28 27 31 27 2c 31 29 2c 28 27 32 27 2c 32 29 2c  ('1',1),('2',2),
6300: 28 27 33 27 2c 33 29 2c 28 27 34 27 2c 34 29 2c  ('3',3),('4',4),
6310: 28 27 35 27 2c 35 29 2c 5c 6e 22 0a 20 20 20 20  ('5',5),\n".    
6320: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6330: 20 20 20 20 20 20 20 20 20 20 28 27 36 27 2c 36            ('6',6
6340: 29 2c 28 27 37 27 2c 37 29 2c 28 27 38 27 2c 38  ),('7',7),('8',8
6350: 29 2c 28 27 39 27 2c 39 29 29 2c 5c 6e 22 0a 20  ),('9',9)),\n". 
6360: 20 20 20 22 20 20 78 28 73 2c 20 69 6e 64 29 20     "  x(s, ind) 
6370: 41 53 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20  AS (\n".    "   
6380: 20 53 45 4c 45 43 54 20 73 75 64 2c 20 69 6e 73   SELECT sud, ins
6390: 74 72 28 73 75 64 2c 20 27 2e 27 29 20 46 52 4f  tr(sud, '.') FRO
63a0: 4d 20 69 6e 70 75 74 5c 6e 22 0a 20 20 20 20 22  M input\n".    "
63b0: 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22      UNION ALL\n"
63c0: 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
63d0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 73  \n".    "      s
63e0: 75 62 73 74 72 28 73 2c 20 31 2c 20 69 6e 64 2d  ubstr(s, 1, ind-
63f0: 31 29 20 7c 7c 20 7a 20 7c 7c 20 73 75 62 73 74  1) || z || subst
6400: 72 28 73 2c 20 69 6e 64 2b 31 29 2c 5c 6e 22 0a  r(s, ind+1),\n".
6410: 20 20 20 20 22 20 20 20 20 20 20 69 6e 73 74 72      "      instr
6420: 28 20 73 75 62 73 74 72 28 73 2c 20 31 2c 20 69  ( substr(s, 1, i
6430: 6e 64 2d 31 29 20 7c 7c 20 7a 20 7c 7c 20 73 75  nd-1) || z || su
6440: 62 73 74 72 28 73 2c 20 69 6e 64 2b 31 29 2c 20  bstr(s, ind+1), 
6450: 27 2e 27 20 29 5c 6e 22 0a 20 20 20 20 22 20 20  '.' )\n".    "  
6460: 20 20 20 46 52 4f 4d 20 78 2c 20 64 69 67 69 74     FROM x, digit
6470: 73 20 41 53 20 7a 5c 6e 22 0a 20 20 20 20 22 20  s AS z\n".    " 
6480: 20 20 20 57 48 45 52 45 20 69 6e 64 3e 30 5c 6e     WHERE ind>0\n
6490: 22 0a 20 20 20 20 22 20 20 20 20 20 20 41 4e 44  ".    "      AND
64a0: 20 4e 4f 54 20 45 58 49 53 54 53 20 28 5c 6e 22   NOT EXISTS (\n"
64b0: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
64c0: 20 20 53 45 4c 45 43 54 20 31 5c 6e 22 0a 20 20    SELECT 1\n".  
64d0: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
64e0: 20 46 52 4f 4d 20 64 69 67 69 74 73 20 41 53 20   FROM digits AS 
64f0: 6c 70 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  lp\n".    "     
6500: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 7a 2e          WHERE z.
6510: 7a 20 3d 20 73 75 62 73 74 72 28 73 2c 20 28 28  z = substr(s, ((
6520: 69 6e 64 2d 31 29 2f 39 29 2a 39 20 2b 20 6c 70  ind-1)/9)*9 + lp
6530: 2c 20 31 29 5c 6e 22 0a 20 20 20 20 22 20 20 20  , 1)\n".    "   
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 52 20               OR 
6550: 7a 2e 7a 20 3d 20 73 75 62 73 74 72 28 73 2c 20  z.z = substr(s, 
6560: 28 28 69 6e 64 2d 31 29 25 25 39 29 20 2b 20 28  ((ind-1)%%9) + (
6570: 6c 70 2d 31 29 2a 39 20 2b 20 31 2c 20 31 29 5c  lp-1)*9 + 1, 1)\
6580: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  n".    "        
6590: 20 20 20 20 20 20 20 20 4f 52 20 7a 2e 7a 20 3d          OR z.z =
65a0: 20 73 75 62 73 74 72 28 73 2c 20 28 28 28 69 6e   substr(s, (((in
65b0: 64 2d 31 29 2f 33 29 20 25 25 20 33 29 20 2a 20  d-1)/3) %% 3) * 
65c0: 33 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  3\n".    "      
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 2b 20 28 28 69 6e 64 2d 31 29 2f 32 37 29    + ((ind-1)/27)
65f0: 20 2a 20 32 37 20 2b 20 6c 70 5c 6e 22 0a 20 20   * 27 + lp\n".  
6600: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
6610: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 28 6c             + ((l
6620: 70 2d 31 29 20 2f 20 33 29 20 2a 20 36 2c 20 31  p-1) / 3) * 6, 1
6630: 29 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  )\n".    "      
6640: 20 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 20 29     )\n".    "  )
6650: 5c 6e 22 0a 20 20 20 20 22 53 45 4c 45 43 54 20  \n".    "SELECT 
6660: 73 20 46 52 4f 4d 20 78 20 57 48 45 52 45 20 69  s FROM x WHERE i
6670: 6e 64 3d 30 3b 22 0a 20 20 29 3b 0a 20 20 73 71  nd=0;".  );.  sq
6680: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
6690: 67 2e 70 53 74 6d 74 2c 20 31 2c 20 7a 50 75 7a  g.pStmt, 1, zPuz
66a0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
66b0: 54 49 43 29 3b 0a 20 20 73 70 65 65 64 74 65 73  TIC);.  speedtes
66c0: 74 31 5f 72 75 6e 28 29 3b 0a 20 20 73 70 65 65  t1_run();.  spee
66d0: 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28  dtest1_end_test(
66e0: 29 3b 0a 0a 20 20 72 53 70 61 63 69 6e 67 20 3d  );..  rSpacing =
66f0: 20 35 2e 30 2f 67 2e 73 7a 54 65 73 74 3b 0a 20   5.0/g.szTest;. 
6700: 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69   speedtest1_begi
6710: 6e 5f 74 65 73 74 28 33 30 30 2c 20 22 4d 61 6e  n_test(300, "Man
6720: 64 65 6c 62 72 6f 74 20 53 65 74 20 77 69 74 68  delbrot Set with
6730: 20 73 70 61 63 69 6e 67 3d 25 66 22 2c 20 72 53   spacing=%f", rS
6740: 70 61 63 69 6e 67 29 3b 0a 20 20 73 70 65 65 64  pacing);.  speed
6750: 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 0a 20  test1_prepare(. 
6760: 20 20 22 57 49 54 48 20 52 45 43 55 52 53 49 56    "WITH RECURSIV
6770: 45 20 5c 6e 22 0a 20 20 20 22 20 20 78 61 78 69  E \n".   "  xaxi
6780: 73 28 78 29 20 41 53 20 28 56 41 4c 55 45 53 28  s(x) AS (VALUES(
6790: 2d 32 2e 30 29 20 55 4e 49 4f 4e 20 41 4c 4c 20  -2.0) UNION ALL 
67a0: 53 45 4c 45 43 54 20 78 2b 3f 31 20 46 52 4f 4d  SELECT x+?1 FROM
67b0: 20 78 61 78 69 73 20 57 48 45 52 45 20 78 3c 31   xaxis WHERE x<1
67c0: 2e 32 29 2c 5c 6e 22 0a 20 20 20 22 20 20 79 61  .2),\n".   "  ya
67d0: 78 69 73 28 79 29 20 41 53 20 28 56 41 4c 55 45  xis(y) AS (VALUE
67e0: 53 28 2d 31 2e 30 29 20 55 4e 49 4f 4e 20 41 4c  S(-1.0) UNION AL
67f0: 4c 20 53 45 4c 45 43 54 20 79 2b 3f 32 20 46 52  L SELECT y+?2 FR
6800: 4f 4d 20 79 61 78 69 73 20 57 48 45 52 45 20 79  OM yaxis WHERE y
6810: 3c 31 2e 30 29 2c 5c 6e 22 0a 20 20 20 22 20 20  <1.0),\n".   "  
6820: 6d 28 69 74 65 72 2c 20 63 78 2c 20 63 79 2c 20  m(iter, cx, cy, 
6830: 78 2c 20 79 29 20 41 53 20 28 5c 6e 22 0a 20 20  x, y) AS (\n".  
6840: 20 22 20 20 20 20 53 45 4c 45 43 54 20 30 2c 20   "    SELECT 0, 
6850: 78 2c 20 79 2c 20 30 2e 30 2c 20 30 2e 30 20 46  x, y, 0.0, 0.0 F
6860: 52 4f 4d 20 78 61 78 69 73 2c 20 79 61 78 69 73  ROM xaxis, yaxis
6870: 5c 6e 22 0a 20 20 20 22 20 20 20 20 55 4e 49 4f  \n".   "    UNIO
6880: 4e 20 41 4c 4c 5c 6e 22 0a 20 20 20 22 20 20 20  N ALL\n".   "   
6890: 20 53 45 4c 45 43 54 20 69 74 65 72 2b 31 2c 20   SELECT iter+1, 
68a0: 63 78 2c 20 63 79 2c 20 78 2a 78 2d 79 2a 79 20  cx, cy, x*x-y*y 
68b0: 2b 20 63 78 2c 20 32 2e 30 2a 78 2a 79 20 2b 20  + cx, 2.0*x*y + 
68c0: 63 79 20 46 52 4f 4d 20 6d 20 5c 6e 22 0a 20 20  cy FROM m \n".  
68d0: 20 22 20 20 20 20 20 57 48 45 52 45 20 28 78 2a   "     WHERE (x*
68e0: 78 20 2b 20 79 2a 79 29 20 3c 20 34 2e 30 20 41  x + y*y) < 4.0 A
68f0: 4e 44 20 69 74 65 72 3c 32 38 5c 6e 22 0a 20 20  ND iter<28\n".  
6900: 20 22 20 20 29 2c 5c 6e 22 0a 20 20 20 22 20 20   "  ),\n".   "  
6910: 6d 32 28 69 74 65 72 2c 20 63 78 2c 20 63 79 29  m2(iter, cx, cy)
6920: 20 41 53 20 28 5c 6e 22 0a 20 20 20 22 20 20 20   AS (\n".   "   
6930: 20 53 45 4c 45 43 54 20 6d 61 78 28 69 74 65 72   SELECT max(iter
6940: 29 2c 20 63 78 2c 20 63 79 20 46 52 4f 4d 20 6d  ), cx, cy FROM m
6950: 20 47 52 4f 55 50 20 42 59 20 63 78 2c 20 63 79   GROUP BY cx, cy
6960: 5c 6e 22 0a 20 20 20 22 20 20 29 2c 5c 6e 22 0a  \n".   "  ),\n".
6970: 20 20 20 22 20 20 61 28 74 29 20 41 53 20 28 5c     "  a(t) AS (\
6980: 6e 22 0a 20 20 20 22 20 20 20 20 53 45 4c 45 43  n".   "    SELEC
6990: 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 20  T group_concat( 
69a0: 73 75 62 73 74 72 28 27 20 2e 2b 2a 23 27 2c 20  substr(' .+*#', 
69b0: 31 2b 6d 69 6e 28 69 74 65 72 2f 37 2c 34 29 2c  1+min(iter/7,4),
69c0: 20 31 29 2c 20 27 27 29 20 5c 6e 22 0a 20 20 20   1), '') \n".   
69d0: 22 20 20 20 20 46 52 4f 4d 20 6d 32 20 47 52 4f  "    FROM m2 GRO
69e0: 55 50 20 42 59 20 63 79 5c 6e 22 0a 20 20 20 22  UP BY cy\n".   "
69f0: 20 20 29 5c 6e 22 0a 20 20 20 22 53 45 4c 45 43    )\n".   "SELEC
6a00: 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 72  T group_concat(r
6a10: 74 72 69 6d 28 74 29 2c 78 27 30 61 27 29 20 46  trim(t),x'0a') F
6a20: 52 4f 4d 20 61 3b 22 0a 20 20 29 3b 0a 20 20 73  ROM a;".  );.  s
6a30: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
6a40: 6c 65 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 72  le(g.pStmt, 1, r
6a50: 53 70 61 63 69 6e 67 2a 2e 30 35 29 3b 0a 20 20  Spacing*.05);.  
6a60: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
6a70: 62 6c 65 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20  ble(g.pStmt, 2, 
6a80: 72 53 70 61 63 69 6e 67 29 3b 0a 20 20 73 70 65  rSpacing);.  spe
6a90: 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20  edtest1_run();. 
6aa0: 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f   speedtest1_end_
6ab0: 74 65 73 74 28 29 3b 0a 0a 20 20 6e 45 6c 65 6d  test();..  nElem
6ac0: 20 3d 20 31 30 30 30 30 2a 67 2e 73 7a 54 65 73   = 10000*g.szTes
6ad0: 74 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  t;.  speedtest1_
6ae0: 62 65 67 69 6e 5f 74 65 73 74 28 34 30 30 2c 20  begin_test(400, 
6af0: 22 45 58 43 45 50 54 20 6f 70 65 72 61 74 6f 72  "EXCEPT operator
6b00: 20 6f 6e 20 25 64 2d 65 6c 65 6d 65 6e 74 20 74   on %d-element t
6b10: 61 62 6c 65 73 22 2c 20 6e 45 6c 65 6d 29 3b 0a  ables", nElem);.
6b20: 20 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65    speedtest1_pre
6b30: 70 61 72 65 28 0a 20 20 20 20 22 57 49 54 48 20  pare(.    "WITH 
6b40: 52 45 43 55 52 53 49 56 45 20 5c 6e 22 0a 20 20  RECURSIVE \n".  
6b50: 20 20 22 20 20 74 31 28 78 29 20 41 53 20 28 56    "  t1(x) AS (V
6b60: 41 4c 55 45 53 28 32 29 20 55 4e 49 4f 4e 20 41  ALUES(2) UNION A
6b70: 4c 4c 20 53 45 4c 45 43 54 20 78 2b 32 20 46 52  LL SELECT x+2 FR
6b80: 4f 4d 20 74 31 20 57 48 45 52 45 20 78 3c 25 64  OM t1 WHERE x<%d
6b90: 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 74 32 28  ),\n".    "  t2(
6ba0: 79 29 20 41 53 20 28 56 41 4c 55 45 53 28 33 29  y) AS (VALUES(3)
6bb0: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
6bc0: 54 20 79 2b 33 20 46 52 4f 4d 20 74 32 20 57 48  T y+3 FROM t2 WH
6bd0: 45 52 45 20 79 3c 25 64 29 5c 6e 22 0a 20 20 20  ERE y<%d)\n".   
6be0: 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 78   "SELECT count(x
6bf0: 29 2c 20 61 76 67 28 78 29 20 46 52 4f 4d 20 28  ), avg(x) FROM (
6c00: 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43  \n".    "  SELEC
6c10: 54 20 78 20 46 52 4f 4d 20 74 31 20 45 58 43 45  T x FROM t1 EXCE
6c20: 50 54 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d  PT SELECT y FROM
6c30: 20 74 32 20 4f 52 44 45 52 20 42 59 20 31 5c 6e   t2 ORDER BY 1\n
6c40: 22 0a 20 20 20 20 22 29 3b 22 2c 0a 20 20 20 20  ".    ");",.    
6c50: 6e 45 6c 65 6d 2c 20 6e 45 6c 65 6d 0a 20 20 29  nElem, nElem.  )
6c60: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 72  ;.  speedtest1_r
6c70: 75 6e 28 29 3b 0a 20 20 73 70 65 65 64 74 65 73  un();.  speedtes
6c80: 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a  t1_end_test();..
6c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 65 73 74 73  }../*.** A tests
6ca0: 65 74 20 75 73 65 64 20 66 6f 72 20 64 65 62 75  et used for debu
6cb0: 67 67 69 6e 67 20 73 70 65 65 64 74 65 73 74 31  gging speedtest1
6cc0: 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64   itself..*/.void
6cd0: 20 74 65 73 74 73 65 74 5f 64 65 62 75 67 31 28   testset_debug1(
6ce0: 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69 67 6e 65  void){.  unsigne
6cf0: 64 20 69 2c 20 6e 3b 0a 20 20 75 6e 73 69 67 6e  d i, n;.  unsign
6d00: 65 64 20 78 31 2c 20 78 32 3b 0a 20 20 63 68 61  ed x1, x2;.  cha
6d10: 72 20 7a 4e 75 6d 5b 32 30 30 30 5d 3b 20 20 20  r zNum[2000];   
6d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
6d30: 6e 75 6d 62 65 72 20 6e 61 6d 65 20 2a 2f 0a 0a  number name */..
6d40: 20 20 6e 20 3d 20 67 2e 73 7a 54 65 73 74 3b 0a    n = g.szTest;.
6d50: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b    for(i=1; i<=n;
6d60: 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20   i++){.    x1 = 
6d70: 73 77 69 7a 7a 6c 65 28 69 2c 20 6e 29 3b 0a 20  swizzle(i, n);. 
6d80: 20 20 20 78 32 20 3d 20 73 77 69 7a 7a 6c 65 28     x2 = swizzle(
6d90: 78 31 2c 20 6e 29 3b 0a 20 20 20 20 73 70 65 65  x1, n);.    spee
6da0: 64 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d  dtest1_numbernam
6db0: 65 28 78 31 2c 20 7a 4e 75 6d 2c 20 73 69 7a 65  e(x1, zNum, size
6dc0: 6f 66 28 7a 4e 75 6d 29 29 3b 0a 20 20 20 20 70  of(zNum));.    p
6dd0: 72 69 6e 74 66 28 22 25 35 64 20 25 35 64 20 25  rintf("%5d %5d %
6de0: 35 64 20 25 73 5c 6e 22 2c 20 69 2c 20 78 31 2c  5d %s\n", i, x1,
6df0: 20 78 32 2c 20 7a 4e 75 6d 29 3b 0a 20 20 7d 0a   x2, zNum);.  }.
6e00: 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20  }..int main(int 
6e10: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
6e20: 76 29 7b 0a 20 20 69 6e 74 20 64 6f 41 75 74 6f  v){.  int doAuto
6e30: 76 61 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  vac = 0;        
6e40: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
6e50: 2d 2d 61 75 74 6f 76 61 63 75 75 6d 20 2a 2f 0a  --autovacuum */.
6e60: 20 20 69 6e 74 20 63 61 63 68 65 53 69 7a 65 20    int cacheSize 
6e70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
6e80: 2f 2a 20 44 65 73 69 72 65 64 20 63 61 63 68 65  /* Desired cache
6e90: 20 73 69 7a 65 2e 20 20 30 20 6d 65 61 6e 73 20   size.  0 means 
6ea0: 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 69 6e 74  default */.  int
6eb0: 20 64 6f 45 78 63 6c 75 73 69 76 65 20 3d 20 30   doExclusive = 0
6ec0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  ;          /* Tr
6ed0: 75 65 20 66 6f 72 20 2d 2d 65 78 63 6c 75 73 69  ue for --exclusi
6ee0: 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 65 61  ve */.  int nHea
6ef0: 70 20 3d 20 30 2c 20 6d 6e 48 65 61 70 20 3d 20  p = 0, mnHeap = 
6f00: 30 3b 20 20 20 20 2f 2a 20 48 65 61 70 20 73 69  0;    /* Heap si
6f10: 7a 65 20 66 72 6f 6d 20 2d 2d 68 65 61 70 20 2a  ze from --heap *
6f20: 2f 0a 20 20 69 6e 74 20 64 6f 49 6e 63 72 76 61  /.  int doIncrva
6f30: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
6f40: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d 2d    /* True for --
6f50: 69 6e 63 72 76 61 63 75 75 6d 20 2a 2f 0a 20 20  incrvacuum */.  
6f60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 4d 6f  const char *zJMo
6f70: 64 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  de = 0;       /*
6f80: 20 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f   Journal mode */
6f90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6fa0: 4b 65 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Key = 0;        
6fb0: 20 2f 2a 20 45 6e 63 72 79 70 74 69 6f 6e 20 6b   /* Encryption k
6fc0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ey */.  int nLoo
6fd0: 6b 20 3d 20 30 2c 20 73 7a 4c 6f 6f 6b 20 3d 20  k = 0, szLook = 
6fe0: 30 3b 20 20 20 20 2f 2a 20 2d 2d 6c 6f 6f 6b 61  0;    /* --looka
6ff0: 73 69 64 65 20 63 6f 6e 66 69 67 75 72 61 74 69  side configurati
7000: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79  on */.  int noSy
7010: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
7020: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
7030: 72 20 2d 2d 6e 6f 73 79 6e 63 20 2a 2f 0a 20 20  r --nosync */.  
7040: 69 6e 74 20 70 61 67 65 53 69 7a 65 20 3d 20 30  int pageSize = 0
7050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7060: 20 44 65 73 69 72 65 64 20 70 61 67 65 20 73 69   Desired page si
7070: 7a 65 2e 20 20 30 20 6d 65 61 6e 73 20 64 65 66  ze.  0 means def
7080: 61 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  ault */.  int nP
7090: 43 61 63 68 65 20 3d 20 30 2c 20 73 7a 50 43 61  Cache = 0, szPCa
70a0: 63 68 65 20 3d 20 30 3b 2f 2a 20 2d 2d 70 63 61  che = 0;/* --pca
70b0: 63 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  che configuratio
70c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 63 72 61  n */.  int nScra
70d0: 74 63 68 20 3d 20 30 2c 20 73 7a 53 63 72 61 74  tch = 0, szScrat
70e0: 63 68 3d 30 3b 2f 2a 20 2d 2d 73 63 72 61 74 63  ch=0;/* --scratc
70f0: 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  h configuration 
7100: 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 53 74 61  */.  int showSta
7110: 74 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ts = 0;         
7120: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d     /* True for -
7130: 2d 73 74 61 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  -stats */.  cons
7140: 74 20 63 68 61 72 20 2a 7a 54 53 65 74 20 3d 20  t char *zTSet = 
7150: 22 6d 61 69 6e 22 3b 20 20 20 2f 2a 20 57 68 69  "main";   /* Whi
7160: 63 68 20 2d 2d 74 65 73 74 73 65 74 20 74 6f 72  ch --testset tor
7170: 75 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 54 72  un */.  int doTr
7180: 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
7190: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
71a0: 72 20 2d 2d 74 72 61 63 65 20 2a 2f 0a 20 20 63  r --trace */.  c
71b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 63 6f  onst char *zEnco
71c0: 64 69 6e 67 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ding = 0;    /* 
71d0: 2d 2d 75 74 66 31 36 62 65 20 6f 72 20 2d 2d 75  --utf16be or --u
71e0: 74 66 31 36 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  tf16le */.  cons
71f0: 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
7200: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
7210: 65 20 6f 66 20 74 68 65 20 74 65 73 74 20 64 61  e of the test da
7220: 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 76 6f 69  tabase */..  voi
7230: 64 20 2a 70 48 65 61 70 20 3d 20 30 3b 20 20 20  d *pHeap = 0;   
7240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
7250: 6c 6f 63 61 74 65 64 20 68 65 61 70 20 73 70 61  located heap spa
7260: 63 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4c  ce */.  void *pL
7270: 6f 6f 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ook = 0;        
7280: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
7290: 65 64 20 6c 6f 6f 6b 61 73 69 64 65 20 73 70 61  ed lookaside spa
72a0: 63 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 50  ce */.  void *pP
72b0: 43 61 63 68 65 20 3d 20 30 3b 20 20 20 20 20 20  Cache = 0;      
72c0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
72d0: 65 64 20 73 74 6f 72 61 67 65 20 66 6f 72 20 70  ed storage for p
72e0: 63 61 63 68 65 20 2a 2f 0a 20 20 76 6f 69 64 20  cache */.  void 
72f0: 2a 70 53 63 72 61 74 63 68 20 3d 20 30 3b 20 20  *pScratch = 0;  
7300: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
7310: 63 61 74 65 64 20 73 74 6f 72 61 67 65 20 66 6f  cated storage fo
7320: 72 20 73 63 72 61 74 63 68 20 2a 2f 0a 20 20 69  r scratch */.  i
7330: 6e 74 20 69 43 75 72 2c 20 69 48 69 3b 20 20 20  nt iCur, iHi;   
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7350: 53 74 61 74 73 20 76 61 6c 75 65 73 2c 20 63 75  Stats values, cu
7360: 72 72 65 6e 74 20 61 6e 64 20 22 68 69 67 68 77  rrent and "highw
7370: 61 74 65 72 22 20 2a 2f 0a 20 20 69 6e 74 20 69  ater" */.  int i
7380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7390: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
73a0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
73b0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
73d0: 50 49 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  PI return code *
73e0: 2f 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20  /..  /* Process 
73f0: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
7400: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 67 2e 7a 57  uments */.  g.zW
7410: 52 20 3d 20 22 22 3b 0a 20 20 67 2e 7a 4e 4e 20  R = "";.  g.zNN 
7420: 3d 20 22 22 3b 0a 20 20 67 2e 7a 50 4b 20 3d 20  = "";.  g.zPK = 
7430: 22 55 4e 49 51 55 45 22 3b 0a 20 20 67 2e 73 7a  "UNIQUE";.  g.sz
7440: 54 65 73 74 20 3d 20 31 30 30 3b 0a 20 20 66 6f  Test = 100;.  fo
7450: 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=1; i<argc; i
7460: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
7470: 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d  har *z = argv[i]
7480: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
7490: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b  '-' ){.      do{
74a0: 20 7a 2b 2b 3b 20 7d 77 68 69 6c 65 28 20 7a 5b   z++; }while( z[
74b0: 30 5d 3d 3d 27 2d 27 20 29 3b 0a 20 20 20 20 20  0]=='-' );.     
74c0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 61   if( strcmp(z,"a
74d0: 75 74 6f 76 61 63 75 75 6d 22 29 3d 3d 30 20 29  utovacuum")==0 )
74e0: 7b 0a 20 20 20 20 20 20 20 20 64 6f 41 75 74 6f  {.        doAuto
74f0: 76 61 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  vac = 1;.      }
7500: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
7510: 7a 2c 22 63 61 63 68 65 73 69 7a 65 22 29 3d 3d  z,"cachesize")==
7520: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
7530: 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61 74   i>=argc-1 ) fat
7540: 61 6c 5f 65 72 72 6f 72 28 22 6d 69 73 73 69 6e  al_error("missin
7550: 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 25 73  g argument on %s
7560: 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  \n", argv[i]);. 
7570: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
7580: 20 20 20 20 63 61 63 68 65 53 69 7a 65 20 3d 20      cacheSize = 
7590: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
75a0: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  v[i]);.      }el
75b0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
75c0: 22 65 78 63 6c 75 73 69 76 65 22 29 3d 3d 30 20  "exclusive")==0 
75d0: 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 45 78 63  ){.        doExc
75e0: 6c 75 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  lusive = 1;.    
75f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
7600: 6d 70 28 7a 2c 22 65 78 70 6c 61 69 6e 22 29 3d  mp(z,"explain")=
7610: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 67 2e  =0 ){.        g.
7620: 62 53 71 6c 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  bSqlOnly = 1;.  
7630: 20 20 20 20 20 20 67 2e 62 45 78 70 6c 61 69 6e        g.bExplain
7640: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
7650: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
7660: 68 65 61 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  heap")==0 ){.   
7670: 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63       if( i>=argc
7680: 2d 32 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72  -2 ) fatal_error
7690: 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  ("missing argume
76a0: 6e 74 73 20 6f 6e 20 25 73 5c 6e 22 2c 20 61 72  nts on %s\n", ar
76b0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[i]);.        
76c0: 6e 48 65 61 70 20 3d 20 69 6e 74 65 67 65 72 56  nHeap = integerV
76d0: 61 6c 75 65 28 61 72 67 76 5b 69 2b 31 5d 29 3b  alue(argv[i+1]);
76e0: 0a 20 20 20 20 20 20 20 20 6d 6e 48 65 61 70 20  .        mnHeap 
76f0: 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  = integerValue(a
7700: 72 67 76 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  rgv[i+2]);.     
7710: 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20     i += 2;.     
7720: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
7730: 70 28 7a 2c 22 69 6e 63 72 76 61 63 75 75 6d 22  p(z,"incrvacuum"
7740: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7750: 64 6f 49 6e 63 72 76 61 63 20 3d 20 31 3b 0a 20  doIncrvac = 1;. 
7760: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7770: 74 72 63 6d 70 28 7a 2c 22 6a 6f 75 72 6e 61 6c  trcmp(z,"journal
7780: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
7790: 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20 29   if( i>=argc-1 )
77a0: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 6d 69   fatal_error("mi
77b0: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f  ssing argument o
77c0: 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d  n %s\n", argv[i]
77d0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4a 4d 6f 64  );.        zJMod
77e0: 65 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20  e = argv[++i];. 
77f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7800: 74 72 63 6d 70 28 7a 2c 22 6b 65 79 22 29 3d 3d  trcmp(z,"key")==
7810: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
7820: 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61 74   i>=argc-1 ) fat
7830: 61 6c 5f 65 72 72 6f 72 28 22 6d 69 73 73 69 6e  al_error("missin
7840: 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 25 73  g argument on %s
7850: 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  \n", argv[i]);. 
7860: 20 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 61 72         zKey = ar
7870: 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 7d  gv[++i];.      }
7880: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
7890: 7a 2c 22 6c 6f 6f 6b 61 73 69 64 65 22 29 3d 3d  z,"lookaside")==
78a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
78b0: 20 69 3e 3d 61 72 67 63 2d 32 20 29 20 66 61 74   i>=argc-2 ) fat
78c0: 61 6c 5f 65 72 72 6f 72 28 22 6d 69 73 73 69 6e  al_error("missin
78d0: 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25  g arguments on %
78e0: 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\n", argv[i]);.
78f0: 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 20 3d 20          nLook = 
7900: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
7910: 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20  v[i+1]);.       
7920: 20 73 7a 4c 6f 6f 6b 20 3d 20 69 6e 74 65 67 65   szLook = intege
7930: 72 56 61 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d  rValue(argv[i+2]
7940: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
7950: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  2;.      }else i
7960: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 6f 73  f( strcmp(z,"nos
7970: 79 6e 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ync")==0 ){.    
7980: 20 20 20 20 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a      noSync = 1;.
7990: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
79a0: 73 74 72 63 6d 70 28 7a 2c 22 6e 6f 74 6e 75 6c  strcmp(z,"notnul
79b0: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
79c0: 20 20 67 2e 7a 4e 4e 20 3d 20 22 4e 4f 54 20 4e    g.zNN = "NOT N
79d0: 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ULL";.      }els
79e0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
79f0: 70 61 67 65 73 69 7a 65 22 29 3d 3d 30 20 29 7b  pagesize")==0 ){
7a00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
7a10: 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c 5f 65  argc-1 ) fatal_e
7a20: 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72  rror("missing ar
7a30: 67 75 6d 65 6e 74 20 6f 6e 20 25 73 5c 6e 22 2c  gument on %s\n",
7a40: 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20   argv[i]);.     
7a50: 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 69 6e     pageSize = in
7a60: 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b  tegerValue(argv[
7a70: 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ++i]);.      }el
7a80: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
7a90: 22 70 63 61 63 68 65 22 29 3d 3d 30 20 29 7b 0a  "pcache")==0 ){.
7aa0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61          if( i>=a
7ab0: 72 67 63 2d 32 20 29 20 66 61 74 61 6c 5f 65 72  rgc-2 ) fatal_er
7ac0: 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67  ror("missing arg
7ad0: 75 6d 65 6e 74 73 20 6f 6e 20 25 73 5c 6e 22 2c  uments on %s\n",
7ae0: 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20   argv[i]);.     
7af0: 20 20 20 6e 50 43 61 63 68 65 20 3d 20 69 6e 74     nPCache = int
7b00: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 69  egerValue(argv[i
7b10: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  +1]);.        sz
7b20: 50 43 61 63 68 65 20 3d 20 69 6e 74 65 67 65 72  PCache = integer
7b30: 56 61 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d 29  Value(argv[i+2])
7b40: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  ;.        i += 2
7b50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7b60: 28 20 73 74 72 63 6d 70 28 7a 2c 22 70 72 69 6d  ( strcmp(z,"prim
7b70: 61 72 79 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20  arykey")==0 ){. 
7b80: 20 20 20 20 20 20 20 67 2e 7a 50 4b 20 3d 20 22         g.zPK = "
7b90: 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a 20 20  PRIMARY KEY";.  
7ba0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7bb0: 72 63 6d 70 28 7a 2c 22 72 65 70 72 65 70 61 72  rcmp(z,"reprepar
7bc0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
7bd0: 20 20 67 2e 62 52 65 70 72 65 70 61 72 65 20 3d    g.bReprepare =
7be0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
7bf0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 63  if( strcmp(z,"sc
7c00: 72 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20  ratch")==0 ){.  
7c10: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67        if( i>=arg
7c20: 63 2d 32 20 29 20 66 61 74 61 6c 5f 65 72 72 6f  c-2 ) fatal_erro
7c30: 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d  r("missing argum
7c40: 65 6e 74 73 20 6f 6e 20 25 73 5c 6e 22 2c 20 61  ents on %s\n", a
7c50: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
7c60: 20 6e 53 63 72 61 74 63 68 20 3d 20 69 6e 74 65   nScratch = inte
7c70: 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 69 2b  gerValue(argv[i+
7c80: 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 53  1]);.        szS
7c90: 63 72 61 74 63 68 20 3d 20 69 6e 74 65 67 65 72  cratch = integer
7ca0: 56 61 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d 29  Value(argv[i+2])
7cb0: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  ;.        i += 2
7cc0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7cd0: 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 71 6c 6f  ( strcmp(z,"sqlo
7ce0: 6e 6c 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nly")==0 ){.    
7cf0: 20 20 20 20 67 2e 62 53 71 6c 4f 6e 6c 79 20 3d      g.bSqlOnly =
7d00: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
7d10: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 69  if( strcmp(z,"si
7d20: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
7d30: 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31     if( i>=argc-1
7d40: 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22   ) fatal_error("
7d50: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
7d60: 20 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b   on %s\n", argv[
7d70: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 67 2e 73  i]);.        g.s
7d80: 7a 54 65 73 74 20 3d 20 69 6e 74 65 67 65 72 56  zTest = integerV
7d90: 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b  alue(argv[++i]);
7da0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
7db0: 20 73 74 72 63 6d 70 28 7a 2c 22 73 74 61 74 73   strcmp(z,"stats
7dc0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
7dd0: 20 73 68 6f 77 53 74 61 74 73 20 3d 20 31 3b 0a   showStats = 1;.
7de0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7df0: 73 74 72 63 6d 70 28 7a 2c 22 74 65 73 74 73 65  strcmp(z,"testse
7e00: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
7e10: 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20    if( i>=argc-1 
7e20: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 6d  ) fatal_error("m
7e30: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
7e40: 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b 69  on %s\n", argv[i
7e50: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 54 53 65  ]);.        zTSe
7e60: 74 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20  t = argv[++i];. 
7e70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
7e80: 74 72 63 6d 70 28 7a 2c 22 74 72 61 63 65 22 29  trcmp(z,"trace")
7e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
7ea0: 6f 54 72 61 63 65 20 3d 20 31 3b 0a 20 20 20 20  oTrace = 1;.    
7eb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
7ec0: 6d 70 28 7a 2c 22 75 74 66 31 36 6c 65 22 29 3d  mp(z,"utf16le")=
7ed0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
7ee0: 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 31 36  ncoding = "utf16
7ef0: 6c 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  le";.      }else
7f00: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 75   if( strcmp(z,"u
7f10: 74 66 31 36 62 65 22 29 3d 3d 30 20 29 7b 0a 20  tf16be")==0 ){. 
7f20: 20 20 20 20 20 20 20 7a 45 6e 63 6f 64 69 6e 67         zEncoding
7f30: 20 3d 20 22 75 74 66 31 36 62 65 22 3b 0a 20 20   = "utf16be";.  
7f40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7f50: 72 63 6d 70 28 7a 2c 22 77 69 74 68 6f 75 74 2d  rcmp(z,"without-
7f60: 72 6f 77 69 64 22 29 3d 3d 30 20 29 7b 0a 20 20  rowid")==0 ){.  
7f70: 20 20 20 20 20 20 67 2e 7a 57 52 20 3d 20 22 57        g.zWR = "W
7f80: 49 54 48 4f 55 54 20 52 4f 57 49 44 22 3b 0a 20  ITHOUT ROWID";. 
7f90: 20 20 20 20 20 20 20 67 2e 7a 50 4b 20 3d 20 22         g.zPK = "
7fa0: 50 52 49 4d 41 52 59 20 4b 45 59 22 3b 0a 20 20  PRIMARY KEY";.  
7fb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7fc0: 72 63 6d 70 28 7a 2c 20 22 68 65 6c 70 22 29 3d  rcmp(z, "help")=
7fd0: 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22  =0 || strcmp(z,"
7fe0: 3f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ?")==0 ){.      
7ff0: 20 20 70 72 69 6e 74 66 28 7a 48 65 6c 70 2c 20    printf(zHelp, 
8000: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20  argv[0]);.      
8010: 20 20 65 78 69 74 28 30 29 3b 0a 20 20 20 20 20    exit(0);.     
8020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8030: 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 75 6e 6b  fatal_error("unk
8040: 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
8050: 6e 55 73 65 20 5c 22 25 73 20 2d 3f 5c 22 20 66  nUse \"%s -?\" f
8060: 6f 72 20 68 65 6c 70 5c 6e 22 2c 0a 20 20 20 20  or help\n",.    
8070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8080: 61 72 67 76 5b 69 5d 2c 20 61 72 67 76 5b 30 5d  argv[i], argv[0]
8090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
80a0: 65 6c 73 65 20 69 66 28 20 7a 44 62 4e 61 6d 65  else if( zDbName
80b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  ==0 ){.      zDb
80c0: 4e 61 6d 65 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  Name = argv[i];.
80d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
80e0: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 73 75   fatal_error("su
80f0: 72 70 6c 75 73 20 61 72 67 75 6d 65 6e 74 3a 20  rplus argument: 
8100: 25 73 5c 6e 55 73 65 20 5c 22 25 73 20 2d 3f 5c  %s\nUse \"%s -?\
8110: 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 0a 20  " for help\n",. 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 20 61 72 67 76 5b 69 5d 2c 20 61 72 67 76 5b 30   argv[i], argv[0
8140: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  ]);.    }.  }.#i
8150: 66 20 30 0a 20 20 69 66 28 20 7a 44 62 4e 61 6d  f 0.  if( zDbNam
8160: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 61 74 61  e==0 ){.    fata
8170: 6c 5f 65 72 72 6f 72 28 7a 48 65 6c 70 2c 20 61  l_error(zHelp, a
8180: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 0a 23 65 6e  rgv[0]);.  }.#en
8190: 64 69 66 0a 20 20 69 66 28 20 6e 48 65 61 70 3e  dif.  if( nHeap>
81a0: 30 20 29 7b 0a 20 20 20 20 70 48 65 61 70 20 3d  0 ){.    pHeap =
81b0: 20 6d 61 6c 6c 6f 63 28 20 6e 48 65 61 70 20 29   malloc( nHeap )
81c0: 3b 0a 20 20 20 20 69 66 28 20 70 48 65 61 70 3d  ;.    if( pHeap=
81d0: 3d 30 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72  =0 ) fatal_error
81e0: 28 22 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74  ("cannot allocat
81f0: 65 20 25 64 2d 62 79 74 65 20 68 65 61 70 5c 6e  e %d-byte heap\n
8200: 22 2c 20 6e 48 65 61 70 29 3b 0a 20 20 20 20 72  ", nHeap);.    r
8210: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  c = sqlite3_conf
8220: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
8230: 5f 48 45 41 50 2c 20 70 48 65 61 70 2c 20 6e 48  _HEAP, pHeap, nH
8240: 65 61 70 2c 20 6d 6e 48 65 61 70 29 3b 0a 20 20  eap, mnHeap);.  
8250: 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c    if( rc ) fatal
8260: 5f 65 72 72 6f 72 28 22 68 65 61 70 20 63 6f 6e  _error("heap con
8270: 66 69 67 75 72 61 74 69 6f 6e 20 66 61 69 6c 65  figuration faile
8280: 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  d: %d\n", rc);. 
8290: 20 7d 0a 20 20 69 66 28 20 6e 50 43 61 63 68 65   }.  if( nPCache
82a0: 3e 30 20 26 26 20 73 7a 50 43 61 63 68 65 3e 30  >0 && szPCache>0
82b0: 20 29 7b 0a 20 20 20 20 70 50 43 61 63 68 65 20   ){.    pPCache 
82c0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 50 43 61 63 68  = malloc( nPCach
82d0: 65 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e*(sqlite3_int64
82e0: 29 73 7a 50 43 61 63 68 65 20 29 3b 0a 20 20 20  )szPCache );.   
82f0: 20 69 66 28 20 70 50 43 61 63 68 65 3d 3d 30 20   if( pPCache==0 
8300: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 63  ) fatal_error("c
8310: 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 25  annot allocate %
8320: 6c 6c 64 2d 62 79 74 65 20 70 63 61 63 68 65 5c  lld-byte pcache\
8330: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 6e 50 43 61 63 68 65 2a 28 73 71       nPCache*(sq
8360: 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 7a 50 43  lite3_int64)szPC
8370: 61 63 68 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  ache);.    rc = 
8380: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
8390: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47  QLITE_CONFIG_PAG
83a0: 45 43 41 43 48 45 2c 20 70 50 43 61 63 68 65 2c  ECACHE, pPCache,
83b0: 20 73 7a 50 43 61 63 68 65 2c 20 6e 50 43 61 63   szPCache, nPCac
83c0: 68 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  he);.    if( rc 
83d0: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 70  ) fatal_error("p
83e0: 63 61 63 68 65 20 63 6f 6e 66 69 67 75 72 61 74  cache configurat
83f0: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e  ion failed: %d\n
8400: 22 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 69 66  ", rc);.  }.  if
8410: 28 20 6e 53 63 72 61 74 63 68 3e 30 20 26 26 20  ( nScratch>0 && 
8420: 73 7a 53 63 72 61 74 63 68 3e 30 20 29 7b 0a 20  szScratch>0 ){. 
8430: 20 20 20 70 53 63 72 61 74 63 68 20 3d 20 6d 61     pScratch = ma
8440: 6c 6c 6f 63 28 20 6e 53 63 72 61 74 63 68 2a 28  lloc( nScratch*(
8450: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 7a  sqlite3_int64)sz
8460: 53 63 72 61 74 63 68 20 29 3b 0a 20 20 20 20 69  Scratch );.    i
8470: 66 28 20 70 53 63 72 61 74 63 68 3d 3d 30 20 29  f( pScratch==0 )
8480: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 63 61   fatal_error("ca
8490: 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 25 6c  nnot allocate %l
84a0: 6c 64 2d 62 79 74 65 20 73 63 72 61 74 63 68 5c  ld-byte scratch\
84b0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 20 20 20 6e 53 63 72 61 74 63 68 2a 28 73       nScratch*(s
84e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 7a 53  qlite3_int64)szS
84f0: 63 72 61 74 63 68 29 3b 0a 20 20 20 20 72 63 20  cratch);.    rc 
8500: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  = sqlite3_config
8510: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53  (SQLITE_CONFIG_S
8520: 43 52 41 54 43 48 2c 20 70 53 63 72 61 74 63 68  CRATCH, pScratch
8530: 2c 20 73 7a 53 63 72 61 74 63 68 2c 20 6e 53 63  , szScratch, nSc
8540: 72 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20  ratch);.    if( 
8550: 72 63 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72  rc ) fatal_error
8560: 28 22 73 63 72 61 74 63 68 20 63 6f 6e 66 69 67  ("scratch config
8570: 75 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a 20  uration failed: 
8580: 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 7d 0a  %d\n", rc);.  }.
8590: 20 20 69 66 28 20 6e 4c 6f 6f 6b 3e 30 20 29 7b    if( nLook>0 ){
85a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .    sqlite3_con
85b0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
85c0: 47 5f 4c 4f 4f 4b 41 53 49 44 45 2c 20 30 2c 20  G_LOOKASIDE, 0, 
85d0: 30 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 4f  0);.  }. .  /* O
85e0: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
85f0: 20 61 6e 64 20 74 68 65 20 69 6e 70 75 74 20 66   and the input f
8600: 69 6c 65 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ile */.  if( sql
8610: 69 74 65 33 5f 6f 70 65 6e 28 7a 44 62 4e 61 6d  ite3_open(zDbNam
8620: 65 2c 20 26 67 2e 64 62 29 20 29 7b 0a 20 20 20  e, &g.db) ){.   
8630: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 43 61   fatal_error("Ca
8640: 6e 6e 6f 74 20 6f 70 65 6e 20 64 61 74 61 62 61  nnot open databa
8650: 73 65 20 66 69 6c 65 3a 20 25 73 5c 6e 22 2c 20  se file: %s\n", 
8660: 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  zDbName);.  }.  
8670: 69 66 28 20 6e 4c 6f 6f 6b 3e 30 20 26 26 20 73  if( nLook>0 && s
8680: 7a 4c 6f 6f 6b 3e 30 20 29 7b 0a 20 20 20 20 70  zLook>0 ){.    p
8690: 4c 6f 6f 6b 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Look = malloc( n
86a0: 4c 6f 6f 6b 2a 73 7a 4c 6f 6f 6b 20 29 3b 0a 20  Look*szLook );. 
86b0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
86c0: 64 62 5f 63 6f 6e 66 69 67 28 67 2e 64 62 2c 20  db_config(g.db, 
86d0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
86e0: 4c 4f 4f 4b 41 53 49 44 45 2c 20 70 4c 6f 6f 6b  LOOKASIDE, pLook
86f0: 2c 20 73 7a 4c 6f 6f 6b 2c 6e 4c 6f 6f 6b 29 3b  , szLook,nLook);
8700: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 66 61  .    if( rc ) fa
8710: 74 61 6c 5f 65 72 72 6f 72 28 22 6c 6f 6f 6b 61  tal_error("looka
8720: 73 69 64 65 20 63 6f 6e 66 69 67 75 72 61 74 69  side configurati
8730: 6f 6e 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22  on failed: %d\n"
8740: 2c 20 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  , rc);.  }..  /*
8750: 20 53 65 74 20 64 61 74 61 62 61 73 65 20 63 6f   Set database co
8760: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 73  nnection options
8770: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 72   */.  sqlite3_cr
8780: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e  eate_function(g.
8790: 64 62 2c 20 22 72 61 6e 64 6f 6d 22 2c 20 30 2c  db, "random", 0,
87a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
87b0: 20 72 61 6e 64 6f 6d 46 75 6e 63 2c 20 30 2c 20   randomFunc, 0, 
87c0: 30 29 3b 0a 20 20 69 66 28 20 64 6f 54 72 61 63  0);.  if( doTrac
87d0: 65 20 29 20 73 71 6c 69 74 65 33 5f 74 72 61 63  e ) sqlite3_trac
87e0: 65 28 67 2e 64 62 2c 20 74 72 61 63 65 43 61 6c  e(g.db, traceCal
87f0: 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28  lback, 0);.  if(
8800: 20 7a 4b 65 79 20 29 7b 0a 20 20 20 20 73 70 65   zKey ){.    spe
8810: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 50 52  edtest1_exec("PR
8820: 41 47 4d 41 20 6b 65 79 28 27 25 73 27 29 22 2c  AGMA key('%s')",
8830: 20 7a 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 69 66   zKey);.  }.  if
8840: 28 20 7a 45 6e 63 6f 64 69 6e 67 20 29 7b 0a 20  ( zEncoding ){. 
8850: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78     speedtest1_ex
8860: 65 63 28 22 50 52 41 47 4d 41 20 65 6e 63 6f 64  ec("PRAGMA encod
8870: 69 6e 67 3d 25 73 22 2c 20 7a 45 6e 63 6f 64 69  ing=%s", zEncodi
8880: 6e 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64  ng);.  }.  if( d
8890: 6f 41 75 74 6f 76 61 63 20 29 7b 0a 20 20 20 20  oAutovac ){.    
88a0: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
88b0: 22 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63  "PRAGMA auto_vac
88c0: 75 75 6d 3d 46 55 4c 4c 22 29 3b 0a 20 20 7d 65  uum=FULL");.  }e
88d0: 6c 73 65 20 69 66 28 20 64 6f 49 6e 63 72 76 61  lse if( doIncrva
88e0: 63 20 29 7b 0a 20 20 20 20 73 70 65 65 64 74 65  c ){.    speedte
88f0: 73 74 31 5f 65 78 65 63 28 22 50 52 41 47 4d 41  st1_exec("PRAGMA
8900: 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 49 4e 43   auto_vacuum=INC
8910: 52 45 4d 45 4e 54 41 4c 22 29 3b 0a 20 20 7d 0a  REMENTAL");.  }.
8920: 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 29    if( pageSize )
8930: 7b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  {.    speedtest1
8940: 5f 65 78 65 63 28 22 50 52 41 47 4d 41 20 70 61  _exec("PRAGMA pa
8950: 67 65 5f 73 69 7a 65 3d 25 64 22 2c 20 70 61 67  ge_size=%d", pag
8960: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66  eSize);.  }.  if
8970: 28 20 63 61 63 68 65 53 69 7a 65 20 29 7b 0a 20  ( cacheSize ){. 
8980: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78     speedtest1_ex
8990: 65 63 28 22 50 52 41 47 4d 41 20 63 61 63 68 65  ec("PRAGMA cache
89a0: 5f 73 69 7a 65 3d 25 64 22 2c 20 63 61 63 68 65  _size=%d", cache
89b0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Size);.  }.  if(
89c0: 20 6e 6f 53 79 6e 63 20 29 20 73 70 65 65 64 74   noSync ) speedt
89d0: 65 73 74 31 5f 65 78 65 63 28 22 50 52 41 47 4d  est1_exec("PRAGM
89e0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46  A synchronous=OF
89f0: 46 22 29 3b 0a 20 20 69 66 28 20 64 6f 45 78 63  F");.  if( doExc
8a00: 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 73 70  lusive ){.    sp
8a10: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 50  eedtest1_exec("P
8a20: 52 41 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  RAGMA locking_mo
8a30: 64 65 3d 45 58 43 4c 55 53 49 56 45 22 29 3b 0a  de=EXCLUSIVE");.
8a40: 20 20 7d 0a 20 20 69 66 28 20 7a 4a 4d 6f 64 65    }.  if( zJMode
8a50: 20 29 7b 0a 20 20 20 20 73 70 65 65 64 74 65 73   ){.    speedtes
8a60: 74 31 5f 65 78 65 63 28 22 50 52 41 47 4d 41 20  t1_exec("PRAGMA 
8a70: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73 22  journal_mode=%s"
8a80: 2c 20 7a 4a 4d 6f 64 65 29 3b 0a 20 20 7d 0a 0a  , zJMode);.  }..
8a90: 20 20 69 66 28 20 67 2e 62 45 78 70 6c 61 69 6e    if( g.bExplain
8aa0: 20 29 20 70 72 69 6e 74 66 28 22 2e 65 78 70 6c   ) printf(".expl
8ab0: 61 69 6e 5c 6e 2e 65 63 68 6f 20 6f 6e 5c 6e 22  ain\n.echo on\n"
8ac0: 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  );.  if( strcmp(
8ad0: 7a 54 53 65 74 2c 22 6d 61 69 6e 22 29 3d 3d 30  zTSet,"main")==0
8ae0: 20 29 7b 0a 20 20 20 20 74 65 73 74 73 65 74 5f   ){.    testset_
8af0: 6d 61 69 6e 28 29 3b 0a 20 20 7d 65 6c 73 65 20  main();.  }else 
8b00: 69 66 28 20 73 74 72 63 6d 70 28 7a 54 53 65 74  if( strcmp(zTSet
8b10: 2c 22 64 65 62 75 67 31 22 29 3d 3d 30 20 29 7b  ,"debug1")==0 ){
8b20: 0a 20 20 20 20 74 65 73 74 73 65 74 5f 64 65 62  .    testset_deb
8b30: 75 67 31 28 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ug1();.  }else i
8b40: 66 28 20 73 74 72 63 6d 70 28 7a 54 53 65 74 2c  f( strcmp(zTSet,
8b50: 22 63 74 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "cte")==0 ){.   
8b60: 20 74 65 73 74 73 65 74 5f 63 74 65 28 29 3b 0a   testset_cte();.
8b70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 61 74    }else{.    fat
8b80: 61 6c 5f 65 72 72 6f 72 28 22 75 6e 6b 6e 6f 77  al_error("unknow
8b90: 6e 20 74 65 73 74 73 65 74 3a 20 5c 22 25 73 5c  n testset: \"%s\
8ba0: 22 5c 6e 22 2c 20 7a 54 53 65 74 29 3b 0a 20 20  "\n", zTSet);.  
8bb0: 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 66  }.  speedtest1_f
8bc0: 69 6e 61 6c 28 29 3b 0a 0a 20 20 2f 2a 20 44 61  inal();..  /* Da
8bd0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8be0: 6e 20 73 74 61 74 69 73 74 69 63 73 20 70 72 69  n statistics pri
8bf0: 6e 74 65 64 20 61 66 74 65 72 20 62 6f 74 68 20  nted after both 
8c00: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
8c10: 6e 74 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  nts.  ** have be
8c20: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 2a 2f 0a  en finalized */.
8c30: 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49  #if SQLITE_VERSI
8c40: 4f 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30 30 37 30  ON_NUMBER>=30070
8c50: 30 39 0a 20 20 69 66 28 20 73 68 6f 77 53 74 61  09.  if( showSta
8c60: 74 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ts ){.    sqlite
8c70: 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62  3_db_status(g.db
8c80: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
8c90: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44  S_LOOKASIDE_USED
8ca0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30  , &iCur, &iHi, 0
8cb0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d  );.    printf("-
8cc0: 2d 20 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74  - Lookaside Slot
8cd0: 73 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 25  s Used:        %
8ce0: 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 20 69  d (max %d)\n", i
8cf0: 43 75 72 2c 69 48 69 29 3b 0a 20 20 20 20 73 71  Cur,iHi);.    sq
8d00: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8d10: 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  g.db, SQLITE_DBS
8d20: 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
8d30: 48 49 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69  HIT, &iCur, &iHi
8d40: 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  , 0);.    printf
8d50: 28 22 2d 2d 20 53 75 63 63 65 73 73 66 75 6c 20  ("-- Successful 
8d60: 6c 6f 6f 6b 61 73 69 64 65 73 3a 20 20 20 20 20  lookasides:     
8d70: 20 20 25 64 5c 6e 22 2c 20 69 48 69 29 3b 0a 20    %d\n", iHi);. 
8d80: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
8d90: 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54  atus(g.db, SQLIT
8da0: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
8db0: 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 20  SIDE_MISS_SIZE, 
8dc0: 26 69 43 75 72 2c 26 69 48 69 2c 30 29 3b 0a 20  &iCur,&iHi,0);. 
8dd0: 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 4c 6f     printf("-- Lo
8de0: 6f 6b 61 73 69 64 65 20 73 69 7a 65 20 66 61 75  okaside size fau
8df0: 6c 74 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22  lts:       %d\n"
8e00: 2c 20 69 48 69 29 3b 0a 20 20 20 20 73 71 6c 69  , iHi);.    sqli
8e10: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e  te3_db_status(g.
8e20: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
8e30: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
8e40: 53 53 5f 46 55 4c 4c 2c 20 26 69 43 75 72 2c 26  SS_FULL, &iCur,&
8e50: 69 48 69 2c 30 29 3b 0a 20 20 20 20 70 72 69 6e  iHi,0);.    prin
8e60: 74 66 28 22 2d 2d 20 4c 6f 6f 6b 61 73 69 64 65  tf("-- Lookaside
8e70: 20 4f 4f 4d 20 66 61 75 6c 74 73 3a 20 20 20 20   OOM faults:    
8e80: 20 20 20 20 25 64 5c 6e 22 2c 20 69 48 69 29 3b      %d\n", iHi);
8e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
8ea0: 73 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c  status(g.db, SQL
8eb0: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8ec0: 48 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  HE_USED, &iCur, 
8ed0: 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70 72  &iHi, 0);.    pr
8ee0: 69 6e 74 66 28 22 2d 2d 20 50 61 67 65 72 20 48  intf("-- Pager H
8ef0: 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
8f00: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
8f10: 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 73 71  ", iCur);.    sq
8f20: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8f30: 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  g.db, SQLITE_DBS
8f40: 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c  TATUS_CACHE_HIT,
8f50: 20 26 69 43 75 72 2c 20 26 69 48 69 2c 20 31 29   &iCur, &iHi, 1)
8f60: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d  ;.    printf("--
8f70: 20 50 61 67 65 20 63 61 63 68 65 20 68 69 74 73   Page cache hits
8f80: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64  :             %d
8f90: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
8fa0: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
8fb0: 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44  s(g.db, SQLITE_D
8fc0: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49  BSTATUS_CACHE_MI
8fd0: 53 53 2c 20 26 69 43 75 72 2c 20 26 69 48 69 2c  SS, &iCur, &iHi,
8fe0: 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   1);.    printf(
8ff0: 22 2d 2d 20 50 61 67 65 20 63 61 63 68 65 20 6d  "-- Page cache m
9000: 69 73 73 65 73 3a 20 20 20 20 20 20 20 20 20 20  isses:          
9010: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 23   %d\n", iCur);.#
9020: 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  if SQLITE_VERSIO
9030: 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30 30 37 30 31  N_NUMBER>=300701
9040: 32 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  2.    sqlite3_db
9050: 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51  _status(g.db, SQ
9060: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
9070: 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72  CHE_WRITE, &iCur
9080: 2c 20 26 69 48 69 2c 20 31 29 3b 0a 20 20 20 20  , &iHi, 1);.    
9090: 70 72 69 6e 74 66 28 22 2d 2d 20 50 61 67 65 20  printf("-- Page 
90a0: 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20  cache writes:   
90b0: 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
90c0: 43 75 72 29 3b 20 0a 23 65 6e 64 69 66 0a 20 20  Cur); .#endif.  
90d0: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
90e0: 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45  tus(g.db, SQLITE
90f0: 5f 44 42 53 54 41 54 55 53 5f 53 43 48 45 4d 41  _DBSTATUS_SCHEMA
9100: 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
9110: 48 69 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e  Hi, 0);.    prin
9120: 74 66 28 22 2d 2d 20 53 63 68 65 6d 61 20 48 65  tf("-- Schema He
9130: 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
9140: 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c      %d bytes\n",
9150: 20 69 43 75 72 29 3b 20 0a 20 20 20 20 73 71 6c   iCur); .    sql
9160: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67  ite3_db_status(g
9170: 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  .db, SQLITE_DBST
9180: 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44 2c 20  ATUS_STMT_USED, 
9190: 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30 29 3b  &iCur, &iHi, 0);
91a0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20  .    printf("-- 
91b0: 53 74 61 74 65 6d 65 6e 74 20 48 65 61 70 20 55  Statement Heap U
91c0: 73 61 67 65 3a 20 20 20 20 20 20 20 20 25 64 20  sage:        %d 
91d0: 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72 29 3b  bytes\n", iCur);
91e0: 20 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20   .  }.#endif..  
91f0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e  sqlite3_close(g.
9200: 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 6c 6f 62 61  db);..  /* Globa
9210: 6c 20 6d 65 6d 6f 72 79 20 75 73 61 67 65 20 73  l memory usage s
9220: 74 61 74 69 73 74 69 63 73 20 70 72 69 6e 74 65  tatistics printe
9230: 64 20 61 66 74 65 72 20 74 68 65 20 64 61 74 61  d after the data
9240: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
9250: 20 20 2a 2a 20 68 61 73 20 63 6c 6f 73 65 64 2e    ** has closed.
9260: 20 20 4d 65 6d 6f 72 79 20 75 73 61 67 65 20 73    Memory usage s
9270: 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 20 61 74  hould be zero at
9280: 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f 0a   this point. */.
9290: 20 20 69 66 28 20 73 68 6f 77 53 74 61 74 73 20    if( showStats 
92a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
92b0: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
92c0: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c  TUS_MEMORY_USED,
92d0: 20 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30 29   &iCur, &iHi, 0)
92e0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d  ;.    printf("--
92f0: 20 4d 65 6d 6f 72 79 20 55 73 65 64 20 28 62 79   Memory Used (by
9300: 74 65 73 29 3a 20 20 20 20 20 20 20 20 20 25 64  tes):         %d
9310: 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 20 69 43   (max %d)\n", iC
9320: 75 72 2c 69 48 69 29 3b 0a 23 69 66 20 53 51 4c  ur,iHi);.#if SQL
9330: 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
9340: 45 52 3e 3d 33 30 30 37 30 30 30 0a 20 20 20 20  ER>=3007000.    
9350: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
9360: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c  QLITE_STATUS_MAL
9370: 4c 4f 43 5f 43 4f 55 4e 54 2c 20 26 69 43 75 72  LOC_COUNT, &iCur
9380: 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20  , &iHi, 0);.    
9390: 70 72 69 6e 74 66 28 22 2d 2d 20 4f 75 74 73 74  printf("-- Outst
93a0: 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69 6f  anding Allocatio
93b0: 6e 73 3a 20 20 20 20 20 25 64 20 28 6d 61 78 20  ns:     %d (max 
93c0: 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69  %d)\n", iCur,iHi
93d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
93e0: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
93f0: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
9400: 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 26  ACHE_OVERFLOW, &
9410: 69 43 75 72 2c 20 26 69 48 69 2c 20 30 29 3b 0a  iCur, &iHi, 0);.
9420: 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 50      printf("-- P
9430: 63 61 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42  cache Overflow B
9440: 79 74 65 73 3a 20 20 20 20 20 20 20 25 64 20 28  ytes:       %d (
9450: 6d 61 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72  max %d)\n", iCur
9460: 2c 69 48 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  ,iHi);.    sqlit
9470: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
9480: 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48 5f  _STATUS_SCRATCH_
9490: 4f 56 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c  OVERFLOW, &iCur,
94a0: 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70   &iHi, 0);.    p
94b0: 72 69 6e 74 66 28 22 2d 2d 20 53 63 72 61 74 63  rintf("-- Scratc
94c0: 68 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73  h Overflow Bytes
94d0: 3a 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25  :      %d (max %
94e0: 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69 29  d)\n", iCur,iHi)
94f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
9500: 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54  atus(SQLITE_STAT
9510: 55 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20  US_MALLOC_SIZE, 
9520: 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30 29 3b  &iCur, &iHi, 0);
9530: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20  .    printf("-- 
9540: 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61 74 69  Largest Allocati
9550: 6f 6e 3a 20 20 20 20 20 20 20 20 20 20 25 64 20  on:          %d 
9560: 62 79 74 65 73 5c 6e 22 2c 69 48 69 29 3b 0a 20  bytes\n",iHi);. 
9570: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
9580: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
9590: 50 41 47 45 43 41 43 48 45 5f 53 49 5a 45 2c 20  PAGECACHE_SIZE, 
95a0: 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30 29 3b  &iCur, &iHi, 0);
95b0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20  .    printf("-- 
95c0: 4c 61 72 67 65 73 74 20 50 63 61 63 68 65 20 41  Largest Pcache A
95d0: 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20 25 64 20  llocation:   %d 
95e0: 62 79 74 65 73 5c 6e 22 2c 69 48 69 29 3b 0a 20  bytes\n",iHi);. 
95f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75     sqlite3_statu
9600: 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  s(SQLITE_STATUS_
9610: 53 43 52 41 54 43 48 5f 53 49 5a 45 2c 20 26 69  SCRATCH_SIZE, &i
9620: 43 75 72 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20  Cur, &iHi, 0);. 
9630: 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 4c 61     printf("-- La
9640: 72 67 65 73 74 20 53 63 72 61 74 63 68 20 41 6c  rgest Scratch Al
9650: 6c 6f 63 61 74 69 6f 6e 3a 20 20 25 64 20 62 79  location:  %d by
9660: 74 65 73 5c 6e 22 2c 20 69 48 69 29 3b 0a 20 20  tes\n", iHi);.  
9670: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  }..  /* Release 
9680: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 66 72 65 65  memory */.  free
9690: 28 20 70 4c 6f 6f 6b 20 29 3b 0a 20 20 66 72 65  ( pLook );.  fre
96a0: 65 28 20 70 50 43 61 63 68 65 20 29 3b 0a 20 20  e( pPCache );.  
96b0: 66 72 65 65 28 20 70 53 63 72 61 74 63 68 20 29  free( pScratch )
96c0: 3b 0a 20 20 66 72 65 65 28 20 70 48 65 61 70 20  ;.  free( pHeap 
96d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
96e0: 0a                                               .