/ Hex Artifact Content
Login

Artifact d29c8048beb7ea9254191f3fde9414709166a920:


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 76 65 72 69 66  \n".  "  --verif
0680: 79 20 20 20 20 20 20 20 20 20 20 20 20 52 75 6e  y            Run
0690: 20 61 64 64 69 74 69 6f 6e 61 6c 20 76 65 72 69   additional veri
06a0: 66 69 63 61 74 69 6f 6e 20 73 74 65 70 73 2e 5c  fication steps.\
06b0: 6e 22 0a 20 20 22 20 20 2d 2d 77 69 74 68 6f 75  n".  "  --withou
06c0: 74 2d 72 6f 77 69 64 20 20 20 20 20 55 73 65 20  t-rowid     Use 
06d0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 77 68  WITHOUT ROWID wh
06e0: 65 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 5c  ere appropriate\
06f0: 6e 22 0a 3b 0a 0a 0a 23 69 6e 63 6c 75 64 65 20  n".;...#include 
0700: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63  "sqlite3.h".#inc
0710: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
0720: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e  #include <stdio.
0730: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0740: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  lib.h>.#include 
0750: 3c 73 74 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c  <stdarg.h>.#incl
0760: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0770: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0780: 3e 0a 0a 2f 2a 20 41 6c 6c 20 67 6c 6f 62 61 6c  >../* All global
0790: 20 73 74 61 74 65 20 69 73 20 68 65 6c 64 20 69   state is held i
07a0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
07b0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
07c0: 74 20 47 6c 6f 62 61 6c 20 7b 0a 20 20 73 71 6c  t Global {.  sql
07d0: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
07e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
07f0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e  pen database con
0800: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  nection */.  sql
0810: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
0820: 3b 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65  ;       /* Curre
0830: 6e 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nt SQL statement
0840: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
0850: 74 36 34 20 69 53 74 61 72 74 3b 20 20 20 20 20  t64 iStart;     
0860: 20 2f 2a 20 53 74 61 72 74 2d 74 69 6d 65 20 66   /* Start-time f
0870: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
0880: 65 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  est */.  sqlite3
0890: 5f 69 6e 74 36 34 20 69 54 6f 74 61 6c 3b 20 20  _int64 iTotal;  
08a0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 74 69 6d      /* Total tim
08b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 57 69 74 68  e */.  int bWith
08c0: 6f 75 74 52 6f 77 69 64 3b 20 20 20 20 20 20 20  outRowid;       
08d0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d 2d    /* True for --
08e0: 77 69 74 68 6f 75 74 2d 72 6f 77 69 64 20 2a 2f  without-rowid */
08f0: 0a 20 20 69 6e 74 20 62 52 65 70 72 65 70 61 72  .  int bReprepar
0900: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
0910: 20 54 72 75 65 20 74 6f 20 72 65 70 72 65 70 61   True to reprepa
0920: 72 65 20 74 68 65 20 53 51 4c 20 6f 6e 20 65 61  re the SQL on ea
0930: 63 68 20 72 65 72 75 6e 20 2a 2f 0a 20 20 69 6e  ch rerun */.  in
0940: 74 20 62 53 71 6c 4f 6e 6c 79 3b 20 20 20 20 20  t bSqlOnly;     
0950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0960: 20 74 6f 20 70 72 69 6e 74 20 74 68 65 20 53 51   to print the SQ
0970: 4c 20 6f 6e 63 65 20 6f 6e 6c 79 20 2a 2f 0a 20  L once only */. 
0980: 20 69 6e 74 20 62 45 78 70 6c 61 69 6e 3b 20 20   int bExplain;  
0990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
09a0: 72 69 6e 74 20 53 51 4c 20 77 69 74 68 20 45 58  rint SQL with EX
09b0: 50 4c 41 49 4e 20 70 72 65 66 69 78 20 2a 2f 0a  PLAIN prefix */.
09c0: 20 20 69 6e 74 20 62 56 65 72 69 66 79 3b 20 20    int bVerify;  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
09e0: 54 72 79 20 74 6f 20 76 65 72 69 66 79 20 74 68  Try to verify th
09f0: 61 74 20 72 65 73 75 6c 74 73 20 61 72 65 20 63  at results are c
0a00: 6f 72 72 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  orrect */.  int 
0a10: 73 7a 54 65 73 74 3b 20 20 20 20 20 20 20 20 20  szTest;         
0a20: 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6c 65 20         /* Scale 
0a30: 66 61 63 74 6f 72 20 66 6f 72 20 74 65 73 74 20  factor for test 
0a40: 69 74 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  iterations */.  
0a50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 52 3b  const char *zWR;
0a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
0a70: 67 68 74 20 62 65 20 57 49 54 48 4f 55 54 20 52  ght be WITHOUT R
0a80: 4f 57 49 44 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  OWID */.  const 
0a90: 63 68 61 72 20 2a 7a 4e 4e 3b 20 20 20 20 20 20  char *zNN;      
0aa0: 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 62 65       /* Might be
0ab0: 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63   NOT NULL */.  c
0ac0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 4b 3b 20  onst char *zPK; 
0ad0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 67            /* Mig
0ae0: 68 74 20 62 65 20 55 4e 49 51 55 45 20 6f 72 20  ht be UNIQUE or 
0af0: 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20  PRIMARY KEY */. 
0b00: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 2c   unsigned int x,
0b10: 20 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50   y;         /* P
0b20: 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d  seudo-random num
0b30: 62 65 72 20 67 65 6e 65 72 61 74 6f 72 20 73 74  ber generator st
0b40: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ate */.  int nRe
0b50: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
0b60: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
0b70: 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c  he current resul
0b80: 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a 52 65 73  t */.  char zRes
0b90: 75 6c 74 5b 33 30 30 30 5d 3b 20 20 20 20 20 20  ult[3000];      
0ba0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0bb0: 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20   current result 
0bc0: 2a 2f 0a 7d 20 67 3b 0a 0a 0a 2f 2a 20 50 72 69  */.} g;.../* Pri
0bd0: 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nt an error mess
0be0: 61 67 65 20 61 6e 64 20 65 78 69 74 20 2a 2f 0a  age and exit */.
0bf0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 61 74 61  static void fata
0c00: 6c 5f 65 72 72 6f 72 28 63 6f 6e 73 74 20 63 68  l_error(const ch
0c10: 61 72 20 2a 7a 4d 73 67 2c 20 2e 2e 2e 29 7b 0a  ar *zMsg, ...){.
0c20: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
0c30: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 4d 73  va_start(ap, zMs
0c40: 67 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 73  g);.  vfprintf(s
0c50: 74 64 65 72 72 2c 20 7a 4d 73 67 2c 20 61 70 29  tderr, zMsg, ap)
0c60: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
0c70: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a    exit(1);.}../*
0c80: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
0c90: 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64 65  alue of a hexade
0ca0: 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52 65  cimal digit.  Re
0cb0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 69  turn -1 if the i
0cc0: 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  nput.** is not a
0cd0: 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73   hex digit..*/.s
0ce0: 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69 67  tatic int hexDig
0cf0: 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29 7b  itValue(char c){
0d00: 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26  .  if( c>='0' &&
0d10: 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72 6e   c<='9' ) return
0d20: 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28 20   c - '0';.  if( 
0d30: 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66 27  c>='a' && c<='f'
0d40: 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 61   ) return c - 'a
0d50: 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63 3e  ' + 10;.  if( c>
0d60: 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20 29  ='A' && c<='F' )
0d70: 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27 20   return c - 'A' 
0d80: 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d  + 10;.  return -
0d90: 31 3b 0a 7d 0a 0a 2f 2a 20 50 72 6f 76 69 64 65  1;.}../* Provide
0da0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
0db0: 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  to sqlite3_stric
0dc0: 6d 70 28 29 20 69 6e 20 6f 6c 64 65 72 20 76 65  mp() in older ve
0dd0: 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 53 51 4c  rsions of.** SQL
0de0: 69 74 65 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ite */.#if SQLIT
0df0: 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  E_VERSION_NUMBER
0e00: 3c 33 30 30 37 30 31 31 0a 23 20 64 65 66 69 6e  <3007011.# defin
0e10: 65 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  e sqlite3_stricm
0e20: 70 20 73 74 72 63 6d 70 0a 23 65 6e 64 69 66 0a  p strcmp.#endif.
0e30: 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74  ./*.** Interpret
0e40: 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e 74 65   zArg as an inte
0e50: 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73 73 69  ger value, possi
0e60: 62 6c 79 20 77 69 74 68 20 73 75 66 66 69 78 65  bly with suffixe
0e70: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
0e80: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f   integerValue(co
0e90: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
0ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
0eb0: 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63   v = 0;.  static
0ec0: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
0ed0: 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69  char *zSuffix; i
0ee0: 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c  nt iMult; } aMul
0ef0: 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b  t[] = {.    { "K
0f00: 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20  iB", 1024 },.   
0f10: 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31   { "MiB", 1024*1
0f20: 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69  024 },.    { "Gi
0f30: 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30  B", 1024*1024*10
0f40: 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22  24 },.    { "KB"
0f50: 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b  ,  1000 },.    {
0f60: 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20   "MB",  1000000 
0f70: 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20  },.    { "GB",  
0f80: 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
0f90: 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20    { "K",   1000 
0fa0: 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20  },.    { "M",   
0fb0: 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
0fc0: 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30 30   "G",   10000000
0fd0: 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  00 },.  };.  int
0fe0: 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20   i;.  int isNeg 
0ff0: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  = 0;.  if( zArg[
1000: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69  0]=='-' ){.    i
1010: 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41  sNeg = 1;.    zA
1020: 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rg++;.  }else if
1030: 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29  ( zArg[0]=='+' )
1040: 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  {.    zArg++;.  
1050: 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  }.  if( zArg[0]=
1060: 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d  ='0' && zArg[1]=
1070: 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='x' ){.    int 
1080: 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32  x;.    zArg += 2
1090: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78 20  ;.    while( (x 
10a0: 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  = hexDigitValue(
10b0: 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a  zArg[0]))>=0 ){.
10c0: 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29        v = (v<<4)
10d0: 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67   + x;.      zArg
10e0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
10f0: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73  e{.    while( is
1100: 64 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29  digit(zArg[0]) )
1110: 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
1120: 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27   + zArg[0] - '0'
1130: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
1140: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
1150: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4d  i=0; i<sizeof(aM
1160: 75 6c 74 29 2f 73 69 7a 65 6f 66 28 61 4d 75 6c  ult)/sizeof(aMul
1170: 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
1180: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
1190: 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53  icmp(aMult[i].zS
11a0: 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30 20  uffix, zArg)==0 
11b0: 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20 61 4d  ){.      v *= aM
11c0: 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20  ult[i].iMult;.  
11d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11e0: 0a 20 20 7d 0a 20 20 69 66 28 20 76 3e 30 78 37  .  }.  if( v>0x7
11f0: 66 66 66 66 66 66 66 20 29 20 66 61 74 61 6c 5f  fffffff ) fatal_
1200: 65 72 72 6f 72 28 22 70 61 72 61 6d 65 74 65 72  error("parameter
1210: 20 74 6f 6f 20 6c 61 72 67 65 20 2d 20 6d 61 78   too large - max
1220: 20 32 31 34 37 34 38 33 36 34 38 22 29 3b 0a 20   2147483648");. 
1230: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69 73   return (int)(is
1240: 4e 65 67 3f 20 2d 76 20 3a 20 76 29 3b 0a 7d 0a  Neg? -v : v);.}.
1250: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  ./* Return the c
1260: 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63  urrent wall-cloc
1270: 6b 20 74 69 6d 65 2c 20 69 6e 20 6d 69 6c 6c 69  k time, in milli
1280: 73 65 63 6f 6e 64 73 20 2a 2f 0a 73 71 6c 69 74  seconds */.sqlit
1290: 65 33 5f 69 6e 74 36 34 20 73 70 65 65 64 74 65  e3_int64 speedte
12a0: 73 74 31 5f 74 69 6d 65 73 74 61 6d 70 28 76 6f  st1_timestamp(vo
12b0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  id){.  static sq
12c0: 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b  lite3_vfs *clock
12d0: 56 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Vfs = 0;.  sqlit
12e0: 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20 69 66  e3_int64 t;.  if
12f0: 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20  ( clockVfs==0 ) 
1300: 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c 69 74  clockVfs = sqlit
1310: 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1320: 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49  #if SQLITE_VERSI
1330: 4f 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30 30 37 30  ON_NUMBER>=30070
1340: 30 30 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  00.  if( clockVf
1350: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32 20 26  s->iVersion>=2 &
1360: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
1370: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
1380: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
1390: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
13a0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
13b0: 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
13c0: 66 0a 20 20 7b 0a 20 20 20 20 64 6f 75 62 6c 65  f.  {.    double
13d0: 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   r;.    clockVfs
13e0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63  ->xCurrentTime(c
13f0: 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20  lockVfs, &r);.  
1400: 20 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69    t = (sqlite3_i
1410: 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30  nt64)(r*86400000
1420: 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  .0);.  }.  retur
1430: 6e 20 74 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n t;.}../* Retur
1440: 6e 20 61 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f  n a pseudo-rando
1450: 6d 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  m unsigned integ
1460: 65 72 20 2a 2f 0a 75 6e 73 69 67 6e 65 64 20 69  er */.unsigned i
1470: 6e 74 20 73 70 65 65 64 74 65 73 74 31 5f 72 61  nt speedtest1_ra
1480: 6e 64 6f 6d 28 76 6f 69 64 29 7b 0a 20 20 67 2e  ndom(void){.  g.
1490: 78 20 3d 20 28 67 2e 78 3e 3e 31 29 20 5e 20 28  x = (g.x>>1) ^ (
14a0: 28 31 2b 7e 28 67 2e 78 26 31 29 29 20 26 20 30  (1+~(g.x&1)) & 0
14b0: 78 64 30 30 30 30 30 30 31 29 3b 0a 20 20 67 2e  xd0000001);.  g.
14c0: 79 20 3d 20 67 2e 79 2a 31 31 30 33 35 31 35 32  y = g.y*11035152
14d0: 34 35 20 2b 20 31 32 33 34 35 3b 0a 20 20 72 65  45 + 12345;.  re
14e0: 74 75 72 6e 20 67 2e 78 20 5e 20 67 2e 79 3b 0a  turn g.x ^ g.y;.
14f0: 7d 0a 0a 2f 2a 20 4d 61 70 20 74 68 65 20 76 61  }../* Map the va
1500: 6c 75 65 20 69 6e 20 77 69 74 68 69 6e 20 74 68  lue in within th
1510: 65 20 72 61 6e 67 65 20 6f 66 20 31 2e 2e 2e 6c  e range of 1...l
1520: 69 6d 69 74 20 69 6e 74 6f 20 61 6e 6f 74 68 65  imit into anothe
1530: 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 61  r.** number in a
1540: 20 77 61 79 20 74 68 61 74 20 69 73 20 63 68 61   way that is cha
1550: 74 69 63 20 61 6e 64 20 69 6e 76 65 72 74 61 62  tic and invertab
1560: 6c 65 2e 0a 2a 2f 0a 75 6e 73 69 67 6e 65 64 20  le..*/.unsigned 
1570: 73 77 69 7a 7a 6c 65 28 75 6e 73 69 67 6e 65 64  swizzle(unsigned
1580: 20 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 69   in, unsigned li
1590: 6d 69 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  mit){.  unsigned
15a0: 20 6f 75 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c   out = 0;.  whil
15b0: 65 28 20 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  e( limit ){.    
15c0: 6f 75 74 20 3d 20 28 6f 75 74 3c 3c 31 29 20 7c  out = (out<<1) |
15d0: 20 28 69 6e 26 31 29 3b 0a 20 20 20 20 69 6e 20   (in&1);.    in 
15e0: 3e 3e 3d 20 31 3b 0a 20 20 20 20 6c 69 6d 69 74  >>= 1;.    limit
15f0: 20 3e 3e 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65   >>= 1;.  }.  re
1600: 74 75 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 20  turn out;.}../* 
1610: 52 6f 75 6e 64 20 75 70 20 61 20 6e 75 6d 62 65  Round up a numbe
1620: 72 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  r so that it is 
1630: 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 6d  a power of two m
1640: 69 6e 75 73 20 6f 6e 65 0a 2a 2f 0a 75 6e 73 69  inus one.*/.unsi
1650: 67 6e 65 64 20 72 6f 75 6e 64 75 70 5f 61 6c 6c  gned roundup_all
1660: 6f 6e 65 73 28 75 6e 73 69 67 6e 65 64 20 6c 69  ones(unsigned li
1670: 6d 69 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  mit){.  unsigned
1680: 20 6d 20 3d 20 31 3b 0a 20 20 77 68 69 6c 65 28   m = 1;.  while(
1690: 20 6d 3c 6c 69 6d 69 74 20 29 20 6d 20 3d 20 28   m<limit ) m = (
16a0: 6d 3c 3c 31 29 2b 31 3b 0a 20 20 72 65 74 75 72  m<<1)+1;.  retur
16b0: 6e 20 6d 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 73  n m;.}../* The s
16c0: 70 65 65 64 74 65 73 74 31 5f 6e 75 6d 62 65 72  peedtest1_number
16d0: 6e 61 6d 65 20 70 72 6f 63 65 64 75 72 65 20 62  name procedure b
16e0: 65 6c 6f 77 20 63 6f 6e 76 65 72 74 73 20 69 74  elow converts it
16f0: 73 20 61 72 67 6d 65 6e 74 20 28 61 6e 20 69 6e  s argment (an in
1700: 74 65 67 65 72 29 0a 2a 2a 20 69 6e 74 6f 20 61  teger).** into a
1710: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
1720: 20 74 68 65 20 45 6e 67 6c 69 73 68 2d 6c 61 6e   the English-lan
1730: 67 75 61 67 65 20 6e 61 6d 65 20 66 6f 72 20 74  guage name for t
1740: 68 61 74 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54  hat number..** T
1750: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
1760: 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 66 72 65  ng should be fre
1770: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
1780: 66 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 45 78  free()..**.** Ex
1790: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
17a0: 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d 62   speedtest1_numb
17b0: 65 72 6e 61 6d 65 28 31 32 33 29 20 20 20 2d 3e  ername(123)   ->
17c0: 20 20 22 6f 6e 65 20 68 75 6e 64 72 65 64 20 74    "one hundred t
17d0: 77 65 6e 74 79 20 74 68 72 65 65 22 0a 2a 2f 0a  wenty three".*/.
17e0: 69 6e 74 20 73 70 65 65 64 74 65 73 74 31 5f 6e  int speedtest1_n
17f0: 75 6d 62 65 72 6e 61 6d 65 28 75 6e 73 69 67 6e  umbername(unsign
1800: 65 64 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a  ed int n, char *
1810: 7a 4f 75 74 2c 20 69 6e 74 20 6e 4f 75 74 29 7b  zOut, int nOut){
1820: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1830: 63 68 61 72 20 2a 6f 6e 65 73 5b 5d 20 3d 20 7b  char *ones[] = {
1840: 20 20 22 7a 65 72 6f 22 2c 20 22 6f 6e 65 22 2c    "zero", "one",
1850: 20 22 74 77 6f 22 2c 20 22 74 68 72 65 65 22 2c   "two", "three",
1860: 20 22 66 6f 75 72 22 2c 20 22 66 69 76 65 22 2c   "four", "five",
1870: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1880: 20 20 20 20 22 73 69 78 22 2c 20 22 73 65 76 65      "six", "seve
1890: 6e 22 2c 20 22 65 69 67 68 74 22 2c 20 22 6e 69  n", "eight", "ni
18a0: 6e 65 22 2c 20 22 74 65 6e 22 2c 20 22 65 6c 65  ne", "ten", "ele
18b0: 76 65 6e 22 2c 20 22 74 77 65 6c 76 65 22 2c 20  ven", "twelve", 
18c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d0: 20 20 20 22 74 68 69 72 74 65 65 6e 22 2c 20 22     "thirteen", "
18e0: 66 6f 75 72 74 65 65 6e 22 2c 20 22 66 69 66 74  fourteen", "fift
18f0: 65 65 6e 22 2c 20 22 73 69 78 74 65 65 6e 22 2c  een", "sixteen",
1900: 20 22 73 65 76 65 6e 74 65 65 6e 22 2c 0a 20 20   "seventeen",.  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 22 65 69 67 68 74 65 65 6e 22 2c 20 22 6e 69 6e  "eighteen", "nin
1930: 65 74 65 65 6e 22 20 7d 3b 0a 20 20 73 74 61 74  eteen" };.  stat
1940: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74  ic const char *t
1950: 65 6e 73 5b 5d 20 3d 20 7b 20 22 22 2c 20 22 74  ens[] = { "", "t
1960: 65 6e 22 2c 20 22 74 77 65 6e 74 79 22 2c 20 22  en", "twenty", "
1970: 74 68 69 72 74 79 22 2c 20 22 66 6f 72 74 79 22  thirty", "forty"
1980: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1990: 20 20 20 22 66 69 66 74 79 22 2c 20 22 73 69 78     "fifty", "six
19a0: 74 79 22 2c 20 22 73 65 76 65 6e 74 79 22 2c 20  ty", "seventy", 
19b0: 22 65 69 67 68 74 79 22 2c 20 22 6e 69 6e 65 74  "eighty", "ninet
19c0: 79 22 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20  y" };.  int i = 
19d0: 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 3d 31 30 30  0;..  if( n>=100
19e0: 30 30 30 30 30 30 30 20 29 7b 0a 20 20 20 20 69  0000000 ){.    i
19f0: 20 2b 3d 20 73 70 65 65 64 74 65 73 74 31 5f 6e   += speedtest1_n
1a00: 75 6d 62 65 72 6e 61 6d 65 28 6e 2f 31 30 30 30  umbername(n/1000
1a10: 30 30 30 30 30 30 2c 20 7a 4f 75 74 2b 69 2c 20  000000, zOut+i, 
1a20: 6e 4f 75 74 2d 69 29 3b 0a 20 20 20 20 73 71 6c  nOut-i);.    sql
1a30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
1a40: 75 74 2d 69 2c 20 7a 4f 75 74 2b 69 2c 20 22 20  ut-i, zOut+i, " 
1a50: 62 69 6c 6c 69 6f 6e 22 29 3b 0a 20 20 20 20 69  billion");.    i
1a60: 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   += (int)strlen(
1a70: 7a 4f 75 74 2b 69 29 3b 0a 20 20 20 20 6e 20 3d  zOut+i);.    n =
1a80: 20 6e 20 25 20 31 30 30 30 30 30 30 30 30 30 3b   n % 1000000000;
1a90: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 31 30  .  }.  if( n>=10
1aa0: 30 30 30 30 30 20 29 7b 0a 20 20 20 20 69 66 28  00000 ){.    if(
1ab0: 20 69 20 26 26 20 69 3c 6e 4f 75 74 2d 31 20 29   i && i<nOut-1 )
1ac0: 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 20 27   zOut[i++] = ' '
1ad0: 3b 0a 20 20 20 20 69 20 2b 3d 20 73 70 65 65 64  ;.    i += speed
1ae0: 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65  test1_numbername
1af0: 28 6e 2f 31 30 30 30 30 30 30 2c 20 7a 4f 75 74  (n/1000000, zOut
1b00: 2b 69 2c 20 6e 4f 75 74 2d 69 29 3b 0a 20 20 20  +i, nOut-i);.   
1b10: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1b20: 66 28 6e 4f 75 74 2d 69 2c 20 7a 4f 75 74 2b 69  f(nOut-i, zOut+i
1b30: 2c 20 22 20 6d 69 6c 6c 69 6f 6e 22 29 3b 0a 20  , " million");. 
1b40: 20 20 20 69 20 2b 3d 20 28 69 6e 74 29 73 74 72     i += (int)str
1b50: 6c 65 6e 28 7a 4f 75 74 2b 69 29 3b 0a 20 20 20  len(zOut+i);.   
1b60: 20 6e 20 3d 20 6e 20 25 20 31 30 30 30 30 30 30   n = n % 1000000
1b70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 3d 31  ;.  }.  if( n>=1
1b80: 30 30 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  000 ){.    if( i
1b90: 20 26 26 20 69 3c 6e 4f 75 74 2d 31 20 29 20 7a   && i<nOut-1 ) z
1ba0: 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 20 27 3b 0a  Out[i++] = ' ';.
1bb0: 20 20 20 20 69 20 2b 3d 20 73 70 65 65 64 74 65      i += speedte
1bc0: 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 6e  st1_numbername(n
1bd0: 2f 31 30 30 30 2c 20 7a 4f 75 74 2b 69 2c 20 6e  /1000, zOut+i, n
1be0: 4f 75 74 2d 69 29 3b 0a 20 20 20 20 73 71 6c 69  Out-i);.    sqli
1bf0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
1c00: 74 2d 69 2c 20 7a 4f 75 74 2b 69 2c 20 22 20 74  t-i, zOut+i, " t
1c10: 68 6f 75 73 61 6e 64 22 29 3b 0a 20 20 20 20 69  housand");.    i
1c20: 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   += (int)strlen(
1c30: 7a 4f 75 74 2b 69 29 3b 0a 20 20 20 20 6e 20 3d  zOut+i);.    n =
1c40: 20 6e 20 25 20 31 30 30 30 3b 0a 20 20 7d 0a 20   n % 1000;.  }. 
1c50: 20 69 66 28 20 6e 3e 3d 31 30 30 20 29 7b 0a 20   if( n>=100 ){. 
1c60: 20 20 20 69 66 28 20 69 20 26 26 20 69 3c 6e 4f     if( i && i<nO
1c70: 75 74 2d 31 20 29 20 7a 4f 75 74 5b 69 2b 2b 5d  ut-1 ) zOut[i++]
1c80: 20 3d 20 27 20 27 3b 0a 20 20 20 20 73 71 6c 69   = ' ';.    sqli
1c90: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
1ca0: 74 2d 69 2c 20 7a 4f 75 74 2b 69 2c 20 22 25 73  t-i, zOut+i, "%s
1cb0: 20 68 75 6e 64 72 65 64 22 2c 20 6f 6e 65 73 5b   hundred", ones[
1cc0: 6e 2f 31 30 30 5d 29 3b 0a 20 20 20 20 69 20 2b  n/100]);.    i +
1cd0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f  = (int)strlen(zO
1ce0: 75 74 2b 69 29 3b 0a 20 20 20 20 6e 20 3d 20 6e  ut+i);.    n = n
1cf0: 20 25 20 31 30 30 3b 0a 20 20 7d 0a 20 20 69 66   % 100;.  }.  if
1d00: 28 20 6e 3e 3d 32 30 20 29 7b 0a 20 20 20 20 69  ( n>=20 ){.    i
1d10: 66 28 20 69 20 26 26 20 69 3c 6e 4f 75 74 2d 31  f( i && i<nOut-1
1d20: 20 29 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27   ) zOut[i++] = '
1d30: 20 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ';.    sqlite3_
1d40: 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 2c  snprintf(nOut-i,
1d50: 20 7a 4f 75 74 2b 69 2c 20 22 25 73 22 2c 20 74   zOut+i, "%s", t
1d60: 65 6e 73 5b 6e 2f 31 30 5d 29 3b 0a 20 20 20 20  ens[n/10]);.    
1d70: 69 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  i += (int)strlen
1d80: 28 7a 4f 75 74 2b 69 29 3b 0a 20 20 20 20 6e 20  (zOut+i);.    n 
1d90: 3d 20 6e 20 25 20 31 30 3b 0a 20 20 7d 0a 20 20  = n % 10;.  }.  
1da0: 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69  if( n>0 ){.    i
1db0: 66 28 20 69 20 26 26 20 69 3c 6e 4f 75 74 2d 31  f( i && i<nOut-1
1dc0: 20 29 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27   ) zOut[i++] = '
1dd0: 20 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ';.    sqlite3_
1de0: 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 2c  snprintf(nOut-i,
1df0: 20 7a 4f 75 74 2b 69 2c 20 22 25 73 22 2c 20 6f   zOut+i, "%s", o
1e00: 6e 65 73 5b 6e 5d 29 3b 0a 20 20 20 20 69 20 2b  nes[n]);.    i +
1e10: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f  = (int)strlen(zO
1e20: 75 74 2b 69 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ut+i);.  }.  if(
1e30: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   i==0 ){.    sql
1e40: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
1e50: 75 74 2d 69 2c 20 7a 4f 75 74 2b 69 2c 20 22 7a  ut-i, zOut+i, "z
1e60: 65 72 6f 22 29 3b 0a 20 20 20 20 69 20 2b 3d 20  ero");.    i += 
1e70: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
1e80: 2b 69 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  +i);.  }.  retur
1e90: 6e 20 69 3b 0a 7d 0a 0a 0a 2f 2a 20 53 74 61 72  n i;.}.../* Star
1ea0: 74 20 61 20 6e 65 77 20 74 65 73 74 20 63 61 73  t a new test cas
1eb0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 41 4d  e */.#define NAM
1ec0: 45 57 49 44 54 48 20 36 30 0a 73 74 61 74 69 63  EWIDTH 60.static
1ed0: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 44 6f 74   const char zDot
1ee0: 73 5b 5d 20 3d 0a 20 20 22 2e 2e 2e 2e 2e 2e 2e  s[] =.  ".......
1ef0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1f00: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1f10: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1f20: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1f30: 22 3b 0a 76 6f 69 64 20 73 70 65 65 64 74 65 73  ";.void speedtes
1f40: 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 69 6e  t1_begin_test(in
1f50: 74 20 69 54 65 73 74 4e 75 6d 2c 20 63 6f 6e 73  t iTestNum, cons
1f60: 74 20 63 68 61 72 20 2a 7a 54 65 73 74 4e 61 6d  t char *zTestNam
1f70: 65 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 6e  e, ...){.  int n
1f80: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
1f90: 54 65 73 74 4e 61 6d 65 29 3b 0a 20 20 63 68 61  TestName);.  cha
1fa0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 76 61 5f 6c  r *zName;.  va_l
1fb0: 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1fc0: 72 74 28 61 70 2c 20 7a 54 65 73 74 4e 61 6d 65  rt(ap, zTestName
1fd0: 29 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  );.  zName = sql
1fe0: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 54  ite3_vmprintf(zT
1ff0: 65 73 74 4e 61 6d 65 2c 20 61 70 29 3b 0a 20 20  estName, ap);.  
2000: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 6e 20  va_end(ap);.  n 
2010: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4e  = (int)strlen(zN
2020: 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3e 4e 41  ame);.  if( n>NA
2030: 4d 45 57 49 44 54 48 20 29 7b 0a 20 20 20 20 7a  MEWIDTH ){.    z
2040: 4e 61 6d 65 5b 4e 41 4d 45 57 49 44 54 48 5d 20  Name[NAMEWIDTH] 
2050: 3d 20 30 3b 0a 20 20 20 20 6e 20 3d 20 4e 41 4d  = 0;.    n = NAM
2060: 45 57 49 44 54 48 3b 0a 20 20 7d 0a 20 20 69 66  EWIDTH;.  }.  if
2070: 28 20 67 2e 62 53 71 6c 4f 6e 6c 79 20 29 7b 0a  ( g.bSqlOnly ){.
2080: 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2a 20 25      printf("/* %
2090: 34 64 20 2d 20 25 73 25 2e 2a 73 20 2a 2f 5c 6e  4d - %s%.*s */\n
20a0: 22 2c 20 69 54 65 73 74 4e 75 6d 2c 20 7a 4e 61  ", iTestNum, zNa
20b0: 6d 65 2c 20 4e 41 4d 45 57 49 44 54 48 2d 6e 2c  me, NAMEWIDTH-n,
20c0: 20 7a 44 6f 74 73 29 3b 0a 20 20 7d 65 6c 73 65   zDots);.  }else
20d0: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 34  {.    printf("%4
20e0: 64 20 2d 20 25 73 25 2e 2a 73 20 22 2c 20 69 54  d - %s%.*s ", iT
20f0: 65 73 74 4e 75 6d 2c 20 7a 4e 61 6d 65 2c 20 4e  estNum, zName, N
2100: 41 4d 45 57 49 44 54 48 2d 6e 2c 20 7a 44 6f 74  AMEWIDTH-n, zDot
2110: 73 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 73  s);.    fflush(s
2120: 74 64 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 73 71  tdout);.  }.  sq
2130: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
2140: 29 3b 0a 20 20 67 2e 6e 52 65 73 75 6c 74 20 3d  );.  g.nResult =
2150: 20 30 3b 0a 20 20 67 2e 69 53 74 61 72 74 20 3d   0;.  g.iStart =
2160: 20 73 70 65 65 64 74 65 73 74 31 5f 74 69 6d 65   speedtest1_time
2170: 73 74 61 6d 70 28 29 3b 0a 20 20 67 2e 78 20 3d  stamp();.  g.x =
2180: 20 30 78 61 64 31 33 31 64 30 62 3b 0a 20 20 67   0xad131d0b;.  g
2190: 2e 79 20 3d 20 30 78 34 34 66 39 65 61 63 38 3b  .y = 0x44f9eac8;
21a0: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  .}../* Complete 
21b0: 61 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 76  a test case */.v
21c0: 6f 69 64 20 73 70 65 65 64 74 65 73 74 31 5f 65  oid speedtest1_e
21d0: 6e 64 5f 74 65 73 74 28 76 6f 69 64 29 7b 0a 20  nd_test(void){. 
21e0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
21f0: 45 6c 61 70 73 65 54 69 6d 65 20 3d 20 73 70 65  ElapseTime = spe
2200: 65 64 74 65 73 74 31 5f 74 69 6d 65 73 74 61 6d  edtest1_timestam
2210: 70 28 29 20 2d 20 67 2e 69 53 74 61 72 74 3b 0a  p() - g.iStart;.
2220: 20 20 69 66 28 20 21 67 2e 62 53 71 6c 4f 6e 6c    if( !g.bSqlOnl
2230: 79 20 29 7b 0a 20 20 20 20 67 2e 69 54 6f 74 61  y ){.    g.iTota
2240: 6c 20 2b 3d 20 69 45 6c 61 70 73 65 54 69 6d 65  l += iElapseTime
2250: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 34  ;.    printf("%4
2260: 64 2e 25 30 33 64 73 5c 6e 22 2c 20 28 69 6e 74  d.%03ds\n", (int
2270: 29 28 69 45 6c 61 70 73 65 54 69 6d 65 2f 31 30  )(iElapseTime/10
2280: 30 30 29 2c 20 28 69 6e 74 29 28 69 45 6c 61 70  00), (int)(iElap
2290: 73 65 54 69 6d 65 25 31 30 30 30 29 29 3b 0a 20  seTime%1000));. 
22a0: 20 7d 0a 20 20 69 66 28 20 67 2e 70 53 74 6d 74   }.  if( g.pStmt
22b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
22c0: 66 69 6e 61 6c 69 7a 65 28 67 2e 70 53 74 6d 74  finalize(g.pStmt
22d0: 29 3b 0a 20 20 20 20 67 2e 70 53 74 6d 74 20 3d  );.    g.pStmt =
22e0: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65   0;.  }.}../* Re
22f0: 70 6f 72 74 20 65 6e 64 20 6f 66 20 74 65 73 74  port end of test
2300: 69 6e 67 20 2a 2f 0a 76 6f 69 64 20 73 70 65 65  ing */.void spee
2310: 64 74 65 73 74 31 5f 66 69 6e 61 6c 28 76 6f 69  dtest1_final(voi
2320: 64 29 7b 0a 20 20 69 66 28 20 21 67 2e 62 53 71  d){.  if( !g.bSq
2330: 6c 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 72 69  lOnly ){.    pri
2340: 6e 74 66 28 22 20 20 20 20 20 20 20 54 4f 54 41  ntf("       TOTA
2350: 4c 25 2e 2a 73 20 25 34 64 2e 25 30 33 64 73 5c  L%.*s %4d.%03ds\
2360: 6e 22 2c 20 4e 41 4d 45 57 49 44 54 48 2d 35 2c  n", NAMEWIDTH-5,
2370: 20 7a 44 6f 74 73 2c 0a 20 20 20 20 20 20 20 20   zDots,.        
2380: 20 20 20 28 69 6e 74 29 28 67 2e 69 54 6f 74 61     (int)(g.iTota
2390: 6c 2f 31 30 30 30 29 2c 20 28 69 6e 74 29 28 67  l/1000), (int)(g
23a0: 2e 69 54 6f 74 61 6c 25 31 30 30 30 29 29 3b 0a  .iTotal%1000));.
23b0: 20 20 7d 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20    }.}../* Print 
23c0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
23d0: 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74   to standard out
23e0: 70 75 74 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  put */.static vo
23f0: 69 64 20 70 72 69 6e 74 53 71 6c 28 63 6f 6e 73  id printSql(cons
2400: 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
2410: 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
2420: 72 6c 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 77 68  rlen(zSql);.  wh
2430: 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 53 71  ile( n>0 && (zSq
2440: 6c 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69  l[n-1]==';' || i
2450: 73 73 70 61 63 65 28 7a 53 71 6c 5b 6e 2d 31 5d  sspace(zSql[n-1]
2460: 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 69  )) ){ n--; }.  i
2470: 66 28 20 67 2e 62 45 78 70 6c 61 69 6e 20 29 20  f( g.bExplain ) 
2480: 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20  printf("EXPLAIN 
2490: 22 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25 2e  ");.  printf("%.
24a0: 2a 73 3b 5c 6e 22 2c 20 6e 2c 20 7a 53 71 6c 29  *s;\n", n, zSql)
24b0: 3b 0a 20 20 69 66 28 20 67 2e 62 45 78 70 6c 61  ;.  if( g.bExpla
24c0: 69 6e 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45  in.#if SQLITE_VE
24d0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30  RSION_NUMBER>=30
24e0: 30 37 30 31 30 20 0a 20 20 20 26 26 20 28 20 73  07010 .   && ( s
24f0: 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
2500: 43 52 45 41 54 45 20 2a 22 2c 20 7a 53 71 6c 29  CREATE *", zSql)
2510: 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69  ==0.     || sqli
2520: 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 44 52 4f  te3_strglob("DRO
2530: 50 20 2a 22 2c 20 7a 53 71 6c 29 3d 3d 30 0a 20  P *", zSql)==0. 
2540: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73      || sqlite3_s
2550: 74 72 67 6c 6f 62 28 22 41 4c 54 45 52 20 2a 22  trglob("ALTER *"
2560: 2c 20 7a 53 71 6c 29 3d 3d 30 0a 20 20 20 20 20  , zSql)==0.     
2570: 20 29 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20   ).#endif.  ){. 
2580: 20 20 20 70 72 69 6e 74 66 28 22 25 2e 2a 73 3b     printf("%.*s;
2590: 5c 6e 22 2c 20 6e 2c 20 7a 53 71 6c 29 3b 0a 20  \n", n, zSql);. 
25a0: 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 53 51 4c   }.}../* Run SQL
25b0: 20 2a 2f 0a 76 6f 69 64 20 73 70 65 65 64 74 65   */.void speedte
25c0: 73 74 31 5f 65 78 65 63 28 63 6f 6e 73 74 20 63  st1_exec(const c
25d0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
25e0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
25f0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
2600: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
2610: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
2620: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
2630: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
2640: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
2650: 20 69 66 28 20 67 2e 62 53 71 6c 4f 6e 6c 79 20   if( g.bSqlOnly 
2660: 29 7b 0a 20 20 20 20 70 72 69 6e 74 53 71 6c 28  ){.    printSql(
2670: 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zSql);.  }else{.
2680: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
2690: 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  g = 0;.    int r
26a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
26b0: 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  (g.db, zSql, 0, 
26c0: 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
26d0: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 20    if( zErrMsg ) 
26e0: 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 53 51 4c  fatal_error("SQL
26f0: 20 65 72 72 6f 72 3a 20 25 73 5c 6e 25 73 5c 6e   error: %s\n%s\n
2700: 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
2710: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2720: 51 4c 49 54 45 5f 4f 4b 20 29 20 66 61 74 61 6c  QLITE_OK ) fatal
2730: 5f 65 72 72 6f 72 28 22 65 78 65 63 20 65 72 72  _error("exec err
2740: 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2750: 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29  e3_errmsg(g.db))
2760: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2770: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f  free(zSql);.}../
2780: 2a 20 50 72 65 70 61 72 65 20 61 6e 20 53 51 4c  * Prepare an SQL
2790: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 76 6f   statement */.vo
27a0: 69 64 20 73 70 65 65 64 74 65 73 74 31 5f 70 72  id speedtest1_pr
27b0: 65 70 61 72 65 28 63 6f 6e 73 74 20 63 68 61 72  epare(const char
27c0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
27d0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
27e0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76   char *zSql;.  v
27f0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
2800: 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  mat);.  zSql = s
2810: 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28  qlite3_vmprintf(
2820: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
2830: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2840: 28 20 67 2e 62 53 71 6c 4f 6e 6c 79 20 29 7b 0a  ( g.bSqlOnly ){.
2850: 20 20 20 20 70 72 69 6e 74 53 71 6c 28 7a 53 71      printSql(zSq
2860: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
2870: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28   int rc;.    if(
2880: 20 67 2e 70 53 74 6d 74 20 29 20 73 71 6c 69 74   g.pStmt ) sqlit
2890: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 67 2e 70 53  e3_finalize(g.pS
28a0: 74 6d 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  tmt);.    rc = s
28b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
28c0: 32 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  2(g.db, zSql, -1
28d0: 2c 20 26 67 2e 70 53 74 6d 74 2c 20 30 29 3b 0a  , &g.pStmt, 0);.
28e0: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
28f0: 20 20 20 20 66 61 74 61 6c 5f 65 72 72 6f 72 28      fatal_error(
2900: 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e  "SQL error: %s\n
2910: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
2920: 67 28 67 2e 64 62 29 29 3b 0a 20 20 20 20 7d 0a  g(g.db));.    }.
2930: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2940: 65 65 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20  ee(zSql);.}../* 
2950: 52 75 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65  Run an SQL state
2960: 6d 65 6e 74 20 70 72 65 76 69 6f 75 73 6c 79 20  ment previously 
2970: 70 72 65 70 61 72 65 64 20 2a 2f 0a 76 6f 69 64  prepared */.void
2980: 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28   speedtest1_run(
2990: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 2c 20  void){.  int i, 
29a0: 6e 2c 20 6c 65 6e 3b 0a 20 20 69 66 28 20 67 2e  n, len;.  if( g.
29b0: 62 53 71 6c 4f 6e 6c 79 20 29 20 72 65 74 75 72  bSqlOnly ) retur
29c0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 67 2e 70  n;.  assert( g.p
29d0: 53 74 6d 74 20 29 3b 0a 20 20 67 2e 6e 52 65 73  Stmt );.  g.nRes
29e0: 75 6c 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ult = 0;.  while
29f0: 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 67  ( sqlite3_step(g
2a00: 2e 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  .pStmt)==SQLITE_
2a10: 52 4f 57 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73  ROW ){.    n = s
2a20: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
2a30: 75 6e 74 28 67 2e 70 53 74 6d 74 29 3b 0a 20 20  unt(g.pStmt);.  
2a40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
2a50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
2a60: 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e  t char *z = (con
2a70: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2a80: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 67 2e 70  _column_text(g.p
2a90: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
2aa0: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22  if( z==0 ) z = "
2ab0: 6e 69 6c 22 3b 0a 20 20 20 20 20 20 6c 65 6e 20  nil";.      len 
2ac0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
2ad0: 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 6e 52  ;.      if( g.nR
2ae0: 65 73 75 6c 74 2b 6c 65 6e 3c 73 69 7a 65 6f 66  esult+len<sizeof
2af0: 28 67 2e 7a 52 65 73 75 6c 74 29 2d 32 20 29 7b  (g.zResult)-2 ){
2b00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 2e 6e  .        if( g.n
2b10: 52 65 73 75 6c 74 3e 30 20 29 20 67 2e 7a 52 65  Result>0 ) g.zRe
2b20: 73 75 6c 74 5b 67 2e 6e 52 65 73 75 6c 74 2b 2b  sult[g.nResult++
2b30: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
2b40: 20 6d 65 6d 63 70 79 28 67 2e 7a 52 65 73 75 6c   memcpy(g.zResul
2b50: 74 20 2b 20 67 2e 6e 52 65 73 75 6c 74 2c 20 7a  t + g.nResult, z
2b60: 2c 20 6c 65 6e 2b 31 29 3b 0a 20 20 20 20 20 20  , len+1);.      
2b70: 20 20 67 2e 6e 52 65 73 75 6c 74 20 2b 3d 20 6c    g.nResult += l
2b80: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
2b90: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 62 52  }.  }.  if( g.bR
2ba0: 65 70 72 65 70 61 72 65 20 29 7b 0a 20 20 20 20  eprepare ){.    
2bb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 4e  sqlite3_stmt *pN
2bc0: 65 77 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ew;.    sqlite3_
2bd0: 70 72 65 70 61 72 65 5f 76 32 28 67 2e 64 62 2c  prepare_v2(g.db,
2be0: 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 67 2e 70   sqlite3_sql(g.p
2bf0: 53 74 6d 74 29 2c 20 2d 31 2c 20 26 70 4e 65 77  Stmt), -1, &pNew
2c00: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2c10: 33 5f 66 69 6e 61 6c 69 7a 65 28 67 2e 70 53 74  3_finalize(g.pSt
2c20: 6d 74 29 3b 0a 20 20 20 20 67 2e 70 53 74 6d 74  mt);.    g.pStmt
2c30: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65 6c 73 65   = pNew;.  }else
2c40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2c50: 73 65 74 28 67 2e 70 53 74 6d 74 29 3b 0a 20 20  set(g.pStmt);.  
2c60: 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 73 71 6c 69  }.}../* The sqli
2c70: 74 65 33 5f 74 72 61 63 65 28 29 20 63 61 6c 6c  te3_trace() call
2c80: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
2c90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
2ca0: 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ceCallback(void 
2cb0: 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
2cc0: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69  char *zSql){.  i
2cd0: 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  nt n = (int)strl
2ce0: 65 6e 28 7a 53 71 6c 29 3b 0a 20 20 77 68 69 6c  en(zSql);.  whil
2cf0: 65 28 20 6e 3e 30 20 26 26 20 28 7a 53 71 6c 5b  e( n>0 && (zSql[
2d00: 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73  n-1]==';' || iss
2d10: 70 61 63 65 28 7a 53 71 6c 5b 6e 2d 31 5d 29 29  pace(zSql[n-1]))
2d20: 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74   ) n--;.  fprint
2d30: 66 28 73 74 64 65 72 72 2c 22 25 2e 2a 73 3b 5c  f(stderr,"%.*s;\
2d40: 6e 22 2c 20 6e 2c 20 7a 53 71 6c 29 3b 0a 7d 0a  n", n, zSql);.}.
2d50: 0a 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 72  ./* Substitute r
2d60: 61 6e 64 6f 6d 28 29 20 66 75 6e 63 74 69 6f 6e  andom() function
2d70: 20 74 68 61 74 20 67 69 76 65 73 20 74 68 65 20   that gives the 
2d80: 73 61 6d 65 20 72 61 6e 64 6f 6d 0a 2a 2a 20 73  same random.** s
2d90: 65 71 75 65 6e 63 65 20 6f 6e 20 65 61 63 68 20  equence on each 
2da0: 72 75 6e 2c 20 66 6f 72 20 72 65 70 65 61 74 61  run, for repeata
2db0: 62 69 6c 69 74 79 2e 20 2a 2f 0a 73 74 61 74 69  bility. */.stati
2dc0: 63 20 76 6f 69 64 20 72 61 6e 64 6f 6d 46 75 6e  c void randomFun
2dd0: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
2de0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
2df0: 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20   int NotUsed,.  
2e00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
2e10: 4e 6f 74 55 73 65 64 32 0a 29 7b 0a 20 20 73 71  NotUsed2.){.  sq
2e20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
2e30: 36 34 28 63 6f 6e 74 65 78 74 2c 20 28 73 71 6c  64(context, (sql
2e40: 69 74 65 33 5f 69 6e 74 36 34 29 73 70 65 65 64  ite3_int64)speed
2e50: 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 29 3b  test1_random());
2e60: 0a 7d 0a 0a 2f 2a 20 45 73 74 69 6d 61 74 65 20  .}../* Estimate 
2e70: 74 68 65 20 73 71 75 61 72 65 20 72 6f 6f 74 20  the square root 
2e80: 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  of an integer */
2e90: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 73 74 5f  .static int est_
2ea0: 73 71 75 61 72 65 5f 72 6f 6f 74 28 69 6e 74 20  square_root(int 
2eb0: 78 29 7b 0a 20 20 69 6e 74 20 79 30 20 3d 20 78  x){.  int y0 = x
2ec0: 2f 32 3b 0a 20 20 69 6e 74 20 79 31 3b 0a 20 20  /2;.  int y1;.  
2ed0: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
2ee0: 3b 20 79 30 3e 30 20 26 26 20 6e 3c 31 30 3b 20  ; y0>0 && n<10; 
2ef0: 6e 2b 2b 29 7b 0a 20 20 20 20 79 31 20 3d 20 28  n++){.    y1 = (
2f00: 79 30 20 2b 20 78 2f 79 30 29 2f 32 3b 0a 20 20  y0 + x/y0)/2;.  
2f10: 20 20 69 66 28 20 79 31 3d 3d 79 30 20 29 20 62    if( y1==y0 ) b
2f20: 72 65 61 6b 3b 0a 20 20 20 20 79 30 20 3d 20 79  reak;.    y0 = y
2f30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
2f40: 79 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  y0;.}../*.** The
2f50: 20 6d 61 69 6e 20 61 6e 64 20 64 65 66 61 75 6c   main and defaul
2f60: 74 20 74 65 73 74 73 65 74 0a 2a 2f 0a 76 6f 69  t testset.*/.voi
2f70: 64 20 74 65 73 74 73 65 74 5f 6d 61 69 6e 28 76  d testset_main(v
2f80: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  oid){.  int i;  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2fb0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  unter */.  int n
2fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 69 74 65 72           /* iter
2fe0: 61 74 69 6f 6e 20 63 6f 75 6e 74 20 2a 2f 0a 20  ation count */. 
2ff0: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3010: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 74 61  * Size of the ta
3020: 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  bles */.  int ma
3030: 78 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xb;             
3040: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3050: 75 6d 20 73 77 69 7a 7a 6c 65 64 20 76 61 6c 75  um swizzled valu
3060: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
3070: 78 31 2c 20 78 32 3b 20 20 20 20 20 20 20 20 20  x1, x2;         
3080: 20 20 20 20 20 2f 2a 20 50 61 72 61 6d 65 74 65       /* Paramete
3090: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b  rs */.  int len;
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
30c0: 6f 66 20 74 68 65 20 7a 4e 75 6d 5b 5d 20 73 74  of the zNum[] st
30d0: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ring */.  char z
30e0: 4e 75 6d 5b 32 30 30 30 5d 3b 20 20 20 20 20 20  Num[2000];      
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 75 6d          /* A num
3100: 62 65 72 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 73  ber name */..  s
3110: 7a 20 3d 20 6e 20 3d 20 67 2e 73 7a 54 65 73 74  z = n = g.szTest
3120: 2a 35 30 30 3b 0a 20 20 6d 61 78 62 20 3d 20 72  *500;.  maxb = r
3130: 6f 75 6e 64 75 70 5f 61 6c 6c 6f 6e 65 73 28 73  oundup_allones(s
3140: 7a 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  z);.  speedtest1
3150: 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 30 30 2c  _begin_test(100,
3160: 20 22 25 64 20 49 4e 53 45 52 54 73 20 69 6e 74   "%d INSERTs int
3170: 6f 20 74 61 62 6c 65 20 77 69 74 68 20 6e 6f 20  o table with no 
3180: 69 6e 64 65 78 22 2c 20 6e 29 3b 0a 20 20 73 70  index", n);.  sp
3190: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 42  eedtest1_exec("B
31a0: 45 47 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74  EGIN");.  speedt
31b0: 65 73 74 31 5f 65 78 65 63 28 22 43 52 45 41 54  est1_exec("CREAT
31c0: 45 20 54 41 42 4c 45 20 74 31 28 61 20 49 4e 54  E TABLE t1(a INT
31d0: 45 47 45 52 20 25 73 2c 20 62 20 49 4e 54 45 47  EGER %s, b INTEG
31e0: 45 52 20 25 73 2c 20 63 20 54 45 58 54 20 25 73  ER %s, c TEXT %s
31f0: 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  );",.           
3200: 20 20 20 20 20 20 20 67 2e 7a 4e 4e 2c 20 67 2e         g.zNN, g.
3210: 7a 4e 4e 2c 20 67 2e 7a 4e 4e 29 3b 0a 20 20 73  zNN, g.zNN);.  s
3220: 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72  peedtest1_prepar
3230: 65 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  e("INSERT INTO t
3240: 31 20 56 41 4c 55 45 53 28 3f 31 2c 3f 32 2c 3f  1 VALUES(?1,?2,?
3250: 33 29 3b 20 2d 2d 20 20 25 64 20 74 69 6d 65 73  3); --  %d times
3260: 22 2c 20 6e 29 3b 0a 20 20 66 6f 72 28 69 3d 31  ", n);.  for(i=1
3270: 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=n; i++){.  
3280: 20 20 78 31 20 3d 20 73 77 69 7a 7a 6c 65 28 69    x1 = swizzle(i
3290: 2c 6d 61 78 62 29 3b 0a 20 20 20 20 73 70 65 65  ,maxb);.    spee
32a0: 64 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d  dtest1_numbernam
32b0: 65 28 78 31 2c 20 7a 4e 75 6d 2c 20 73 69 7a 65  e(x1, zNum, size
32c0: 6f 66 28 7a 4e 75 6d 29 29 3b 0a 20 20 20 20 73  of(zNum));.    s
32d0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
32e0: 34 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 28 73  4(g.pStmt, 1, (s
32f0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78 31 29  qlite3_int64)x1)
3300: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
3310: 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20  nd_int(g.pStmt, 
3320: 32 2c 20 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  2, i);.    sqlit
3330: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 67 2e 70  e3_bind_text(g.p
3340: 53 74 6d 74 2c 20 33 2c 20 7a 4e 75 6d 2c 20 2d  Stmt, 3, zNum, -
3350: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
3360: 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74  );.    speedtest
3370: 31 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73  1_run();.  }.  s
3380: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
3390: 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65  COMMIT");.  spee
33a0: 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28  dtest1_end_test(
33b0: 29 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 3b 0a 20  );...  n = sz;. 
33c0: 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69   speedtest1_begi
33d0: 6e 5f 74 65 73 74 28 31 31 30 2c 20 22 25 64 20  n_test(110, "%d 
33e0: 6f 72 64 65 72 65 64 20 49 4e 53 45 52 54 53 20  ordered INSERTS 
33f0: 77 69 74 68 20 6f 6e 65 20 69 6e 64 65 78 2f 50  with one index/P
3400: 4b 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74  K", n);.  speedt
3410: 65 73 74 31 5f 65 78 65 63 28 22 42 45 47 49 4e  est1_exec("BEGIN
3420: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
3430: 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 54 41  _exec("CREATE TA
3440: 42 4c 45 20 74 32 28 61 20 49 4e 54 45 47 45 52  BLE t2(a INTEGER
3450: 20 25 73 20 25 73 2c 20 62 20 49 4e 54 45 47 45   %s %s, b INTEGE
3460: 52 20 25 73 2c 20 63 20 54 45 58 54 20 25 73 29  R %s, c TEXT %s)
3470: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
3480: 20 20 20 20 20 20 20 20 20 67 2e 7a 4e 4e 2c 20           g.zNN, 
3490: 67 2e 7a 50 4b 2c 20 67 2e 7a 4e 4e 2c 20 67 2e  g.zPK, g.zNN, g.
34a0: 7a 4e 4e 2c 20 67 2e 7a 57 52 29 3b 0a 20 20 73  zNN, g.zWR);.  s
34b0: 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72  peedtest1_prepar
34c0: 65 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  e("INSERT INTO t
34d0: 32 20 56 41 4c 55 45 53 28 3f 31 2c 3f 32 2c 3f  2 VALUES(?1,?2,?
34e0: 33 29 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73 22  3); -- %d times"
34f0: 2c 20 6e 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  , n);.  for(i=1;
3500: 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=n; i++){.   
3510: 20 78 31 20 3d 20 73 77 69 7a 7a 6c 65 28 69 2c   x1 = swizzle(i,
3520: 6d 61 78 62 29 3b 0a 20 20 20 20 73 70 65 65 64  maxb);.    speed
3530: 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65  test1_numbername
3540: 28 78 31 2c 20 7a 4e 75 6d 2c 20 73 69 7a 65 6f  (x1, zNum, sizeo
3550: 66 28 7a 4e 75 6d 29 29 3b 0a 20 20 20 20 73 71  f(zNum));.    sq
3560: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67  lite3_bind_int(g
3570: 2e 70 53 74 6d 74 2c 20 31 2c 20 69 29 3b 0a 20  .pStmt, 1, i);. 
3580: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
3590: 69 6e 74 36 34 28 67 2e 70 53 74 6d 74 2c 20 32  int64(g.pStmt, 2
35a0: 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  , (sqlite3_int64
35b0: 29 78 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  )x1);.    sqlite
35c0: 33 5f 62 69 6e 64 5f 74 65 78 74 28 67 2e 70 53  3_bind_text(g.pS
35d0: 74 6d 74 2c 20 33 2c 20 7a 4e 75 6d 2c 20 2d 31  tmt, 3, zNum, -1
35e0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
35f0: 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  ;.    speedtest1
3600: 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70  _run();.  }.  sp
3610: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43  eedtest1_exec("C
3620: 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64  OMMIT");.  speed
3630: 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29  test1_end_test()
3640: 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 3b 0a 20 20  ;...  n = sz;.  
3650: 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e  speedtest1_begin
3660: 5f 74 65 73 74 28 31 32 30 2c 20 22 25 64 20 75  _test(120, "%d u
3670: 6e 6f 72 64 65 72 65 64 20 49 4e 53 45 52 54 53  nordered INSERTS
3680: 20 77 69 74 68 20 6f 6e 65 20 69 6e 64 65 78 2f   with one index/
3690: 50 4b 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64  PK", n);.  speed
36a0: 74 65 73 74 31 5f 65 78 65 63 28 22 42 45 47 49  test1_exec("BEGI
36b0: 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  N");.  speedtest
36c0: 31 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 54  1_exec("CREATE T
36d0: 41 42 4c 45 20 74 33 28 61 20 49 4e 54 45 47 45  ABLE t3(a INTEGE
36e0: 52 20 25 73 20 25 73 2c 20 62 20 49 4e 54 45 47  R %s %s, b INTEG
36f0: 45 52 20 25 73 2c 20 63 20 54 45 58 54 20 25 73  ER %s, c TEXT %s
3700: 29 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  ) %s",.         
3710: 20 20 20 20 20 20 20 20 20 20 67 2e 7a 4e 4e 2c            g.zNN,
3720: 20 67 2e 7a 50 4b 2c 20 67 2e 7a 4e 4e 2c 20 67   g.zPK, g.zNN, g
3730: 2e 7a 4e 4e 2c 20 67 2e 7a 57 52 29 3b 0a 20 20  .zNN, g.zWR);.  
3740: 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61  speedtest1_prepa
3750: 72 65 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  re("INSERT INTO 
3760: 74 33 20 56 41 4c 55 45 53 28 3f 31 2c 3f 32 2c  t3 VALUES(?1,?2,
3770: 3f 33 29 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73  ?3); -- %d times
3780: 22 2c 20 6e 29 3b 0a 20 20 66 6f 72 28 69 3d 31  ", n);.  for(i=1
3790: 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=n; i++){.  
37a0: 20 20 78 31 20 3d 20 73 77 69 7a 7a 6c 65 28 69    x1 = swizzle(i
37b0: 2c 6d 61 78 62 29 3b 0a 20 20 20 20 73 70 65 65  ,maxb);.    spee
37c0: 64 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d  dtest1_numbernam
37d0: 65 28 78 31 2c 20 7a 4e 75 6d 2c 20 73 69 7a 65  e(x1, zNum, size
37e0: 6f 66 28 7a 4e 75 6d 29 29 3b 0a 20 20 20 20 73  of(zNum));.    s
37f0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
3800: 67 2e 70 53 74 6d 74 2c 20 32 2c 20 69 29 3b 0a  g.pStmt, 2, i);.
3810: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
3820: 5f 69 6e 74 36 34 28 67 2e 70 53 74 6d 74 2c 20  _int64(g.pStmt, 
3830: 31 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  1, (sqlite3_int6
3840: 34 29 78 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  4)x1);.    sqlit
3850: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 67 2e 70  e3_bind_text(g.p
3860: 53 74 6d 74 2c 20 33 2c 20 7a 4e 75 6d 2c 20 2d  Stmt, 3, zNum, -
3870: 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
3880: 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74  );.    speedtest
3890: 31 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73  1_run();.  }.  s
38a0: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
38b0: 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65  COMMIT");.  spee
38c0: 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28  dtest1_end_test(
38d0: 29 3b 0a 0a 0a 20 20 6e 20 3d 20 32 35 3b 0a 20  );...  n = 25;. 
38e0: 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69   speedtest1_begi
38f0: 6e 5f 74 65 73 74 28 31 33 30 2c 20 22 25 64 20  n_test(130, "%d 
3900: 53 45 4c 45 43 54 53 2c 20 6e 75 6d 65 72 69 63  SELECTS, numeric
3910: 20 42 45 54 57 45 45 4e 2c 20 75 6e 69 6e 64 65   BETWEEN, uninde
3920: 78 65 64 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65  xed", n);.  spee
3930: 64 74 65 73 74 31 5f 65 78 65 63 28 22 42 45 47  dtest1_exec("BEG
3940: 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IN");.  speedtes
3950: 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20  t1_prepare(.    
3960: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
3970: 2c 20 61 76 67 28 62 29 2c 20 73 75 6d 28 6c 65  , avg(b), sum(le
3980: 6e 67 74 68 28 63 29 29 20 46 52 4f 4d 20 74 31  ngth(c)) FROM t1
3990: 5c 6e 22 0a 20 20 20 20 22 20 57 48 45 52 45 20  \n".    " WHERE 
39a0: 62 20 42 45 54 57 45 45 4e 20 3f 31 20 41 4e 44  b BETWEEN ?1 AND
39b0: 20 3f 32 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73   ?2; -- %d times
39c0: 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28  ", n.  );.  for(
39d0: 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b  i=1; i<=n; i++){
39e0: 0a 20 20 20 20 78 31 20 3d 20 73 70 65 65 64 74  .    x1 = speedt
39f0: 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 6d 61  est1_random()%ma
3a00: 78 62 3b 0a 20 20 20 20 78 32 20 3d 20 73 70 65  xb;.    x2 = spe
3a10: 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29  edtest1_random()
3a20: 25 31 30 20 2b 20 73 7a 2f 35 30 30 30 20 2b 20  %10 + sz/5000 + 
3a30: 78 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x1;.    sqlite3_
3a40: 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74  bind_int(g.pStmt
3a50: 2c 20 31 2c 20 78 31 29 3b 0a 20 20 20 20 73 71  , 1, x1);.    sq
3a60: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67  lite3_bind_int(g
3a70: 2e 70 53 74 6d 74 2c 20 32 2c 20 78 32 29 3b 0a  .pStmt, 2, x2);.
3a80: 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72      speedtest1_r
3a90: 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65  un();.  }.  spee
3aa0: 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d  dtest1_exec("COM
3ab0: 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65  MIT");.  speedte
3ac0: 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a  st1_end_test();.
3ad0: 0a 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20 73 70  ..  n = 10;.  sp
3ae0: 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74  eedtest1_begin_t
3af0: 65 73 74 28 31 34 30 2c 20 22 25 64 20 53 45 4c  est(140, "%d SEL
3b00: 45 43 54 53 2c 20 4c 49 4b 45 2c 20 75 6e 69 6e  ECTS, LIKE, unin
3b10: 64 65 78 65 64 22 2c 20 6e 29 3b 0a 20 20 73 70  dexed", n);.  sp
3b20: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 42  eedtest1_exec("B
3b30: 45 47 49 4e 22 29 3b 0a 20 20 73 70 65 65 64 74  EGIN");.  speedt
3b40: 65 73 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20  est1_prepare(.  
3b50: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
3b60: 2a 29 2c 20 61 76 67 28 62 29 2c 20 73 75 6d 28  *), avg(b), sum(
3b70: 6c 65 6e 67 74 68 28 63 29 29 20 46 52 4f 4d 20  length(c)) FROM 
3b80: 74 31 5c 6e 22 0a 20 20 20 20 22 20 57 48 45 52  t1\n".    " WHER
3b90: 45 20 63 20 4c 49 4b 45 20 3f 31 3b 20 2d 2d 20  E c LIKE ?1; -- 
3ba0: 25 64 20 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29  %d times", n.  )
3bb0: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
3bc0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20  n; i++){.    x1 
3bd0: 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e  = speedtest1_ran
3be0: 64 6f 6d 28 29 25 6d 61 78 62 3b 0a 20 20 20 20  dom()%maxb;.    
3bf0: 7a 4e 75 6d 5b 30 5d 20 3d 20 27 25 27 3b 0a 20  zNum[0] = '%';. 
3c00: 20 20 20 6c 65 6e 20 3d 20 73 70 65 65 64 74 65     len = speedte
3c10: 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 69  st1_numbername(i
3c20: 2c 20 7a 4e 75 6d 2b 31 2c 20 73 69 7a 65 6f 66  , zNum+1, sizeof
3c30: 28 7a 4e 75 6d 29 2d 32 29 3b 0a 20 20 20 20 7a  (zNum)-2);.    z
3c40: 4e 75 6d 5b 6c 65 6e 5d 20 3d 20 27 25 27 3b 0a  Num[len] = '%';.
3c50: 20 20 20 20 7a 4e 75 6d 5b 6c 65 6e 2b 31 5d 20      zNum[len+1] 
3c60: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
3c70: 5f 62 69 6e 64 5f 74 65 78 74 28 67 2e 70 53 74  _bind_text(g.pSt
3c80: 6d 74 2c 20 31 2c 20 7a 4e 75 6d 2c 20 6c 65 6e  mt, 1, zNum, len
3c90: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
3ca0: 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  ;.    speedtest1
3cb0: 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70  _run();.  }.  sp
3cc0: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43  eedtest1_exec("C
3cd0: 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64  OMMIT");.  speed
3ce0: 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29  test1_end_test()
3cf0: 3b 0a 0a 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20  ;...  n = 10;.  
3d00: 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e  speedtest1_begin
3d10: 5f 74 65 73 74 28 31 34 32 2c 20 22 25 64 20 53  _test(142, "%d S
3d20: 45 4c 45 43 54 53 20 77 2f 4f 52 44 45 52 20 42  ELECTS w/ORDER B
3d30: 59 2c 20 75 6e 69 6e 64 65 78 65 64 22 2c 20 6e  Y, unindexed", n
3d40: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
3d50: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
3d60: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
3d70: 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54  are(.    "SELECT
3d80: 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31   a, b, c FROM t1
3d90: 20 57 48 45 52 45 20 63 20 4c 49 4b 45 20 3f 31   WHERE c LIKE ?1
3da0: 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  \n".    " ORDER 
3db0: 42 59 20 61 3b 20 2d 2d 20 25 64 20 74 69 6d 65  BY a; -- %d time
3dc0: 73 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72  s", n.  );.  for
3dd0: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
3de0: 7b 0a 20 20 20 20 78 31 20 3d 20 73 70 65 65 64  {.    x1 = speed
3df0: 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 6d  test1_random()%m
3e00: 61 78 62 3b 0a 20 20 20 20 7a 4e 75 6d 5b 30 5d  axb;.    zNum[0]
3e10: 20 3d 20 27 25 27 3b 0a 20 20 20 20 6c 65 6e 20   = '%';.    len 
3e20: 3d 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d  = speedtest1_num
3e30: 62 65 72 6e 61 6d 65 28 69 2c 20 7a 4e 75 6d 2b  bername(i, zNum+
3e40: 31 2c 20 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 2d  1, sizeof(zNum)-
3e50: 32 29 3b 0a 20 20 20 20 7a 4e 75 6d 5b 6c 65 6e  2);.    zNum[len
3e60: 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20 7a 4e 75  ] = '%';.    zNu
3e70: 6d 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20  m[len+1] = 0;.  
3e80: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
3e90: 65 78 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20  ext(g.pStmt, 1, 
3ea0: 7a 4e 75 6d 2c 20 6c 65 6e 2c 20 53 51 4c 49 54  zNum, len, SQLIT
3eb0: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  E_STATIC);.    s
3ec0: 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b  peedtest1_run();
3ed0: 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74  .  }.  speedtest
3ee0: 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29  1_exec("COMMIT")
3ef0: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
3f00: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 6e 20  nd_test();..  n 
3f10: 3d 20 31 30 3b 20 2f 2f 67 2e 73 7a 54 65 73 74  = 10; //g.szTest
3f20: 2f 35 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  /5;.  speedtest1
3f30: 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 34 35 2c  _begin_test(145,
3f40: 20 22 25 64 20 53 45 4c 45 43 54 53 20 77 2f 4f   "%d SELECTS w/O
3f50: 52 44 45 52 20 42 59 20 61 6e 64 20 4c 49 4d 49  RDER BY and LIMI
3f60: 54 2c 20 75 6e 69 6e 64 65 78 65 64 22 2c 20 6e  T, unindexed", n
3f70: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
3f80: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
3f90: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
3fa0: 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54  are(.    "SELECT
3fb0: 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 31   a, b, c FROM t1
3fc0: 20 57 48 45 52 45 20 63 20 4c 49 4b 45 20 3f 31   WHERE c LIKE ?1
3fd0: 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20  \n".    " ORDER 
3fe0: 42 59 20 61 20 4c 49 4d 49 54 20 31 30 3b 20 2d  BY a LIMIT 10; -
3ff0: 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e 0a 20  - %d times", n. 
4000: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   );.  for(i=1; i
4010: 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78  <=n; i++){.    x
4020: 31 20 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72  1 = speedtest1_r
4030: 61 6e 64 6f 6d 28 29 25 6d 61 78 62 3b 0a 20 20  andom()%maxb;.  
4040: 20 20 7a 4e 75 6d 5b 30 5d 20 3d 20 27 25 27 3b    zNum[0] = '%';
4050: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 70 65 65 64  .    len = speed
4060: 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65  test1_numbername
4070: 28 69 2c 20 7a 4e 75 6d 2b 31 2c 20 73 69 7a 65  (i, zNum+1, size
4080: 6f 66 28 7a 4e 75 6d 29 2d 32 29 3b 0a 20 20 20  of(zNum)-2);.   
4090: 20 7a 4e 75 6d 5b 6c 65 6e 5d 20 3d 20 27 25 27   zNum[len] = '%'
40a0: 3b 0a 20 20 20 20 7a 4e 75 6d 5b 6c 65 6e 2b 31  ;.    zNum[len+1
40b0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
40c0: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 67 2e 70  e3_bind_text(g.p
40d0: 53 74 6d 74 2c 20 31 2c 20 7a 4e 75 6d 2c 20 6c  Stmt, 1, zNum, l
40e0: 65 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  en, SQLITE_STATI
40f0: 43 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73  C);.    speedtes
4100: 74 31 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20  t1_run();.  }.  
4110: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
4120: 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65  "COMMIT");.  spe
4130: 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74  edtest1_end_test
4140: 28 29 3b 0a 0a 0a 20 20 73 70 65 65 64 74 65 73  ();...  speedtes
4150: 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 35  t1_begin_test(15
4160: 30 2c 20 22 43 52 45 41 54 45 20 49 4e 44 45 58  0, "CREATE INDEX
4170: 20 66 69 76 65 20 74 69 6d 65 73 22 29 3b 0a 20   five times");. 
4180: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
4190: 28 22 42 45 47 49 4e 3b 22 29 3b 0a 20 20 73 70  ("BEGIN;");.  sp
41a0: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43  eedtest1_exec("C
41b0: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
41c0: 45 58 20 74 31 62 20 4f 4e 20 74 31 28 62 29 3b  EX t1b ON t1(b);
41d0: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
41e0: 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 49 4e  _exec("CREATE IN
41f0: 44 45 58 20 74 31 63 20 4f 4e 20 74 31 28 63 29  DEX t1c ON t1(c)
4200: 3b 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  ;");.  speedtest
4210: 31 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 55  1_exec("CREATE U
4220: 4e 49 51 55 45 20 49 4e 44 45 58 20 74 32 62 20  NIQUE INDEX t2b 
4230: 4f 4e 20 74 32 28 62 29 3b 22 29 3b 0a 20 20 73  ON t2(b);");.  s
4240: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
4250: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 32 63  CREATE INDEX t2c
4260: 20 4f 4e 20 74 32 28 63 20 44 45 53 43 29 3b 22   ON t2(c DESC);"
4270: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
4280: 65 78 65 63 28 22 43 52 45 41 54 45 20 49 4e 44  exec("CREATE IND
4290: 45 58 20 74 33 62 63 20 4f 4e 20 74 33 28 62 2c  EX t3bc ON t3(b,
42a0: 63 29 3b 22 29 3b 0a 20 20 73 70 65 65 64 74 65  c);");.  speedte
42b0: 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54  st1_exec("COMMIT
42c0: 3b 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  ;");.  speedtest
42d0: 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a  1_end_test();...
42e0: 20 20 6e 20 3d 20 73 7a 2f 35 3b 0a 20 20 73 70    n = sz/5;.  sp
42f0: 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74  eedtest1_begin_t
4300: 65 73 74 28 31 36 30 2c 20 22 25 64 20 53 45 4c  est(160, "%d SEL
4310: 45 43 54 53 2c 20 6e 75 6d 65 72 69 63 20 42 45  ECTS, numeric BE
4320: 54 57 45 45 4e 2c 20 69 6e 64 65 78 65 64 22 2c  TWEEN, indexed",
4330: 20 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74   n);.  speedtest
4340: 31 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b  1_exec("BEGIN");
4350: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 70 72  .  speedtest1_pr
4360: 65 70 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45  epare(.    "SELE
4370: 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 61 76 67  CT count(*), avg
4380: 28 62 29 2c 20 73 75 6d 28 6c 65 6e 67 74 68 28  (b), sum(length(
4390: 63 29 29 20 46 52 4f 4d 20 74 31 5c 6e 22 0a 20  c)) FROM t1\n". 
43a0: 20 20 20 22 20 57 48 45 52 45 20 62 20 42 45 54     " WHERE b BET
43b0: 57 45 45 4e 20 3f 31 20 41 4e 44 20 3f 32 3b 20  WEEN ?1 AND ?2; 
43c0: 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e 0a  -- %d times", n.
43d0: 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20    );.  for(i=1; 
43e0: 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=n; i++){.    
43f0: 78 31 20 3d 20 73 70 65 65 64 74 65 73 74 31 5f  x1 = speedtest1_
4400: 72 61 6e 64 6f 6d 28 29 25 6d 61 78 62 3b 0a 20  random()%maxb;. 
4410: 20 20 20 78 32 20 3d 20 73 70 65 65 64 74 65 73     x2 = speedtes
4420: 74 31 5f 72 61 6e 64 6f 6d 28 29 25 31 30 20 2b  t1_random()%10 +
4430: 20 73 7a 2f 35 30 30 30 20 2b 20 78 31 3b 0a 20   sz/5000 + x1;. 
4440: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
4450: 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20  int(g.pStmt, 1, 
4460: 78 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  x1);.    sqlite3
4470: 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d  _bind_int(g.pStm
4480: 74 2c 20 32 2c 20 78 32 29 3b 0a 20 20 20 20 73  t, 2, x2);.    s
4490: 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b  peedtest1_run();
44a0: 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74  .  }.  speedtest
44b0: 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29  1_exec("COMMIT")
44c0: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
44d0: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e  nd_test();...  n
44e0: 20 3d 20 73 7a 2f 35 3b 0a 20 20 73 70 65 65 64   = sz/5;.  speed
44f0: 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74  test1_begin_test
4500: 28 31 36 31 2c 20 22 25 64 20 53 45 4c 45 43 54  (161, "%d SELECT
4510: 53 2c 20 6e 75 6d 65 72 69 63 20 42 45 54 57 45  S, numeric BETWE
4520: 45 4e 2c 20 50 4b 22 2c 20 6e 29 3b 0a 20 20 73  EN, PK", n);.  s
4530: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
4540: 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65 65 64  BEGIN");.  speed
4550: 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 0a 20  test1_prepare(. 
4560: 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
4570: 28 2a 29 2c 20 61 76 67 28 62 29 2c 20 73 75 6d  (*), avg(b), sum
4580: 28 6c 65 6e 67 74 68 28 63 29 29 20 46 52 4f 4d  (length(c)) FROM
4590: 20 74 32 5c 6e 22 0a 20 20 20 20 22 20 57 48 45   t2\n".    " WHE
45a0: 52 45 20 61 20 42 45 54 57 45 45 4e 20 3f 31 20  RE a BETWEEN ?1 
45b0: 41 4e 44 20 3f 32 3b 20 2d 2d 20 25 64 20 74 69  AND ?2; -- %d ti
45c0: 6d 65 73 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66  mes", n.  );.  f
45d0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b  or(i=1; i<=n; i+
45e0: 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73 70 65  +){.    x1 = spe
45f0: 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29  edtest1_random()
4600: 25 6d 61 78 62 3b 0a 20 20 20 20 78 32 20 3d 20  %maxb;.    x2 = 
4610: 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f  speedtest1_rando
4620: 6d 28 29 25 31 30 20 2b 20 73 7a 2f 35 30 30 30  m()%10 + sz/5000
4630: 20 2b 20 78 31 3b 0a 20 20 20 20 73 71 6c 69 74   + x1;.    sqlit
4640: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
4650: 74 6d 74 2c 20 31 2c 20 78 31 29 3b 0a 20 20 20  tmt, 1, x1);.   
4660: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
4670: 74 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 78 32  t(g.pStmt, 2, x2
4680: 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74  );.    speedtest
4690: 31 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73  1_run();.  }.  s
46a0: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
46b0: 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65  COMMIT");.  spee
46c0: 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28  dtest1_end_test(
46d0: 29 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 2f 35 3b  );...  n = sz/5;
46e0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65  .  speedtest1_be
46f0: 67 69 6e 5f 74 65 73 74 28 31 37 30 2c 20 22 25  gin_test(170, "%
4700: 64 20 53 45 4c 45 43 54 53 2c 20 74 65 78 74 20  d SELECTS, text 
4710: 42 45 54 57 45 45 4e 2c 20 69 6e 64 65 78 65 64  BETWEEN, indexed
4720: 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74 65  ", n);.  speedte
4730: 73 74 31 5f 65 78 65 63 28 22 42 45 47 49 4e 22  st1_exec("BEGIN"
4740: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
4750: 70 72 65 70 61 72 65 28 0a 20 20 20 20 22 53 45  prepare(.    "SE
4760: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 61  LECT count(*), a
4770: 76 67 28 62 29 2c 20 73 75 6d 28 6c 65 6e 67 74  vg(b), sum(lengt
4780: 68 28 63 29 29 20 46 52 4f 4d 20 74 31 5c 6e 22  h(c)) FROM t1\n"
4790: 0a 20 20 20 20 22 20 57 48 45 52 45 20 63 20 42  .    " WHERE c B
47a0: 45 54 57 45 45 4e 20 3f 31 20 41 4e 44 20 28 3f  ETWEEN ?1 AND (?
47b0: 31 7c 7c 27 7e 27 29 3b 20 2d 2d 20 25 64 20 74  1||'~'); -- %d t
47c0: 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b 0a 20 20  imes", n.  );.  
47d0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69  for(i=1; i<=n; i
47e0: 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73 77  ++){.    x1 = sw
47f0: 69 7a 7a 6c 65 28 69 2c 20 6d 61 78 62 29 3b 0a  izzle(i, maxb);.
4800: 20 20 20 20 6c 65 6e 20 3d 20 73 70 65 65 64 74      len = speedt
4810: 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28  est1_numbername(
4820: 78 31 2c 20 7a 4e 75 6d 2c 20 73 69 7a 65 6f 66  x1, zNum, sizeof
4830: 28 7a 4e 75 6d 29 2d 31 29 3b 0a 20 20 20 20 73  (zNum)-1);.    s
4840: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
4850: 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 75  (g.pStmt, 1, zNu
4860: 6d 2c 20 6c 65 6e 2c 20 53 51 4c 49 54 45 5f 53  m, len, SQLITE_S
4870: 54 41 54 49 43 29 3b 0a 20 20 20 20 73 70 65 65  TATIC);.    spee
4880: 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20  dtest1_run();.  
4890: 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  }.  speedtest1_e
48a0: 78 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b 0a 20  xec("COMMIT");. 
48b0: 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f   speedtest1_end_
48c0: 74 65 73 74 28 29 3b 0a 0a 20 20 6e 20 3d 20 73  test();..  n = s
48d0: 7a 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  z;.  speedtest1_
48e0: 62 65 67 69 6e 5f 74 65 73 74 28 31 38 30 2c 20  begin_test(180, 
48f0: 22 25 64 20 49 4e 53 45 52 54 53 20 77 69 74 68  "%d INSERTS with
4900: 20 74 68 72 65 65 20 69 6e 64 65 78 65 73 22 2c   three indexes",
4910: 20 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74   n);.  speedtest
4920: 31 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b  1_exec("BEGIN");
4930: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
4940: 65 63 28 0a 20 20 20 20 22 43 52 45 41 54 45 20  ec(.    "CREATE 
4950: 54 41 42 4c 45 20 74 34 28 5c 6e 22 0a 20 20 20  TABLE t4(\n".   
4960: 20 22 20 20 61 20 49 4e 54 45 47 45 52 20 25 73   "  a INTEGER %s
4970: 20 25 73 2c 5c 6e 22 0a 20 20 20 20 22 20 20 62   %s,\n".    "  b
4980: 20 49 4e 54 45 47 45 52 20 25 73 2c 5c 6e 22 0a   INTEGER %s,\n".
4990: 20 20 20 20 22 20 20 63 20 54 45 58 54 20 25 73      "  c TEXT %s
49a0: 5c 6e 22 0a 20 20 20 20 22 29 20 25 73 22 2c 0a  \n".    ") %s",.
49b0: 20 20 20 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 50 4b      g.zNN, g.zPK
49c0: 2c 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 4e 4e 2c 20  , g.zNN, g.zNN, 
49d0: 67 2e 7a 57 52 29 3b 0a 20 20 73 70 65 65 64 74  g.zWR);.  speedt
49e0: 65 73 74 31 5f 65 78 65 63 28 22 43 52 45 41 54  est1_exec("CREAT
49f0: 45 20 49 4e 44 45 58 20 74 34 62 20 4f 4e 20 74  E INDEX t4b ON t
4a00: 34 28 62 29 22 29 3b 0a 20 20 73 70 65 65 64 74  4(b)");.  speedt
4a10: 65 73 74 31 5f 65 78 65 63 28 22 43 52 45 41 54  est1_exec("CREAT
4a20: 45 20 49 4e 44 45 58 20 74 34 63 20 4f 4e 20 74  E INDEX t4c ON t
4a30: 34 28 63 29 22 29 3b 0a 20 20 73 70 65 65 64 74  4(c)");.  speedt
4a40: 65 73 74 31 5f 65 78 65 63 28 22 49 4e 53 45 52  est1_exec("INSER
4a50: 54 20 49 4e 54 4f 20 74 34 20 53 45 4c 45 43 54  T INTO t4 SELECT
4a60: 20 2a 20 46 52 4f 4d 20 74 31 22 29 3b 0a 20 20   * FROM t1");.  
4a70: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
4a80: 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65  "COMMIT");.  spe
4a90: 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74  edtest1_end_test
4aa0: 28 29 3b 0a 0a 20 20 6e 20 3d 20 73 7a 3b 0a 20  ();..  n = sz;. 
4ab0: 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69   speedtest1_begi
4ac0: 6e 5f 74 65 73 74 28 31 39 30 2c 20 22 44 45 4c  n_test(190, "DEL
4ad0: 45 54 45 20 61 6e 64 20 52 45 46 49 4c 4c 20 6f  ETE and REFILL o
4ae0: 6e 65 20 74 61 62 6c 65 22 2c 20 6e 29 3b 0a 20  ne table", n);. 
4af0: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
4b00: 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32  ("DELETE FROM t2
4b10: 3b 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  ;");.  speedtest
4b20: 31 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 49  1_exec("INSERT I
4b30: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 2a 20  NTO t2 SELECT * 
4b40: 46 52 4f 4d 20 74 31 3b 22 29 3b 0a 20 20 73 70  FROM t1;");.  sp
4b50: 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73  eedtest1_end_tes
4b60: 74 28 29 3b 0a 0a 0a 20 20 73 70 65 65 64 74 65  t();...  speedte
4b70: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 32  st1_begin_test(2
4b80: 30 30 2c 20 22 56 41 43 55 55 4d 22 29 3b 0a 20  00, "VACUUM");. 
4b90: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
4ba0: 28 22 56 41 43 55 55 4d 22 29 3b 0a 20 20 73 70  ("VACUUM");.  sp
4bb0: 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73  eedtest1_end_tes
4bc0: 74 28 29 3b 0a 0a 0a 20 20 73 70 65 65 64 74 65  t();...  speedte
4bd0: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 32  st1_begin_test(2
4be0: 31 30 2c 20 22 41 4c 54 45 52 20 54 41 42 4c 45  10, "ALTER TABLE
4bf0: 20 41 44 44 20 43 4f 4c 55 4d 4e 2c 20 61 6e 64   ADD COLUMN, and
4c00: 20 71 75 65 72 79 22 29 3b 0a 20 20 73 70 65 65   query");.  spee
4c10: 64 74 65 73 74 31 5f 65 78 65 63 28 22 41 4c 54  dtest1_exec("ALT
4c20: 45 52 20 54 41 42 4c 45 20 74 32 20 41 44 44 20  ER TABLE t2 ADD 
4c30: 43 4f 4c 55 4d 4e 20 64 20 44 45 46 41 55 4c 54  COLUMN d DEFAULT
4c40: 20 31 32 33 22 29 3b 0a 20 20 73 70 65 65 64 74   123");.  speedt
4c50: 65 73 74 31 5f 65 78 65 63 28 22 53 45 4c 45 43  est1_exec("SELEC
4c60: 54 20 73 75 6d 28 64 29 20 46 52 4f 4d 20 74 32  T sum(d) FROM t2
4c70: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
4c80: 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20  _end_test();... 
4c90: 20 6e 20 3d 20 73 7a 2f 35 3b 0a 20 20 73 70 65   n = sz/5;.  spe
4ca0: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
4cb0: 73 74 28 32 33 30 2c 20 22 25 64 20 55 50 44 41  st(230, "%d UPDA
4cc0: 54 45 53 2c 20 6e 75 6d 65 72 69 63 20 42 45 54  TES, numeric BET
4cd0: 57 45 45 4e 2c 20 69 6e 64 65 78 65 64 22 2c 20  WEEN, indexed", 
4ce0: 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  n);.  speedtest1
4cf0: 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a  _exec("BEGIN");.
4d00: 20 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65    speedtest1_pre
4d10: 70 61 72 65 28 0a 20 20 20 20 22 55 50 44 41 54  pare(.    "UPDAT
4d20: 45 20 74 32 20 53 45 54 20 64 3d 62 2a 32 20 57  E t2 SET d=b*2 W
4d30: 48 45 52 45 20 62 20 42 45 54 57 45 45 4e 20 3f  HERE b BETWEEN ?
4d40: 31 20 41 4e 44 20 3f 32 3b 20 2d 2d 20 25 64 20  1 AND ?2; -- %d 
4d50: 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b 0a 20  times", n.  );. 
4d60: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20   for(i=1; i<=n; 
4d70: 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73  i++){.    x1 = s
4d80: 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d  peedtest1_random
4d90: 28 29 25 6d 61 78 62 3b 0a 20 20 20 20 78 32 20  ()%maxb;.    x2 
4da0: 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e  = speedtest1_ran
4db0: 64 6f 6d 28 29 25 31 30 20 2b 20 73 7a 2f 35 30  dom()%10 + sz/50
4dc0: 30 30 20 2b 20 78 31 3b 0a 20 20 20 20 73 71 6c  00 + x1;.    sql
4dd0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
4de0: 70 53 74 6d 74 2c 20 31 2c 20 78 31 29 3b 0a 20  pStmt, 1, x1);. 
4df0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
4e00: 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20  int(g.pStmt, 2, 
4e10: 78 32 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65  x2);.    speedte
4e20: 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20  st1_run();.  }. 
4e30: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
4e40: 28 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70  ("COMMIT");.  sp
4e50: 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73  eedtest1_end_tes
4e60: 74 28 29 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 3b  t();...  n = sz;
4e70: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65  .  speedtest1_be
4e80: 67 69 6e 5f 74 65 73 74 28 32 34 30 2c 20 22 25  gin_test(240, "%
4e90: 64 20 55 50 44 41 54 45 53 20 6f 66 20 69 6e 64  d UPDATES of ind
4ea0: 69 76 69 64 75 61 6c 20 72 6f 77 73 22 2c 20 6e  ividual rows", n
4eb0: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
4ec0: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
4ed0: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
4ee0: 61 72 65 28 0a 20 20 20 20 22 55 50 44 41 54 45  are(.    "UPDATE
4ef0: 20 74 32 20 53 45 54 20 64 3d 62 2a 33 20 57 48   t2 SET d=b*3 WH
4f00: 45 52 45 20 61 3d 3f 31 3b 20 2d 2d 20 25 64 20  ERE a=?1; -- %d 
4f10: 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b 0a 20  times", n.  );. 
4f20: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20   for(i=1; i<=n; 
4f30: 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73  i++){.    x1 = s
4f40: 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d  peedtest1_random
4f50: 28 29 25 73 7a 20 2b 20 31 3b 0a 20 20 20 20 73  ()%sz + 1;.    s
4f60: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
4f70: 67 2e 70 53 74 6d 74 2c 20 31 2c 20 78 31 29 3b  g.pStmt, 1, x1);
4f80: 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f  .    speedtest1_
4f90: 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65  run();.  }.  spe
4fa0: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f  edtest1_exec("CO
4fb0: 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74  MMIT");.  speedt
4fc0: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
4fd0: 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62  ..  speedtest1_b
4fe0: 65 67 69 6e 5f 74 65 73 74 28 32 35 30 2c 20 22  egin_test(250, "
4ff0: 4f 6e 65 20 62 69 67 20 55 50 44 41 54 45 20 6f  One big UPDATE o
5000: 66 20 74 68 65 20 77 68 6f 6c 65 20 25 64 2d 72  f the whole %d-r
5010: 6f 77 20 74 61 62 6c 65 22 2c 20 73 7a 29 3b 0a  ow table", sz);.
5020: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
5030: 63 28 22 55 50 44 41 54 45 20 74 32 20 53 45 54  c("UPDATE t2 SET
5040: 20 64 3d 62 2a 34 22 29 3b 0a 20 20 73 70 65 65   d=b*4");.  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 20 20 73 70 65 65 64 74 65 73 74  );...  speedtest
5070: 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 32 36 30  1_begin_test(260
5080: 2c 20 22 51 75 65 72 79 20 61 64 64 65 64 20 63  , "Query added c
5090: 6f 6c 75 6d 6e 20 61 66 74 65 72 20 66 69 6c 6c  olumn after fill
50a0: 69 6e 67 22 29 3b 0a 20 20 73 70 65 65 64 74 65  ing");.  speedte
50b0: 73 74 31 5f 65 78 65 63 28 22 53 45 4c 45 43 54  st1_exec("SELECT
50c0: 20 73 75 6d 28 64 29 20 46 52 4f 4d 20 74 32 22   sum(d) FROM t2"
50d0: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
50e0: 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 0a 20  end_test();.... 
50f0: 20 6e 20 3d 20 73 7a 2f 35 3b 0a 20 20 73 70 65   n = sz/5;.  spe
5100: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
5110: 73 74 28 32 37 30 2c 20 22 25 64 20 44 45 4c 45  st(270, "%d DELE
5120: 54 45 73 2c 20 6e 75 6d 65 72 69 63 20 42 45 54  TEs, numeric BET
5130: 57 45 45 4e 2c 20 69 6e 64 65 78 65 64 22 2c 20  WEEN, indexed", 
5140: 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  n);.  speedtest1
5150: 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a  _exec("BEGIN");.
5160: 20 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65    speedtest1_pre
5170: 70 61 72 65 28 0a 20 20 20 20 22 44 45 4c 45 54  pare(.    "DELET
5180: 45 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20  E FROM t2 WHERE 
5190: 62 20 42 45 54 57 45 45 4e 20 3f 31 20 41 4e 44  b BETWEEN ?1 AND
51a0: 20 3f 32 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73   ?2; -- %d times
51b0: 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28  ", n.  );.  for(
51c0: 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b  i=1; i<=n; i++){
51d0: 0a 20 20 20 20 78 31 20 3d 20 73 70 65 65 64 74  .    x1 = speedt
51e0: 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 6d 61  est1_random()%ma
51f0: 78 62 20 2b 20 31 3b 0a 20 20 20 20 78 32 20 3d  xb + 1;.    x2 =
5200: 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64   speedtest1_rand
5210: 6f 6d 28 29 25 31 30 20 2b 20 73 7a 2f 35 30 30  om()%10 + sz/500
5220: 30 20 2b 20 78 31 3b 0a 20 20 20 20 73 71 6c 69  0 + x1;.    sqli
5230: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70  te3_bind_int(g.p
5240: 53 74 6d 74 2c 20 31 2c 20 78 31 29 3b 0a 20 20  Stmt, 1, x1);.  
5250: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
5260: 6e 74 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 78  nt(g.pStmt, 2, x
5270: 32 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73  2);.    speedtes
5280: 74 31 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20  t1_run();.  }.  
5290: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
52a0: 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65  "COMMIT");.  spe
52b0: 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74  edtest1_end_test
52c0: 28 29 3b 0a 0a 0a 20 20 6e 20 3d 20 73 7a 3b 0a  ();...  n = sz;.
52d0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67    speedtest1_beg
52e0: 69 6e 5f 74 65 73 74 28 32 38 30 2c 20 22 25 64  in_test(280, "%d
52f0: 20 44 45 4c 45 54 45 73 20 6f 66 20 69 6e 64 69   DELETEs of indi
5300: 76 69 64 75 61 6c 20 72 6f 77 73 22 2c 20 6e 29  vidual rows", n)
5310: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
5320: 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20  xec("BEGIN");.  
5330: 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61  speedtest1_prepa
5340: 72 65 28 0a 20 20 20 20 22 44 45 4c 45 54 45 20  re(.    "DELETE 
5350: 46 52 4f 4d 20 74 33 20 57 48 45 52 45 20 61 3d  FROM t3 WHERE a=
5360: 3f 31 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73 22  ?1; -- %d times"
5370: 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69  , n.  );.  for(i
5380: 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a  =1; i<=n; i++){.
5390: 20 20 20 20 78 31 20 3d 20 73 70 65 65 64 74 65      x1 = speedte
53a0: 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 73 7a 20  st1_random()%sz 
53b0: 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 1;.    sqlite3
53c0: 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d  _bind_int(g.pStm
53d0: 74 2c 20 31 2c 20 78 31 29 3b 0a 20 20 20 20 73  t, 1, x1);.    s
53e0: 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b  peedtest1_run();
53f0: 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74  .  }.  speedtest
5400: 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29  1_exec("COMMIT")
5410: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
5420: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 73  nd_test();...  s
5430: 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f  peedtest1_begin_
5440: 74 65 73 74 28 32 39 30 2c 20 22 52 65 66 69 6c  test(290, "Refil
5450: 6c 20 74 77 6f 20 25 64 2d 72 6f 77 20 74 61 62  l two %d-row tab
5460: 6c 65 73 20 75 73 69 6e 67 20 52 45 50 4c 41 43  les using REPLAC
5470: 45 22 2c 20 73 7a 29 3b 0a 20 20 73 70 65 65 64  E", sz);.  speed
5480: 74 65 73 74 31 5f 65 78 65 63 28 22 52 45 50 4c  test1_exec("REPL
5490: 41 43 45 20 49 4e 54 4f 20 74 32 28 61 2c 62 2c  ACE INTO t2(a,b,
54a0: 63 29 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 20  c) SELECT a,b,c 
54b0: 46 52 4f 4d 20 74 31 22 29 3b 0a 20 20 73 70 65  FROM t1");.  spe
54c0: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 52 45  edtest1_exec("RE
54d0: 50 4c 41 43 45 20 49 4e 54 4f 20 74 33 28 61 2c  PLACE INTO t3(a,
54e0: 62 2c 63 29 20 53 45 4c 45 43 54 20 61 2c 62 2c  b,c) SELECT a,b,
54f0: 63 20 46 52 4f 4d 20 74 31 22 29 3b 0a 20 20 73  c FROM t1");.  s
5500: 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65  peedtest1_end_te
5510: 73 74 28 29 3b 0a 0a 20 20 73 70 65 65 64 74 65  st();..  speedte
5520: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 33  st1_begin_test(3
5530: 30 30 2c 20 22 52 65 66 69 6c 6c 20 61 20 25 64  00, "Refill a %d
5540: 2d 72 6f 77 20 74 61 62 6c 65 20 75 73 69 6e 67  -row table using
5550: 20 28 62 26 31 29 3d 3d 28 61 26 31 29 22 2c 20   (b&1)==(a&1)", 
5560: 73 7a 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  sz);.  speedtest
5570: 31 5f 65 78 65 63 28 22 44 45 4c 45 54 45 20 46  1_exec("DELETE F
5580: 52 4f 4d 20 74 32 3b 22 29 3b 0a 20 20 73 70 65  ROM t2;");.  spe
5590: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 49 4e  edtest1_exec("IN
55a0: 53 45 52 54 20 49 4e 54 4f 20 74 32 28 61 2c 62  SERT INTO t2(a,b
55b0: 2c 63 29 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  ,c)\n".         
55c0: 20 20 20 20 20 20 20 20 20 22 20 53 45 4c 45 43           " SELEC
55d0: 54 20 61 2c 62 2c 63 20 46 52 4f 4d 20 74 31 20  T a,b,c FROM t1 
55e0: 20 57 48 45 52 45 20 28 62 26 31 29 3d 3d 28 61   WHERE (b&1)==(a
55f0: 26 31 29 3b 22 29 3b 0a 20 20 73 70 65 65 64 74  &1);");.  speedt
5600: 65 73 74 31 5f 65 78 65 63 28 22 49 4e 53 45 52  est1_exec("INSER
5610: 54 20 49 4e 54 4f 20 74 32 28 61 2c 62 2c 63 29  T INTO t2(a,b,c)
5620: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
5630: 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20 61        " SELECT a
5640: 2c 62 2c 63 20 46 52 4f 4d 20 74 31 20 20 57 48  ,b,c FROM t1  WH
5650: 45 52 45 20 28 62 26 31 29 3c 3e 28 61 26 31 29  ERE (b&1)<>(a&1)
5660: 3b 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  ;");.  speedtest
5670: 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a  1_end_test();...
5680: 20 20 6e 20 3d 20 73 7a 2f 35 3b 0a 20 20 73 70    n = sz/5;.  sp
5690: 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74  eedtest1_begin_t
56a0: 65 73 74 28 33 31 30 2c 20 22 25 64 20 66 6f 75  est(310, "%d fou
56b0: 72 2d 77 61 79 73 20 6a 6f 69 6e 73 22 2c 20 6e  r-ways joins", n
56c0: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
56d0: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
56e0: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
56f0: 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54  are(.    "SELECT
5700: 20 74 31 2e 63 20 46 52 4f 4d 20 74 31 2c 20 74   t1.c FROM t1, t
5710: 32 2c 20 74 33 2c 20 74 34 5c 6e 22 0a 20 20 20  2, t3, t4\n".   
5720: 20 22 20 57 48 45 52 45 20 74 34 2e 61 20 42 45   " WHERE t4.a BE
5730: 54 57 45 45 4e 20 3f 31 20 41 4e 44 20 3f 32 5c  TWEEN ?1 AND ?2\
5740: 6e 22 0a 20 20 20 20 22 20 20 20 41 4e 44 20 74  n".    "   AND t
5750: 33 2e 61 3d 74 34 2e 62 5c 6e 22 0a 20 20 20 20  3.a=t4.b\n".    
5760: 22 20 20 20 41 4e 44 20 74 32 2e 61 3d 74 33 2e  "   AND t2.a=t3.
5770: 62 5c 6e 22 0a 20 20 20 20 22 20 20 20 41 4e 44  b\n".    "   AND
5780: 20 74 31 2e 63 3d 74 32 2e 63 22 0a 20 20 29 3b   t1.c=t2.c".  );
5790: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
57a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d  ; i++){.    x1 =
57b0: 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64   speedtest1_rand
57c0: 6f 6d 28 29 25 73 7a 20 2b 20 31 3b 0a 20 20 20  om()%sz + 1;.   
57d0: 20 78 32 20 3d 20 73 70 65 65 64 74 65 73 74 31   x2 = speedtest1
57e0: 5f 72 61 6e 64 6f 6d 28 29 25 31 30 20 2b 20 78  _random()%10 + x
57f0: 31 20 2b 20 34 3b 0a 20 20 20 20 73 71 6c 69 74  1 + 4;.    sqlit
5800: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
5810: 74 6d 74 2c 20 31 2c 20 78 31 29 3b 0a 20 20 20  tmt, 1, x1);.   
5820: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
5830: 74 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 78 32  t(g.pStmt, 2, x2
5840: 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74  );.    speedtest
5850: 31 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73  1_run();.  }.  s
5860: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
5870: 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65  COMMIT");.  spee
5880: 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28  dtest1_end_test(
5890: 29 3b 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31  );..  speedtest1
58a0: 5f 62 65 67 69 6e 5f 74 65 73 74 28 33 32 30 2c  _begin_test(320,
58b0: 20 22 73 75 62 71 75 65 72 79 20 69 6e 20 72 65   "subquery in re
58c0: 73 75 6c 74 20 73 65 74 22 2c 20 6e 29 3b 0a 20  sult set", n);. 
58d0: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
58e0: 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54  are(.    "SELECT
58f0: 20 73 75 6d 28 61 29 2c 20 6d 61 78 28 63 29 2c   sum(a), max(c),
5900: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
5910: 61 76 67 28 28 53 45 4c 45 43 54 20 61 20 46 52  avg((SELECT a FR
5920: 4f 4d 20 74 32 20 57 48 45 52 45 20 35 2b 74 32  OM t2 WHERE 5+t2
5930: 2e 62 3d 74 31 2e 62 29 20 41 4e 44 20 72 6f 77  .b=t1.b) AND row
5940: 69 64 3c 3f 31 29 2c 20 6d 61 78 28 63 29 5c 6e  id<?1), max(c)\n
5950: 22 0a 20 20 20 20 22 20 46 52 4f 4d 20 74 31 20  ".    " FROM t1 
5960: 57 48 45 52 45 20 72 6f 77 69 64 3c 3f 31 3b 22  WHERE rowid<?1;"
5970: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  .  );.  sqlite3_
5980: 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74  bind_int(g.pStmt
5990: 2c 20 31 2c 20 65 73 74 5f 73 71 75 61 72 65 5f  , 1, est_square_
59a0: 72 6f 6f 74 28 67 2e 73 7a 54 65 73 74 29 2a 35  root(g.szTest)*5
59b0: 30 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  0);.  speedtest1
59c0: 5f 72 75 6e 28 29 3b 0a 20 20 73 70 65 65 64 74  _run();.  speedt
59d0: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
59e0: 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62  ..  speedtest1_b
59f0: 65 67 69 6e 5f 74 65 73 74 28 39 38 30 2c 20 22  egin_test(980, "
5a00: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
5a10: 5f 63 68 65 63 6b 22 29 3b 0a 20 20 73 70 65 65  _check");.  spee
5a20: 64 74 65 73 74 31 5f 65 78 65 63 28 22 50 52 41  dtest1_exec("PRA
5a30: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
5a40: 65 63 6b 22 29 3b 0a 20 20 73 70 65 65 64 74 65  eck");.  speedte
5a50: 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a  st1_end_test();.
5a60: 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62  ..  speedtest1_b
5a70: 65 67 69 6e 5f 74 65 73 74 28 39 39 30 2c 20 22  egin_test(990, "
5a80: 41 4e 41 4c 59 5a 45 22 29 3b 0a 20 20 73 70 65  ANALYZE");.  spe
5a90: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 41 4e  edtest1_exec("AN
5aa0: 41 4c 59 5a 45 22 29 3b 0a 20 20 73 70 65 65 64  ALYZE");.  speed
5ab0: 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29  test1_end_test()
5ac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 65 73  ;.}../*.** A tes
5ad0: 74 73 65 74 20 66 6f 72 20 63 6f 6d 6d 6f 6e 20  tset for common 
5ae0: 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
5af0: 73 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  s.  This exercis
5b00: 65 73 20 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 76  es code.** for v
5b10: 69 65 77 73 2c 20 73 75 62 71 75 65 72 69 65 73  iews, subqueries
5b20: 2c 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2c 20 65  , co-routines, e
5b30: 74 63 2e 0a 2a 2f 0a 76 6f 69 64 20 74 65 73 74  tc..*/.void test
5b40: 73 65 74 5f 63 74 65 28 76 6f 69 64 29 7b 0a 20  set_cte(void){. 
5b50: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
5b60: 61 72 20 2a 61 7a 50 75 7a 7a 6c 65 5b 5d 20 3d  ar *azPuzzle[] =
5b70: 20 7b 0a 20 20 20 20 2f 2a 20 45 61 73 79 20 2a   {.    /* Easy *
5b80: 2f 0a 20 20 20 20 22 35 33 34 2e 2e 2e 39 2e 2e  /.    "534...9..
5b90: 22 0a 20 20 20 20 22 36 37 2e 31 39 35 2e 2e 2e  ".    "67.195...
5ba0: 22 0a 20 20 20 20 22 2e 39 38 2e 2e 2e 2e 36 2e  ".    ".98....6.
5bb0: 22 0a 20 20 20 20 22 38 2e 2e 2e 36 2e 2e 2e 33  ".    "8...6...3
5bc0: 22 0a 20 20 20 20 22 34 2e 2e 38 2e 33 2e 2e 31  ".    "4..8.3..1
5bd0: 22 0a 20 20 20 20 22 2e 2e 2e 2e 32 2e 2e 2e 36  ".    "....2...6
5be0: 22 0a 20 20 20 20 22 2e 36 2e 2e 2e 2e 32 38 2e  ".    ".6....28.
5bf0: 22 0a 20 20 20 20 22 2e 2e 2e 34 31 39 2e 2e 35  ".    "...419..5
5c00: 22 0a 20 20 20 20 22 2e 2e 2e 32 38 2e 2e 37 39  ".    "...28..79
5c10: 22 2c 0a 0a 20 20 20 20 2f 2a 20 4d 65 64 69 75  ",..    /* Mediu
5c20: 6d 20 2a 2f 0a 20 20 20 20 22 35 33 2e 2e 2e 2e  m */.    "53....
5c30: 39 2e 2e 22 0a 20 20 20 20 22 36 2e 2e 31 39 35  9..".    "6..195
5c40: 2e 2e 2e 22 0a 20 20 20 20 22 2e 39 38 2e 2e 2e  ...".    ".98...
5c50: 2e 36 2e 22 0a 20 20 20 20 22 38 2e 2e 2e 36 2e  .6.".    "8...6.
5c60: 2e 2e 33 22 0a 20 20 20 20 22 34 2e 2e 38 2e 33  ..3".    "4..8.3
5c70: 2e 2e 31 22 0a 20 20 20 20 22 2e 2e 2e 2e 32 2e  ..1".    "....2.
5c80: 2e 2e 36 22 0a 20 20 20 20 22 2e 36 2e 2e 2e 2e  ..6".    ".6....
5c90: 32 38 2e 22 0a 20 20 20 20 22 2e 2e 2e 34 31 39  28.".    "...419
5ca0: 2e 2e 35 22 0a 20 20 20 20 22 2e 2e 2e 2e 38 2e  ..5".    "....8.
5cb0: 2e 37 39 22 2c 0a 0a 20 20 20 20 2f 2a 20 48 61  .79",..    /* Ha
5cc0: 72 64 20 2a 2f 0a 20 20 20 20 22 35 33 2e 2e 2e  rd */.    "53...
5cd0: 2e 2e 2e 2e 22 0a 20 20 20 20 22 36 2e 2e 31 39  ....".    "6..19
5ce0: 35 2e 2e 2e 22 0a 20 20 20 20 22 2e 39 38 2e 2e  5...".    ".98..
5cf0: 2e 2e 36 2e 22 0a 20 20 20 20 22 38 2e 2e 2e 36  ..6.".    "8...6
5d00: 2e 2e 2e 33 22 0a 20 20 20 20 22 34 2e 2e 38 2e  ...3".    "4..8.
5d10: 33 2e 2e 31 22 0a 20 20 20 20 22 2e 2e 2e 2e 32  3..1".    "....2
5d20: 2e 2e 2e 36 22 0a 20 20 20 20 22 2e 36 2e 2e 2e  ...6".    ".6...
5d30: 2e 32 38 2e 22 0a 20 20 20 20 22 2e 2e 2e 34 31  .28.".    "...41
5d40: 39 2e 2e 35 22 0a 20 20 20 20 22 2e 2e 2e 2e 38  9..5".    "....8
5d50: 2e 2e 37 39 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f  ..79",.  };.  co
5d60: 6e 73 74 20 63 68 61 72 20 2a 7a 50 75 7a 3b 0a  nst char *zPuz;.
5d70: 20 20 64 6f 75 62 6c 65 20 72 53 70 61 63 69 6e    double rSpacin
5d80: 67 3b 0a 20 20 69 6e 74 20 6e 45 6c 65 6d 3b 0a  g;.  int nElem;.
5d90: 0a 20 20 69 66 28 20 67 2e 73 7a 54 65 73 74 3c  .  if( g.szTest<
5da0: 32 35 20 29 7b 0a 20 20 20 20 7a 50 75 7a 20 3d  25 ){.    zPuz =
5db0: 20 61 7a 50 75 7a 7a 6c 65 5b 30 5d 3b 0a 20 20   azPuzzle[0];.  
5dc0: 7d 65 6c 73 65 20 69 66 28 20 67 2e 73 7a 54 65  }else if( g.szTe
5dd0: 73 74 3c 37 30 20 29 7b 0a 20 20 20 20 7a 50 75  st<70 ){.    zPu
5de0: 7a 20 3d 20 61 7a 50 75 7a 7a 6c 65 5b 31 5d 3b  z = azPuzzle[1];
5df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50  .  }else{.    zP
5e00: 75 7a 20 3d 20 61 7a 50 75 7a 7a 6c 65 5b 32 5d  uz = azPuzzle[2]
5e10: 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73  ;.  }.  speedtes
5e20: 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 30  t1_begin_test(10
5e30: 30 2c 20 22 53 75 64 6f 6b 75 20 77 69 74 68 20  0, "Sudoku with 
5e40: 72 65 63 75 72 73 69 76 65 20 27 64 69 67 69 74  recursive 'digit
5e50: 73 27 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  s'");.  speedtes
5e60: 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20  t1_prepare(.    
5e70: 22 57 49 54 48 20 52 45 43 55 52 53 49 56 45 5c  "WITH RECURSIVE\
5e80: 6e 22 0a 20 20 20 20 22 20 20 69 6e 70 75 74 28  n".    "  input(
5e90: 73 75 64 29 20 41 53 20 28 56 41 4c 55 45 53 28  sud) AS (VALUES(
5ea0: 3f 31 29 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20  ?1)),\n".    "  
5eb0: 64 69 67 69 74 73 28 7a 2c 6c 70 29 20 41 53 20  digits(z,lp) AS 
5ec0: 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 56 41  (\n".    "    VA
5ed0: 4c 55 45 53 28 27 31 27 2c 20 31 29 5c 6e 22 0a  LUES('1', 1)\n".
5ee0: 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41      "    UNION A
5ef0: 4c 4c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53  LL\n".    "    S
5f00: 45 4c 45 43 54 20 43 41 53 54 28 6c 70 2b 31 20  ELECT CAST(lp+1 
5f10: 41 53 20 54 45 58 54 29 2c 20 6c 70 2b 31 20 46  AS TEXT), lp+1 F
5f20: 52 4f 4d 20 64 69 67 69 74 73 20 57 48 45 52 45  ROM digits WHERE
5f30: 20 6c 70 3c 39 5c 6e 22 0a 20 20 20 20 22 20 20   lp<9\n".    "  
5f40: 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 78 28 73  ),\n".    "  x(s
5f50: 2c 20 69 6e 64 29 20 41 53 20 28 5c 6e 22 0a 20  , ind) AS (\n". 
5f60: 20 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 73     "    SELECT s
5f70: 75 64 2c 20 69 6e 73 74 72 28 73 75 64 2c 20 27  ud, instr(sud, '
5f80: 2e 27 29 20 46 52 4f 4d 20 69 6e 70 75 74 5c 6e  .') FROM input\n
5f90: 22 0a 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e  ".    "    UNION
5fa0: 20 41 4c 4c 5c 6e 22 0a 20 20 20 20 22 20 20 20   ALL\n".    "   
5fb0: 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 22   SELECT\n".    "
5fc0: 20 20 20 20 20 20 73 75 62 73 74 72 28 73 2c 20        substr(s, 
5fd0: 31 2c 20 69 6e 64 2d 31 29 20 7c 7c 20 7a 20 7c  1, ind-1) || z |
5fe0: 7c 20 73 75 62 73 74 72 28 73 2c 20 69 6e 64 2b  | substr(s, ind+
5ff0: 31 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  1),\n".    "    
6000: 20 20 69 6e 73 74 72 28 20 73 75 62 73 74 72 28    instr( substr(
6010: 73 2c 20 31 2c 20 69 6e 64 2d 31 29 20 7c 7c 20  s, 1, ind-1) || 
6020: 7a 20 7c 7c 20 73 75 62 73 74 72 28 73 2c 20 69  z || substr(s, i
6030: 6e 64 2b 31 29 2c 20 27 2e 27 20 29 5c 6e 22 0a  nd+1), '.' )\n".
6040: 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 78      "     FROM x
6050: 2c 20 64 69 67 69 74 73 20 41 53 20 7a 5c 6e 22  , digits AS z\n"
6060: 0a 20 20 20 20 22 20 20 20 20 57 48 45 52 45 20  .    "    WHERE 
6070: 69 6e 64 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20  ind>0\n".    "  
6080: 20 20 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53      AND NOT EXIS
6090: 54 53 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20  TS (\n".    "   
60a0: 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
60b0: 31 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  1\n".    "      
60c0: 20 20 20 20 20 20 20 20 46 52 4f 4d 20 64 69 67          FROM dig
60d0: 69 74 73 20 41 53 20 6c 70 5c 6e 22 0a 20 20 20  its AS lp\n".   
60e0: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 57   "             W
60f0: 48 45 52 45 20 7a 2e 7a 20 3d 20 73 75 62 73 74  HERE z.z = subst
6100: 72 28 73 2c 20 28 28 69 6e 64 2d 31 29 2f 39 29  r(s, ((ind-1)/9)
6110: 2a 39 20 2b 20 6c 70 2c 20 31 29 5c 6e 22 0a 20  *9 + lp, 1)\n". 
6120: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20     "            
6130: 20 20 20 20 4f 52 20 7a 2e 7a 20 3d 20 73 75 62      OR z.z = sub
6140: 73 74 72 28 73 2c 20 28 28 69 6e 64 2d 31 29 25  str(s, ((ind-1)%
6150: 25 39 29 20 2b 20 28 6c 70 2d 31 29 2a 39 20 2b  %9) + (lp-1)*9 +
6160: 20 31 2c 20 31 29 5c 6e 22 0a 20 20 20 20 22 20   1, 1)\n".    " 
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f                 O
6180: 52 20 7a 2e 7a 20 3d 20 73 75 62 73 74 72 28 73  R z.z = substr(s
6190: 2c 20 28 28 28 69 6e 64 2d 31 29 2f 33 29 20 25  , (((ind-1)/3) %
61a0: 25 20 33 29 20 2a 20 33 5c 6e 22 0a 20 20 20 20  % 3) * 3\n".    
61b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
61c0: 20 20 20 20 20 20 20 20 20 2b 20 28 28 69 6e 64           + ((ind
61d0: 2d 31 29 2f 32 37 29 20 2a 20 32 37 20 2b 20 6c  -1)/27) * 27 + l
61e0: 70 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  p\n".    "      
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 2b 20 28 28 6c 70 2d 31 29 20 2f 20 33 29    + ((lp-1) / 3)
6210: 20 2a 20 36 2c 20 31 29 5c 6e 22 0a 20 20 20 20   * 6, 1)\n".    
6220: 22 20 20 20 20 20 20 20 20 20 29 5c 6e 22 0a 20  "         )\n". 
6230: 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22     "  )\n".    "
6240: 53 45 4c 45 43 54 20 73 20 46 52 4f 4d 20 78 20  SELECT s FROM x 
6250: 57 48 45 52 45 20 69 6e 64 3d 30 3b 22 0a 20 20  WHERE ind=0;".  
6260: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6270: 64 5f 74 65 78 74 28 67 2e 70 53 74 6d 74 2c 20  d_text(g.pStmt, 
6280: 31 2c 20 7a 50 75 7a 2c 20 2d 31 2c 20 53 51 4c  1, zPuz, -1, SQL
6290: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
62a0: 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b  peedtest1_run();
62b0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
62c0: 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 73 70 65  d_test();..  spe
62d0: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
62e0: 73 74 28 32 30 30 2c 20 22 53 75 64 6f 6b 75 20  st(200, "Sudoku 
62f0: 77 69 74 68 20 56 41 4c 55 45 53 20 27 64 69 67  with VALUES 'dig
6300: 69 74 73 27 22 29 3b 0a 20 20 73 70 65 65 64 74  its'");.  speedt
6310: 65 73 74 31 5f 70 72 65 70 61 72 65 28 0a 20 20  est1_prepare(.  
6320: 20 20 22 57 49 54 48 20 52 45 43 55 52 53 49 56    "WITH RECURSIV
6330: 45 5c 6e 22 0a 20 20 20 20 22 20 20 69 6e 70 75  E\n".    "  inpu
6340: 74 28 73 75 64 29 20 41 53 20 28 56 41 4c 55 45  t(sud) AS (VALUE
6350: 53 28 3f 31 29 29 2c 5c 6e 22 0a 20 20 20 20 22  S(?1)),\n".    "
6360: 20 20 64 69 67 69 74 73 28 7a 2c 6c 70 29 20 41    digits(z,lp) A
6370: 53 20 28 56 41 4c 55 45 53 28 27 31 27 2c 31 29  S (VALUES('1',1)
6380: 2c 28 27 32 27 2c 32 29 2c 28 27 33 27 2c 33 29  ,('2',2),('3',3)
6390: 2c 28 27 34 27 2c 34 29 2c 28 27 35 27 2c 35 29  ,('4',4),('5',5)
63a0: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  ,\n".    "      
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 20 28 27 36 27 2c 36 29 2c 28 27 37 27 2c     ('6',6),('7',
63d0: 37 29 2c 28 27 38 27 2c 38 29 2c 28 27 39 27 2c  7),('8',8),('9',
63e0: 39 29 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 78  9)),\n".    "  x
63f0: 28 73 2c 20 69 6e 64 29 20 41 53 20 28 5c 6e 22  (s, ind) AS (\n"
6400: 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
6410: 20 73 75 64 2c 20 69 6e 73 74 72 28 73 75 64 2c   sud, instr(sud,
6420: 20 27 2e 27 29 20 46 52 4f 4d 20 69 6e 70 75 74   '.') FROM input
6430: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 55 4e 49  \n".    "    UNI
6440: 4f 4e 20 41 4c 4c 5c 6e 22 0a 20 20 20 20 22 20  ON ALL\n".    " 
6450: 20 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20     SELECT\n".   
6460: 20 22 20 20 20 20 20 20 73 75 62 73 74 72 28 73   "      substr(s
6470: 2c 20 31 2c 20 69 6e 64 2d 31 29 20 7c 7c 20 7a  , 1, ind-1) || z
6480: 20 7c 7c 20 73 75 62 73 74 72 28 73 2c 20 69 6e   || substr(s, in
6490: 64 2b 31 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20  d+1),\n".    "  
64a0: 20 20 20 20 69 6e 73 74 72 28 20 73 75 62 73 74      instr( subst
64b0: 72 28 73 2c 20 31 2c 20 69 6e 64 2d 31 29 20 7c  r(s, 1, ind-1) |
64c0: 7c 20 7a 20 7c 7c 20 73 75 62 73 74 72 28 73 2c  | z || substr(s,
64d0: 20 69 6e 64 2b 31 29 2c 20 27 2e 27 20 29 5c 6e   ind+1), '.' )\n
64e0: 22 0a 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d  ".    "     FROM
64f0: 20 78 2c 20 64 69 67 69 74 73 20 41 53 20 7a 5c   x, digits AS z\
6500: 6e 22 0a 20 20 20 20 22 20 20 20 20 57 48 45 52  n".    "    WHER
6510: 45 20 69 6e 64 3e 30 5c 6e 22 0a 20 20 20 20 22  E ind>0\n".    "
6520: 20 20 20 20 20 20 41 4e 44 20 4e 4f 54 20 45 58        AND NOT EX
6530: 49 53 54 53 20 28 5c 6e 22 0a 20 20 20 20 22 20  ISTS (\n".    " 
6540: 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
6550: 54 20 31 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  T 1\n".    "    
6560: 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 64            FROM d
6570: 69 67 69 74 73 20 41 53 20 6c 70 5c 6e 22 0a 20  igits AS lp\n". 
6580: 20 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20     "            
6590: 20 57 48 45 52 45 20 7a 2e 7a 20 3d 20 73 75 62   WHERE z.z = sub
65a0: 73 74 72 28 73 2c 20 28 28 69 6e 64 2d 31 29 2f  str(s, ((ind-1)/
65b0: 39 29 2a 39 20 2b 20 6c 70 2c 20 31 29 5c 6e 22  9)*9 + lp, 1)\n"
65c0: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
65d0: 20 20 20 20 20 20 4f 52 20 7a 2e 7a 20 3d 20 73        OR z.z = s
65e0: 75 62 73 74 72 28 73 2c 20 28 28 69 6e 64 2d 31  ubstr(s, ((ind-1
65f0: 29 25 25 39 29 20 2b 20 28 6c 70 2d 31 29 2a 39  )%%9) + (lp-1)*9
6600: 20 2b 20 31 2c 20 31 29 5c 6e 22 0a 20 20 20 20   + 1, 1)\n".    
6610: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
6620: 20 4f 52 20 7a 2e 7a 20 3d 20 73 75 62 73 74 72   OR z.z = substr
6630: 28 73 2c 20 28 28 28 69 6e 64 2d 31 29 2f 33 29  (s, (((ind-1)/3)
6640: 20 25 25 20 33 29 20 2a 20 33 5c 6e 22 0a 20 20   %% 3) * 3\n".  
6650: 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
6660: 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 28 69             + ((i
6670: 6e 64 2d 31 29 2f 32 37 29 20 2a 20 32 37 20 2b  nd-1)/27) * 27 +
6680: 20 6c 70 5c 6e 22 0a 20 20 20 20 22 20 20 20 20   lp\n".    "    
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 20 20 2b 20 28 28 6c 70 2d 31 29 20 2f 20      + ((lp-1) / 
66b0: 33 29 20 2a 20 36 2c 20 31 29 5c 6e 22 0a 20 20  3) * 6, 1)\n".  
66c0: 20 20 22 20 20 20 20 20 20 20 20 20 29 5c 6e 22    "         )\n"
66d0: 0a 20 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20  .    "  )\n".   
66e0: 20 22 53 45 4c 45 43 54 20 73 20 46 52 4f 4d 20   "SELECT s FROM 
66f0: 78 20 57 48 45 52 45 20 69 6e 64 3d 30 3b 22 0a  x WHERE ind=0;".
6700: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62    );.  sqlite3_b
6710: 69 6e 64 5f 74 65 78 74 28 67 2e 70 53 74 6d 74  ind_text(g.pStmt
6720: 2c 20 31 2c 20 7a 50 75 7a 2c 20 2d 31 2c 20 53  , 1, zPuz, -1, S
6730: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
6740: 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28   speedtest1_run(
6750: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
6760: 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 72  end_test();..  r
6770: 53 70 61 63 69 6e 67 20 3d 20 35 2e 30 2f 67 2e  Spacing = 5.0/g.
6780: 73 7a 54 65 73 74 3b 0a 20 20 73 70 65 65 64 74  szTest;.  speedt
6790: 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28  est1_begin_test(
67a0: 33 30 30 2c 20 22 4d 61 6e 64 65 6c 62 72 6f 74  300, "Mandelbrot
67b0: 20 53 65 74 20 77 69 74 68 20 73 70 61 63 69 6e   Set with spacin
67c0: 67 3d 25 66 22 2c 20 72 53 70 61 63 69 6e 67 29  g=%f", rSpacing)
67d0: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 70  ;.  speedtest1_p
67e0: 72 65 70 61 72 65 28 0a 20 20 20 22 57 49 54 48  repare(.   "WITH
67f0: 20 52 45 43 55 52 53 49 56 45 20 5c 6e 22 0a 20   RECURSIVE \n". 
6800: 20 20 22 20 20 78 61 78 69 73 28 78 29 20 41 53    "  xaxis(x) AS
6810: 20 28 56 41 4c 55 45 53 28 2d 32 2e 30 29 20 55   (VALUES(-2.0) U
6820: 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20  NION ALL SELECT 
6830: 78 2b 3f 31 20 46 52 4f 4d 20 78 61 78 69 73 20  x+?1 FROM xaxis 
6840: 57 48 45 52 45 20 78 3c 31 2e 32 29 2c 5c 6e 22  WHERE x<1.2),\n"
6850: 0a 20 20 20 22 20 20 79 61 78 69 73 28 79 29 20  .   "  yaxis(y) 
6860: 41 53 20 28 56 41 4c 55 45 53 28 2d 31 2e 30 29  AS (VALUES(-1.0)
6870: 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
6880: 54 20 79 2b 3f 32 20 46 52 4f 4d 20 79 61 78 69  T y+?2 FROM yaxi
6890: 73 20 57 48 45 52 45 20 79 3c 31 2e 30 29 2c 5c  s WHERE y<1.0),\
68a0: 6e 22 0a 20 20 20 22 20 20 6d 28 69 74 65 72 2c  n".   "  m(iter,
68b0: 20 63 78 2c 20 63 79 2c 20 78 2c 20 79 29 20 41   cx, cy, x, y) A
68c0: 53 20 28 5c 6e 22 0a 20 20 20 22 20 20 20 20 53  S (\n".   "    S
68d0: 45 4c 45 43 54 20 30 2c 20 78 2c 20 79 2c 20 30  ELECT 0, x, y, 0
68e0: 2e 30 2c 20 30 2e 30 20 46 52 4f 4d 20 78 61 78  .0, 0.0 FROM xax
68f0: 69 73 2c 20 79 61 78 69 73 5c 6e 22 0a 20 20 20  is, yaxis\n".   
6900: 22 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e  "    UNION ALL\n
6910: 22 0a 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  ".   "    SELECT
6920: 20 69 74 65 72 2b 31 2c 20 63 78 2c 20 63 79 2c   iter+1, cx, cy,
6930: 20 78 2a 78 2d 79 2a 79 20 2b 20 63 78 2c 20 32   x*x-y*y + cx, 2
6940: 2e 30 2a 78 2a 79 20 2b 20 63 79 20 46 52 4f 4d  .0*x*y + cy FROM
6950: 20 6d 20 5c 6e 22 0a 20 20 20 22 20 20 20 20 20   m \n".   "     
6960: 57 48 45 52 45 20 28 78 2a 78 20 2b 20 79 2a 79  WHERE (x*x + y*y
6970: 29 20 3c 20 34 2e 30 20 41 4e 44 20 69 74 65 72  ) < 4.0 AND iter
6980: 3c 32 38 5c 6e 22 0a 20 20 20 22 20 20 29 2c 5c  <28\n".   "  ),\
6990: 6e 22 0a 20 20 20 22 20 20 6d 32 28 69 74 65 72  n".   "  m2(iter
69a0: 2c 20 63 78 2c 20 63 79 29 20 41 53 20 28 5c 6e  , cx, cy) AS (\n
69b0: 22 0a 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  ".   "    SELECT
69c0: 20 6d 61 78 28 69 74 65 72 29 2c 20 63 78 2c 20   max(iter), cx, 
69d0: 63 79 20 46 52 4f 4d 20 6d 20 47 52 4f 55 50 20  cy FROM m GROUP 
69e0: 42 59 20 63 78 2c 20 63 79 5c 6e 22 0a 20 20 20  BY cx, cy\n".   
69f0: 22 20 20 29 2c 5c 6e 22 0a 20 20 20 22 20 20 61  "  ),\n".   "  a
6a00: 28 74 29 20 41 53 20 28 5c 6e 22 0a 20 20 20 22  (t) AS (\n".   "
6a10: 20 20 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70      SELECT group
6a20: 5f 63 6f 6e 63 61 74 28 20 73 75 62 73 74 72 28  _concat( substr(
6a30: 27 20 2e 2b 2a 23 27 2c 20 31 2b 6d 69 6e 28 69  ' .+*#', 1+min(i
6a40: 74 65 72 2f 37 2c 34 29 2c 20 31 29 2c 20 27 27  ter/7,4), 1), ''
6a50: 29 20 5c 6e 22 0a 20 20 20 22 20 20 20 20 46 52  ) \n".   "    FR
6a60: 4f 4d 20 6d 32 20 47 52 4f 55 50 20 42 59 20 63  OM m2 GROUP BY c
6a70: 79 5c 6e 22 0a 20 20 20 22 20 20 29 5c 6e 22 0a  y\n".   "  )\n".
6a80: 20 20 20 22 53 45 4c 45 43 54 20 67 72 6f 75 70     "SELECT group
6a90: 5f 63 6f 6e 63 61 74 28 72 74 72 69 6d 28 74 29  _concat(rtrim(t)
6aa0: 2c 78 27 30 61 27 29 20 46 52 4f 4d 20 61 3b 22  ,x'0a') FROM a;"
6ab0: 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  .  );.  sqlite3_
6ac0: 62 69 6e 64 5f 64 6f 75 62 6c 65 28 67 2e 70 53  bind_double(g.pS
6ad0: 74 6d 74 2c 20 31 2c 20 72 53 70 61 63 69 6e 67  tmt, 1, rSpacing
6ae0: 2a 2e 30 35 29 3b 0a 20 20 73 71 6c 69 74 65 33  *.05);.  sqlite3
6af0: 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 67 2e 70  _bind_double(g.p
6b00: 53 74 6d 74 2c 20 32 2c 20 72 53 70 61 63 69 6e  Stmt, 2, rSpacin
6b10: 67 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  g);.  speedtest1
6b20: 5f 72 75 6e 28 29 3b 0a 20 20 73 70 65 65 64 74  _run();.  speedt
6b30: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
6b40: 0a 0a 20 20 6e 45 6c 65 6d 20 3d 20 31 30 30 30  ..  nElem = 1000
6b50: 30 2a 67 2e 73 7a 54 65 73 74 3b 0a 20 20 73 70  0*g.szTest;.  sp
6b60: 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74  eedtest1_begin_t
6b70: 65 73 74 28 34 30 30 2c 20 22 45 58 43 45 50 54  est(400, "EXCEPT
6b80: 20 6f 70 65 72 61 74 6f 72 20 6f 6e 20 25 64 2d   operator on %d-
6b90: 65 6c 65 6d 65 6e 74 20 74 61 62 6c 65 73 22 2c  element tables",
6ba0: 20 6e 45 6c 65 6d 29 3b 0a 20 20 73 70 65 65 64   nElem);.  speed
6bb0: 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 0a 20  test1_prepare(. 
6bc0: 20 20 20 22 57 49 54 48 20 52 45 43 55 52 53 49     "WITH RECURSI
6bd0: 56 45 20 5c 6e 22 0a 20 20 20 20 22 20 20 74 31  VE \n".    "  t1
6be0: 28 78 29 20 41 53 20 28 56 41 4c 55 45 53 28 32  (x) AS (VALUES(2
6bf0: 29 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  ) UNION ALL SELE
6c00: 43 54 20 78 2b 32 20 46 52 4f 4d 20 74 31 20 57  CT x+2 FROM t1 W
6c10: 48 45 52 45 20 78 3c 25 64 29 2c 5c 6e 22 0a 20  HERE x<%d),\n". 
6c20: 20 20 20 22 20 20 74 32 28 79 29 20 41 53 20 28     "  t2(y) AS (
6c30: 56 41 4c 55 45 53 28 33 29 20 55 4e 49 4f 4e 20  VALUES(3) UNION 
6c40: 41 4c 4c 20 53 45 4c 45 43 54 20 79 2b 33 20 46  ALL SELECT y+3 F
6c50: 52 4f 4d 20 74 32 20 57 48 45 52 45 20 79 3c 25  ROM t2 WHERE y<%
6c60: 64 29 5c 6e 22 0a 20 20 20 20 22 53 45 4c 45 43  d)\n".    "SELEC
6c70: 54 20 63 6f 75 6e 74 28 78 29 2c 20 61 76 67 28  T count(x), avg(
6c80: 78 29 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20  x) FROM (\n".   
6c90: 20 22 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f   "  SELECT x FRO
6ca0: 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
6cb0: 43 54 20 79 20 46 52 4f 4d 20 74 32 20 4f 52 44  CT y FROM t2 ORD
6cc0: 45 52 20 42 59 20 31 5c 6e 22 0a 20 20 20 20 22  ER BY 1\n".    "
6cd0: 29 3b 22 2c 0a 20 20 20 20 6e 45 6c 65 6d 2c 20  );",.    nElem, 
6ce0: 6e 45 6c 65 6d 0a 20 20 29 3b 0a 20 20 73 70 65  nElem.  );.  spe
6cf0: 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20  edtest1_run();. 
6d00: 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f   speedtest1_end_
6d10: 74 65 73 74 28 29 3b 0a 0a 7d 0a 0a 2f 2a 20 47  test();..}../* G
6d20: 65 6e 65 72 61 74 65 20 74 77 6f 20 6e 75 6d 62  enerate two numb
6d30: 65 72 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ers between 1 an
6d40: 64 20 6d 78 2e 20 20 54 68 65 20 66 69 72 73 74  d mx.  The first
6d50: 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
6d60: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 73 65 63 6f  than.** the seco
6d70: 6e 64 2e 20 20 55 73 75 61 6c 6c 79 20 74 68 65  nd.  Usually the
6d80: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 6e 65 61   numbers are nea
6d90: 72 20 65 61 63 68 20 6f 74 68 65 72 20 62 75 74  r each other but
6da0: 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65 73 0a 2a   can sometimes.*
6db0: 2a 20 62 65 20 66 61 72 20 61 70 61 72 74 2e 0a  * be far apart..
6dc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
6dd0: 77 6f 43 6f 6f 72 64 73 28 0a 20 20 69 6e 74 20  woCoords(.  int 
6de0: 70 31 2c 20 69 6e 74 20 70 32 2c 20 20 20 20 20  p1, int p2,     
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6e00: 20 50 61 72 61 6d 65 74 65 72 73 20 61 64 6a 75   Parameters adju
6e10: 73 74 69 6e 67 20 73 69 7a 65 73 20 2a 2f 0a 20  sting sizes */. 
6e20: 20 75 6e 73 69 67 6e 65 64 20 6d 78 2c 20 20 20   unsigned mx,   
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e40: 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 31     /* Range of 1
6e50: 2e 2e 6d 78 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ..mx */.  unsign
6e60: 65 64 20 2a 70 58 30 2c 20 75 6e 73 69 67 6e 65  ed *pX0, unsigne
6e70: 64 20 2a 70 58 31 20 20 20 20 20 20 2f 2a 20 4f  d *pX1      /* O
6e80: 55 54 3a 20 77 72 69 74 65 20 72 65 73 75 6c 74  UT: write result
6e90: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  s here */.){.  u
6ea0: 6e 73 69 67 6e 65 64 20 64 2c 20 78 30 2c 20 78  nsigned d, x0, x
6eb0: 31 2c 20 73 70 61 6e 3b 0a 0a 20 20 73 70 61 6e  1, span;..  span
6ec0: 20 3d 20 6d 78 2f 31 30 30 20 2b 20 31 3b 0a 20   = mx/100 + 1;. 
6ed0: 20 69 66 28 20 73 70 65 65 64 74 65 73 74 31 5f   if( speedtest1_
6ee0: 72 61 6e 64 6f 6d 28 29 25 33 3d 3d 30 20 29 20  random()%3==0 ) 
6ef0: 73 70 61 6e 20 2a 3d 20 70 31 3b 0a 20 20 69 66  span *= p1;.  if
6f00: 28 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e  ( speedtest1_ran
6f10: 64 6f 6d 28 29 25 70 32 3d 3d 30 20 29 20 73 70  dom()%p2==0 ) sp
6f20: 61 6e 20 3d 20 6d 78 2f 32 3b 0a 20 20 64 20 3d  an = mx/2;.  d =
6f30: 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64   speedtest1_rand
6f40: 6f 6d 28 29 25 73 70 61 6e 20 2b 20 31 3b 0a 20  om()%span + 1;. 
6f50: 20 78 30 20 3d 20 73 70 65 65 64 74 65 73 74 31   x0 = speedtest1
6f60: 5f 72 61 6e 64 6f 6d 28 29 25 28 6d 78 2d 64 29  _random()%(mx-d)
6f70: 20 2b 20 31 3b 0a 20 20 78 31 20 3d 20 78 30 20   + 1;.  x1 = x0 
6f80: 2b 20 64 3b 0a 20 20 2a 70 58 30 20 3d 20 78 30  + d;.  *pX0 = x0
6f90: 3b 0a 20 20 2a 70 58 31 20 3d 20 78 31 3b 0a 7d  ;.  *pX1 = x1;.}
6fa0: 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ../* The followi
6fb0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  ng routine is an
6fc0: 20 52 2d 54 72 65 65 20 67 65 6f 6d 65 74 72 79   R-Tree geometry
6fd0: 20 63 61 6c 6c 62 61 63 6b 2e 20 20 49 74 20 72   callback.  It r
6fe0: 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69  eturns.** true i
6ff0: 66 20 74 68 65 20 6f 62 6a 65 63 74 20 6f 76 65  f the object ove
7000: 72 6c 61 70 73 20 61 20 73 6c 69 63 65 20 6f 6e  rlaps a slice on
7010: 20 74 68 65 20 59 20 63 6f 6f 72 64 69 6e 61 74   the Y coordinat
7020: 65 20 62 65 74 77 65 65 6e 20 74 68 65 0a 2a 2a  e between the.**
7030: 20 74 77 6f 20 76 61 6c 75 65 73 20 67 69 76 65   two values give
7040: 6e 20 61 73 20 61 72 67 75 6d 65 6e 74 73 2e 20  n as arguments. 
7050: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 0a   In other words.
7060: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
7070: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 72   count(*) FROM r
7080: 74 31 20 57 48 45 52 45 20 69 64 20 4d 41 54 43  t1 WHERE id MATC
7090: 48 20 78 73 6c 69 63 65 28 31 30 2c 32 30 29 3b  H xslice(10,20);
70a0: 0a 2a 2a 0a 2a 2a 20 49 73 20 74 68 65 20 73 61  .**.** Is the sa
70b0: 6d 65 20 61 73 20 73 61 79 69 6e 67 3a 0a 2a 2a  me as saying:.**
70c0: 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
70d0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 72 74 31  ount(*) FROM rt1
70e0: 20 57 48 45 52 45 20 79 31 3e 3d 31 30 20 41 4e   WHERE y1>=10 AN
70f0: 44 20 79 30 3c 3d 32 30 3b 0a 2a 2f 0a 73 74 61  D y0<=20;.*/.sta
7100: 74 69 63 20 69 6e 74 20 78 73 6c 69 63 65 47 65  tic int xsliceGe
7110: 6f 6d 65 74 72 79 43 61 6c 6c 62 61 63 6b 28 0a  ometryCallback(.
7120: 20 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f    sqlite3_rtree_
7130: 67 65 6f 6d 65 74 72 79 20 2a 70 2c 0a 20 20 69  geometry *p,.  i
7140: 6e 74 20 6e 43 6f 6f 72 64 2c 0a 20 20 64 6f 75  nt nCoord,.  dou
7150: 62 6c 65 20 2a 61 43 6f 6f 72 64 2c 0a 20 20 69  ble *aCoord,.  i
7160: 6e 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 2a 70  nt *pRes.){.  *p
7170: 52 65 73 20 3d 20 61 43 6f 6f 72 64 5b 33 5d 3e  Res = aCoord[3]>
7180: 3d 70 2d 3e 61 50 61 72 61 6d 5b 30 5d 20 26 26  =p->aParam[0] &&
7190: 20 61 43 6f 6f 72 64 5b 32 5d 3c 3d 70 2d 3e 61   aCoord[2]<=p->a
71a0: 50 61 72 61 6d 5b 31 5d 3b 0a 20 20 72 65 74 75  Param[1];.  retu
71b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
71c0: 0a 2f 2a 0a 2a 2a 20 41 20 74 65 73 74 73 65 74  ./*.** A testset
71d0: 20 66 6f 72 20 74 68 65 20 52 2d 54 72 65 65 20   for the R-Tree 
71e0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2f  virtual table.*/
71f0: 0a 76 6f 69 64 20 74 65 73 74 73 65 74 5f 72 74  .void testset_rt
7200: 72 65 65 28 69 6e 74 20 70 31 2c 20 69 6e 74 20  ree(int p1, int 
7210: 70 32 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  p2){.  unsigned 
7220: 69 2c 20 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64  i, n;.  unsigned
7230: 20 6d 78 43 6f 6f 72 64 3b 0a 20 20 75 6e 73 69   mxCoord;.  unsi
7240: 67 6e 65 64 20 78 30 2c 20 78 31 2c 20 79 30 2c  gned x0, x1, y0,
7250: 20 79 31 2c 20 7a 30 2c 20 7a 31 3b 0a 20 20 75   y1, z0, z1;.  u
7260: 6e 73 69 67 6e 65 64 20 69 53 74 65 70 3b 0a 20  nsigned iStep;. 
7270: 20 69 6e 74 20 2a 61 43 68 65 63 6b 20 3d 20 73   int *aCheck = s
7280: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
7290: 69 7a 65 6f 66 28 69 6e 74 29 2a 67 2e 73 7a 54  izeof(int)*g.szT
72a0: 65 73 74 2a 31 30 30 20 29 3b 0a 0a 20 20 6d 78  est*100 );..  mx
72b0: 43 6f 6f 72 64 20 3d 20 31 35 30 30 30 3b 0a 20  Coord = 15000;. 
72c0: 20 6e 20 3d 20 67 2e 73 7a 54 65 73 74 2a 31 30   n = g.szTest*10
72d0: 30 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  0;.  speedtest1_
72e0: 62 65 67 69 6e 5f 74 65 73 74 28 31 30 30 2c 20  begin_test(100, 
72f0: 22 25 64 20 49 4e 53 45 52 54 73 20 69 6e 74 6f  "%d INSERTs into
7300: 20 61 6e 20 72 2d 74 72 65 65 22 2c 20 6e 29 3b   an r-tree", n);
7310: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
7320: 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73  ec("BEGIN");.  s
7330: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
7340: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
7350: 41 42 4c 45 20 72 74 31 20 55 53 49 4e 47 20 72  ABLE rt1 USING r
7360: 74 72 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30  tree(id,x0,x1,y0
7370: 2c 79 31 2c 7a 30 2c 7a 31 29 22 29 3b 0a 20 20  ,y1,z0,z1)");.  
7380: 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61  speedtest1_prepa
7390: 72 65 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  re("INSERT INTO 
73a0: 72 74 31 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c  rt1(id,x0,x1,y0,
73b0: 79 31 2c 7a 30 2c 7a 31 29 22 0a 20 20 20 20 20  y1,z0,z1)".     
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 22 56 41 4c 55 45 53 28 3f 31 2c 3f 32 2c 3f 33  "VALUES(?1,?2,?3
73e0: 2c 3f 34 2c 3f 35 2c 3f 36 2c 3f 37 29 22 29 3b  ,?4,?5,?6,?7)");
73f0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
7400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 77 6f 43  ; i++){.    twoC
7410: 6f 6f 72 64 73 28 70 31 2c 20 70 32 2c 20 6d 78  oords(p1, p2, mx
7420: 43 6f 6f 72 64 2c 20 26 78 30 2c 20 26 78 31 29  Coord, &x0, &x1)
7430: 3b 0a 20 20 20 20 74 77 6f 43 6f 6f 72 64 73 28  ;.    twoCoords(
7440: 70 31 2c 20 70 32 2c 20 6d 78 43 6f 6f 72 64 2c  p1, p2, mxCoord,
7450: 20 26 79 30 2c 20 26 79 31 29 3b 0a 20 20 20 20   &y0, &y1);.    
7460: 74 77 6f 43 6f 6f 72 64 73 28 70 31 2c 20 70 32  twoCoords(p1, p2
7470: 2c 20 6d 78 43 6f 6f 72 64 2c 20 26 7a 30 2c 20  , mxCoord, &z0, 
7480: 26 7a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &z1);.    sqlite
7490: 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74  3_bind_int(g.pSt
74a0: 6d 74 2c 20 31 2c 20 69 29 3b 0a 20 20 20 20 73  mt, 1, i);.    s
74b0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
74c0: 67 2e 70 53 74 6d 74 2c 20 32 2c 20 78 30 29 3b  g.pStmt, 2, x0);
74d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
74e0: 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 33  d_int(g.pStmt, 3
74f0: 2c 20 78 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , x1);.    sqlit
7500: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
7510: 74 6d 74 2c 20 34 2c 20 79 30 29 3b 0a 20 20 20  tmt, 4, y0);.   
7520: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7530: 74 28 67 2e 70 53 74 6d 74 2c 20 35 2c 20 79 31  t(g.pStmt, 5, y1
7540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
7550: 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c  ind_int(g.pStmt,
7560: 20 36 2c 20 7a 30 29 3b 0a 20 20 20 20 73 71 6c   6, z0);.    sql
7570: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
7580: 70 53 74 6d 74 2c 20 37 2c 20 7a 31 29 3b 0a 20  pStmt, 7, z1);. 
7590: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75     speedtest1_ru
75a0: 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64  n();.  }.  speed
75b0: 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d  test1_exec("COMM
75c0: 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IT");.  speedtes
75d0: 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a  t1_end_test();..
75e0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67    speedtest1_beg
75f0: 69 6e 5f 74 65 73 74 28 31 30 31 2c 20 22 43 6f  in_test(101, "Co
7600: 70 79 20 66 72 6f 6d 20 72 74 72 65 65 20 74 6f  py from rtree to
7610: 20 61 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   a regular table
7620: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
7630: 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 54 41  _exec("CREATE TA
7640: 42 4c 45 20 74 31 28 69 64 20 49 4e 54 45 47 45  BLE t1(id INTEGE
7650: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 78 30  R PRIMARY KEY,x0
7660: 2c 78 31 2c 79 30 2c 79 31 2c 7a 30 2c 7a 31 29  ,x1,y0,y1,z0,z1)
7670: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
7680: 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 49 4e  _exec("INSERT IN
7690: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
76a0: 52 4f 4d 20 72 74 31 22 29 3b 0a 20 20 73 70 65  ROM rt1");.  spe
76b0: 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74  edtest1_end_test
76c0: 28 29 3b 0a 0a 20 20 6e 20 3d 20 67 2e 73 7a 54  ();..  n = g.szT
76d0: 65 73 74 2a 32 30 3b 0a 20 20 73 70 65 65 64 74  est*20;.  speedt
76e0: 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28  est1_begin_test(
76f0: 31 31 30 2c 20 22 25 64 20 6f 6e 65 2d 64 69 6d  110, "%d one-dim
7700: 65 6e 73 69 6f 6e 61 6c 20 69 6e 74 65 72 73 65  ensional interse
7710: 63 74 20 73 6c 69 63 65 20 71 75 65 72 69 65 73  ct slice queries
7720: 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74 65  ", n);.  speedte
7730: 73 74 31 5f 70 72 65 70 61 72 65 28 22 53 45 4c  st1_prepare("SEL
7740: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
7750: 4d 20 72 74 31 20 57 48 45 52 45 20 78 30 3e 3d  M rt1 WHERE x0>=
7760: 3f 31 20 41 4e 44 20 78 31 3c 3d 3f 32 22 29 3b  ?1 AND x1<=?2");
7770: 0a 20 20 69 53 74 65 70 20 3d 20 6d 78 43 6f 6f  .  iStep = mxCoo
7780: 72 64 2f 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rd/n;.  for(i=0;
7790: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
77a0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
77b0: 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 69 2a 69  (g.pStmt, 1, i*i
77c0: 53 74 65 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Step);.    sqlit
77d0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
77e0: 74 6d 74 2c 20 32 2c 20 28 69 2b 31 29 2a 69 53  tmt, 2, (i+1)*iS
77f0: 74 65 70 29 3b 0a 20 20 20 20 73 70 65 65 64 74  tep);.    speedt
7800: 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 20 20  est1_run();.    
7810: 61 43 68 65 63 6b 5b 69 5d 20 3d 20 61 74 6f 69  aCheck[i] = atoi
7820: 28 67 2e 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d  (g.zResult);.  }
7830: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
7840: 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 69 66 28  d_test();..  if(
7850: 20 67 2e 62 56 65 72 69 66 79 20 29 7b 0a 20 20   g.bVerify ){.  
7860: 20 20 6e 20 3d 20 67 2e 73 7a 54 65 73 74 2a 32    n = g.szTest*2
7870: 30 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74  0;.    speedtest
7880: 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 31 31  1_begin_test(111
7890: 2c 20 22 56 65 72 69 66 79 20 72 65 73 75 6c 74  , "Verify result
78a0: 20 66 72 6f 6d 20 31 2d 44 20 69 6e 74 65 72 73   from 1-D inters
78b0: 65 63 74 20 73 6c 69 63 65 20 71 75 65 72 69 65  ect slice querie
78c0: 73 22 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65  s");.    speedte
78d0: 73 74 31 5f 70 72 65 70 61 72 65 28 22 53 45 4c  st1_prepare("SEL
78e0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
78f0: 4d 20 74 31 20 57 48 45 52 45 20 78 30 3e 3d 3f  M t1 WHERE x0>=?
7900: 31 20 41 4e 44 20 78 31 3c 3d 3f 32 22 29 3b 0a  1 AND x1<=?2");.
7910: 20 20 20 20 69 53 74 65 70 20 3d 20 6d 78 43 6f      iStep = mxCo
7920: 6f 72 64 2f 6e 3b 0a 20 20 20 20 66 6f 72 28 69  ord/n;.    for(i
7930: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
7940: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
7950: 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31  d_int(g.pStmt, 1
7960: 2c 20 69 2a 69 53 74 65 70 29 3b 0a 20 20 20 20  , i*iStep);.    
7970: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
7980: 6e 74 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 28  nt(g.pStmt, 2, (
7990: 69 2b 31 29 2a 69 53 74 65 70 29 3b 0a 20 20 20  i+1)*iStep);.   
79a0: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75     speedtest1_ru
79b0: 6e 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  n();.      if( a
79c0: 43 68 65 63 6b 5b 69 5d 21 3d 61 74 6f 69 28 67  Check[i]!=atoi(g
79d0: 2e 7a 52 65 73 75 6c 74 29 20 29 7b 0a 20 20 20  .zResult) ){.   
79e0: 20 20 20 20 20 66 61 74 61 6c 5f 65 72 72 6f 72       fatal_error
79f0: 28 22 43 6f 75 6e 74 20 64 69 73 61 67 72 65 65  ("Count disagree
7a00: 20 73 74 65 70 20 25 64 3a 20 25 64 2e 2e 25 64   step %d: %d..%d
7a10: 2e 20 20 25 64 20 76 73 20 25 64 22 2c 0a 20 20  .  %d vs %d",.  
7a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a30: 20 20 69 2c 20 69 2a 69 53 74 65 70 2c 20 28 69    i, i*iStep, (i
7a40: 2b 31 29 2a 69 53 74 65 70 2c 20 61 43 68 65 63  +1)*iStep, aChec
7a50: 6b 5b 69 5d 2c 20 61 74 6f 69 28 67 2e 7a 52 65  k[i], atoi(g.zRe
7a60: 73 75 6c 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  sult));.      }.
7a70: 20 20 20 20 7d 0a 20 20 20 20 73 70 65 65 64 74      }.    speedt
7a80: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
7a90: 0a 20 20 7d 0a 20 20 0a 20 20 6e 20 3d 20 67 2e  .  }.  .  n = g.
7aa0: 73 7a 54 65 73 74 2a 32 30 3b 0a 20 20 73 70 65  szTest*20;.  spe
7ab0: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
7ac0: 73 74 28 31 32 30 2c 20 22 25 64 20 6f 6e 65 2d  st(120, "%d one-
7ad0: 64 69 6d 65 6e 73 69 6f 6e 61 6c 20 6f 76 65 72  dimensional over
7ae0: 6c 61 70 20 73 6c 69 63 65 20 71 75 65 72 69 65  lap slice querie
7af0: 73 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74  s", n);.  speedt
7b00: 65 73 74 31 5f 70 72 65 70 61 72 65 28 22 53 45  est1_prepare("SE
7b10: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
7b20: 4f 4d 20 72 74 31 20 57 48 45 52 45 20 79 31 3e  OM rt1 WHERE y1>
7b30: 3d 3f 31 20 41 4e 44 20 79 30 3c 3d 3f 32 22 29  =?1 AND y0<=?2")
7b40: 3b 0a 20 20 69 53 74 65 70 20 3d 20 6d 78 43 6f  ;.  iStep = mxCo
7b50: 6f 72 64 2f 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  ord/n;.  for(i=0
7b60: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
7b70: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7b80: 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 69 2a  t(g.pStmt, 1, i*
7b90: 69 53 74 65 70 29 3b 0a 20 20 20 20 73 71 6c 69  iStep);.    sqli
7ba0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70  te3_bind_int(g.p
7bb0: 53 74 6d 74 2c 20 32 2c 20 28 69 2b 31 29 2a 69  Stmt, 2, (i+1)*i
7bc0: 53 74 65 70 29 3b 0a 20 20 20 20 73 70 65 65 64  Step);.    speed
7bd0: 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 20  test1_run();.   
7be0: 20 61 43 68 65 63 6b 5b 69 5d 20 3d 20 61 74 6f   aCheck[i] = ato
7bf0: 69 28 67 2e 7a 52 65 73 75 6c 74 29 3b 0a 20 20  i(g.zResult);.  
7c00: 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  }.  speedtest1_e
7c10: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 69 66  nd_test();..  if
7c20: 28 20 67 2e 62 56 65 72 69 66 79 20 29 7b 0a 20  ( g.bVerify ){. 
7c30: 20 20 20 6e 20 3d 20 67 2e 73 7a 54 65 73 74 2a     n = g.szTest*
7c40: 32 30 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73  20;.    speedtes
7c50: 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 32  t1_begin_test(12
7c60: 31 2c 20 22 56 65 72 69 66 79 20 72 65 73 75 6c  1, "Verify resul
7c70: 74 20 66 72 6f 6d 20 31 2d 44 20 6f 76 65 72 6c  t from 1-D overl
7c80: 61 70 20 73 6c 69 63 65 20 71 75 65 72 69 65 73  ap slice queries
7c90: 22 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73  ");.    speedtes
7ca0: 74 31 5f 70 72 65 70 61 72 65 28 22 53 45 4c 45  t1_prepare("SELE
7cb0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
7cc0: 20 74 31 20 57 48 45 52 45 20 79 31 3e 3d 3f 31   t1 WHERE y1>=?1
7cd0: 20 41 4e 44 20 79 30 3c 3d 3f 32 22 29 3b 0a 20   AND y0<=?2");. 
7ce0: 20 20 20 69 53 74 65 70 20 3d 20 6d 78 43 6f 6f     iStep = mxCoo
7cf0: 72 64 2f 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rd/n;.    for(i=
7d00: 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
7d10: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
7d20: 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c  _int(g.pStmt, 1,
7d30: 20 69 2a 69 53 74 65 70 29 3b 0a 20 20 20 20 20   i*iStep);.     
7d40: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7d50: 74 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 28 69  t(g.pStmt, 2, (i
7d60: 2b 31 29 2a 69 53 74 65 70 29 3b 0a 20 20 20 20  +1)*iStep);.    
7d70: 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e    speedtest1_run
7d80: 28 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 43  ();.      if( aC
7d90: 68 65 63 6b 5b 69 5d 21 3d 61 74 6f 69 28 67 2e  heck[i]!=atoi(g.
7da0: 7a 52 65 73 75 6c 74 29 20 29 7b 0a 20 20 20 20  zResult) ){.    
7db0: 20 20 20 20 66 61 74 61 6c 5f 65 72 72 6f 72 28      fatal_error(
7dc0: 22 43 6f 75 6e 74 20 64 69 73 61 67 72 65 65 20  "Count disagree 
7dd0: 73 74 65 70 20 25 64 3a 20 25 64 2e 2e 25 64 2e  step %d: %d..%d.
7de0: 20 20 25 64 20 76 73 20 25 64 22 2c 0a 20 20 20    %d vs %d",.   
7df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e00: 20 69 2c 20 69 2a 69 53 74 65 70 2c 20 28 69 2b   i, i*iStep, (i+
7e10: 31 29 2a 69 53 74 65 70 2c 20 61 43 68 65 63 6b  1)*iStep, aCheck
7e20: 5b 69 5d 2c 20 61 74 6f 69 28 67 2e 7a 52 65 73  [i], atoi(g.zRes
7e30: 75 6c 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ult));.      }. 
7e40: 20 20 20 7d 0a 20 20 20 20 73 70 65 65 64 74 65     }.    speedte
7e50: 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a  st1_end_test();.
7e60: 20 20 7d 0a 20 20 0a 0a 20 20 6e 20 3d 20 67 2e    }.  ..  n = g.
7e70: 73 7a 54 65 73 74 2a 32 30 3b 0a 20 20 73 70 65  szTest*20;.  spe
7e80: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
7e90: 73 74 28 31 32 35 2c 20 22 25 64 20 63 75 73 74  st(125, "%d cust
7ea0: 6f 6d 20 67 65 6f 6d 65 74 72 79 20 63 61 6c 6c  om geometry call
7eb0: 62 61 63 6b 20 71 75 65 72 69 65 73 22 2c 20 6e  back queries", n
7ec0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 74 72  );.  sqlite3_rtr
7ed0: 65 65 5f 67 65 6f 6d 65 74 72 79 5f 63 61 6c 6c  ee_geometry_call
7ee0: 62 61 63 6b 28 67 2e 64 62 2c 20 22 78 73 6c 69  back(g.db, "xsli
7ef0: 63 65 22 2c 20 78 73 6c 69 63 65 47 65 6f 6d 65  ce", xsliceGeome
7f00: 74 72 79 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b  tryCallback, 0);
7f10: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 70 72  .  speedtest1_pr
7f20: 65 70 61 72 65 28 22 53 45 4c 45 43 54 20 63 6f  epare("SELECT co
7f30: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 72 74 31 20  unt(*) FROM rt1 
7f40: 57 48 45 52 45 20 69 64 20 4d 41 54 43 48 20 78  WHERE id MATCH x
7f50: 73 6c 69 63 65 28 3f 31 2c 3f 32 29 22 29 3b 0a  slice(?1,?2)");.
7f60: 20 20 69 53 74 65 70 20 3d 20 6d 78 43 6f 6f 72    iStep = mxCoor
7f70: 64 2f 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  d/n;.  for(i=0; 
7f80: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  i<n; i++){.    s
7f90: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
7fa0: 67 2e 70 53 74 6d 74 2c 20 31 2c 20 69 2a 69 53  g.pStmt, 1, i*iS
7fb0: 74 65 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tep);.    sqlite
7fc0: 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74  3_bind_int(g.pSt
7fd0: 6d 74 2c 20 32 2c 20 28 69 2b 31 29 2a 69 53 74  mt, 2, (i+1)*iSt
7fe0: 65 70 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65  ep);.    speedte
7ff0: 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 20 20 69  st1_run();.    i
8000: 66 28 20 61 43 68 65 63 6b 5b 69 5d 21 3d 61 74  f( aCheck[i]!=at
8010: 6f 69 28 67 2e 7a 52 65 73 75 6c 74 29 20 29 7b  oi(g.zResult) ){
8020: 0a 20 20 20 20 20 20 66 61 74 61 6c 5f 65 72 72  .      fatal_err
8030: 6f 72 28 22 43 6f 75 6e 74 20 64 69 73 61 67 72  or("Count disagr
8040: 65 65 20 73 74 65 70 20 25 64 3a 20 25 64 2e 2e  ee step %d: %d..
8050: 25 64 2e 20 20 25 64 20 76 73 20 25 64 22 2c 0a  %d.  %d vs %d",.
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 20 69 2c 20 69 2a 69 53 74 65 70 2c 20 28 69    i, i*iStep, (i
8080: 2b 31 29 2a 69 53 74 65 70 2c 20 61 43 68 65 63  +1)*iStep, aChec
8090: 6b 5b 69 5d 2c 20 61 74 6f 69 28 67 2e 7a 52 65  k[i], atoi(g.zRe
80a0: 73 75 6c 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  sult));.    }.  
80b0: 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  }.  speedtest1_e
80c0: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 6e 20  nd_test();..  n 
80d0: 3d 20 67 2e 73 7a 54 65 73 74 2a 38 30 3b 0a 20  = g.szTest*80;. 
80e0: 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69   speedtest1_begi
80f0: 6e 5f 74 65 73 74 28 31 33 30 2c 20 22 25 64 20  n_test(130, "%d 
8100: 74 68 72 65 65 2d 64 69 6d 65 6e 73 69 6f 6e 61  three-dimensiona
8110: 6c 20 69 6e 74 65 72 73 65 63 74 20 62 6f 78 20  l intersect box 
8120: 71 75 65 72 69 65 73 22 2c 20 6e 29 3b 0a 20 20  queries", n);.  
8130: 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61  speedtest1_prepa
8140: 72 65 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  re("SELECT count
8150: 28 2a 29 20 46 52 4f 4d 20 72 74 31 20 57 48 45  (*) FROM rt1 WHE
8160: 52 45 20 78 31 3e 3d 3f 31 20 41 4e 44 20 78 30  RE x1>=?1 AND x0
8170: 3c 3d 3f 32 22 0a 20 20 20 20 20 20 20 20 20 20  <=?2".          
8180: 20 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44             " AND
8190: 20 79 31 3e 3d 3f 31 20 41 4e 44 20 79 30 3c 3d   y1>=?1 AND y0<=
81a0: 3f 32 20 41 4e 44 20 7a 31 3e 3d 3f 31 20 41 4e  ?2 AND z1>=?1 AN
81b0: 44 20 7a 30 3c 3d 3f 32 22 29 3b 0a 20 20 69 53  D z0<=?2");.  iS
81c0: 74 65 70 20 3d 20 6d 78 43 6f 6f 72 64 2f 6e 3b  tep = mxCoord/n;
81d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
81e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
81f0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
8200: 74 6d 74 2c 20 31 2c 20 69 2a 69 53 74 65 70 29  tmt, 1, i*iStep)
8210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
8220: 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20  nd_int(g.pStmt, 
8230: 32 2c 20 28 69 2b 31 29 2a 69 53 74 65 70 29 3b  2, (i+1)*iStep);
8240: 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f  .    speedtest1_
8250: 72 75 6e 28 29 3b 0a 20 20 20 20 61 43 68 65 63  run();.    aChec
8260: 6b 5b 69 5d 20 3d 20 61 74 6f 69 28 67 2e 7a 52  k[i] = atoi(g.zR
8270: 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 73 70  esult);.  }.  sp
8280: 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73  eedtest1_end_tes
8290: 74 28 29 3b 0a 0a 20 20 6e 20 3d 20 67 2e 73 7a  t();..  n = g.sz
82a0: 54 65 73 74 2a 31 30 30 3b 0a 20 20 73 70 65 65  Test*100;.  spee
82b0: 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73  dtest1_begin_tes
82c0: 74 28 31 34 30 2c 20 22 25 64 20 72 6f 77 69 64  t(140, "%d rowid
82d0: 20 71 75 65 72 69 65 73 22 2c 20 6e 29 3b 0a 20   queries", n);. 
82e0: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
82f0: 61 72 65 28 22 53 45 4c 45 43 54 20 2a 20 46 52  are("SELECT * FR
8300: 4f 4d 20 72 74 31 20 57 48 45 52 45 20 69 64 3d  OM rt1 WHERE id=
8310: 3f 31 22 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  ?1");.  for(i=1;
8320: 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=n; i++){.   
8330: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
8340: 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 69 29  t(g.pStmt, 1, i)
8350: 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  ;.    speedtest1
8360: 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70  _run();.  }.  sp
8370: 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73  eedtest1_end_tes
8380: 74 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  t();.}../*.** A 
8390: 74 65 73 74 73 65 74 20 75 73 65 64 20 66 6f 72  testset used for
83a0: 20 64 65 62 75 67 67 69 6e 67 20 73 70 65 65 64   debugging speed
83b0: 74 65 73 74 31 20 69 74 73 65 6c 66 2e 0a 2a 2f  test1 itself..*/
83c0: 0a 76 6f 69 64 20 74 65 73 74 73 65 74 5f 64 65  .void testset_de
83d0: 62 75 67 31 28 76 6f 69 64 29 7b 0a 20 20 75 6e  bug1(void){.  un
83e0: 73 69 67 6e 65 64 20 69 2c 20 6e 3b 0a 20 20 75  signed i, n;.  u
83f0: 6e 73 69 67 6e 65 64 20 78 31 2c 20 78 32 3b 0a  nsigned x1, x2;.
8400: 20 20 63 68 61 72 20 7a 4e 75 6d 5b 32 30 30 30    char zNum[2000
8410: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
8420: 2f 2a 20 41 20 6e 75 6d 62 65 72 20 6e 61 6d 65  /* A number name
8430: 20 2a 2f 0a 0a 20 20 6e 20 3d 20 67 2e 73 7a 54   */..  n = g.szT
8440: 65 73 74 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  est;.  for(i=1; 
8450: 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=n; i++){.    
8460: 78 31 20 3d 20 73 77 69 7a 7a 6c 65 28 69 2c 20  x1 = swizzle(i, 
8470: 6e 29 3b 0a 20 20 20 20 78 32 20 3d 20 73 77 69  n);.    x2 = swi
8480: 7a 7a 6c 65 28 78 31 2c 20 6e 29 3b 0a 20 20 20  zzle(x1, n);.   
8490: 20 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d 62   speedtest1_numb
84a0: 65 72 6e 61 6d 65 28 78 31 2c 20 7a 4e 75 6d 2c  ername(x1, zNum,
84b0: 20 73 69 7a 65 6f 66 28 7a 4e 75 6d 29 29 3b 0a   sizeof(zNum));.
84c0: 20 20 20 20 70 72 69 6e 74 66 28 22 25 35 64 20      printf("%5d 
84d0: 25 35 64 20 25 35 64 20 25 73 5c 6e 22 2c 20 69  %5d %5d %s\n", i
84e0: 2c 20 78 31 2c 20 78 32 2c 20 7a 4e 75 6d 29 3b  , x1, x2, zNum);
84f0: 0a 20 20 7d 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e  .  }.}..int main
8500: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20  (int argc, char 
8510: 2a 2a 61 72 67 76 29 7b 0a 20 20 69 6e 74 20 64  **argv){.  int d
8520: 6f 41 75 74 6f 76 61 63 20 3d 20 30 3b 20 20 20  oAutovac = 0;   
8530: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
8540: 20 66 6f 72 20 2d 2d 61 75 74 6f 76 61 63 75 75   for --autovacuu
8550: 6d 20 2a 2f 0a 20 20 69 6e 74 20 63 61 63 68 65  m */.  int cache
8560: 53 69 7a 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Size = 0;       
8570: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
8580: 63 61 63 68 65 20 73 69 7a 65 2e 20 20 30 20 6d  cache size.  0 m
8590: 65 61 6e 73 20 64 65 66 61 75 6c 74 20 2a 2f 0a  eans default */.
85a0: 20 20 69 6e 74 20 64 6f 45 78 63 6c 75 73 69 76    int doExclusiv
85b0: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
85c0: 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d 2d 65 78  /* True for --ex
85d0: 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 6e 74  clusive */.  int
85e0: 20 6e 48 65 61 70 20 3d 20 30 2c 20 6d 6e 48 65   nHeap = 0, mnHe
85f0: 61 70 20 3d 20 30 3b 20 20 20 20 2f 2a 20 48 65  ap = 0;    /* He
8600: 61 70 20 73 69 7a 65 20 66 72 6f 6d 20 2d 2d 68  ap size from --h
8610: 65 61 70 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 49  eap */.  int doI
8620: 6e 63 72 76 61 63 20 3d 20 30 3b 20 20 20 20 20  ncrvac = 0;     
8630: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
8640: 6f 72 20 2d 2d 69 6e 63 72 76 61 63 75 75 6d 20  or --incrvacuum 
8650: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8660: 2a 7a 4a 4d 6f 64 65 20 3d 20 30 3b 20 20 20 20  *zJMode = 0;    
8670: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 6d 6f     /* Journal mo
8680: 64 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  de */.  const ch
8690: 61 72 20 2a 7a 4b 65 79 20 3d 20 30 3b 20 20 20  ar *zKey = 0;   
86a0: 20 20 20 20 20 20 2f 2a 20 45 6e 63 72 79 70 74        /* Encrypt
86b0: 69 6f 6e 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ion key */.  int
86c0: 20 6e 4c 6f 6f 6b 20 3d 20 30 2c 20 73 7a 4c 6f   nLook = 0, szLo
86d0: 6f 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 2d 2d  ok = 0;    /* --
86e0: 6c 6f 6f 6b 61 73 69 64 65 20 63 6f 6e 66 69 67  lookaside config
86f0: 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  uration */.  int
8700: 20 6e 6f 53 79 6e 63 20 3d 20 30 3b 20 20 20 20   noSync = 0;    
8710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8720: 75 65 20 66 6f 72 20 2d 2d 6e 6f 73 79 6e 63 20  ue for --nosync 
8730: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
8740: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
8750: 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20 70 61     /* Desired pa
8760: 67 65 20 73 69 7a 65 2e 20 20 30 20 6d 65 61 6e  ge size.  0 mean
8770: 73 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 69  s default */.  i
8780: 6e 74 20 6e 50 43 61 63 68 65 20 3d 20 30 2c 20  nt nPCache = 0, 
8790: 73 7a 50 43 61 63 68 65 20 3d 20 30 3b 2f 2a 20  szPCache = 0;/* 
87a0: 2d 2d 70 63 61 63 68 65 20 63 6f 6e 66 69 67 75  --pcache configu
87b0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
87c0: 6e 53 63 72 61 74 63 68 20 3d 20 30 2c 20 73 7a  nScratch = 0, sz
87d0: 53 63 72 61 74 63 68 3d 30 3b 2f 2a 20 2d 2d 73  Scratch=0;/* --s
87e0: 63 72 61 74 63 68 20 63 6f 6e 66 69 67 75 72 61  cratch configura
87f0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 68  tion */.  int sh
8800: 6f 77 53 74 61 74 73 20 3d 20 30 3b 20 20 20 20  owStats = 0;    
8810: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
8820: 66 6f 72 20 2d 2d 73 74 61 74 73 20 2a 2f 0a 20  for --stats */. 
8830: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 53   const char *zTS
8840: 65 74 20 3d 20 22 6d 61 69 6e 22 3b 20 20 20 2f  et = "main";   /
8850: 2a 20 57 68 69 63 68 20 2d 2d 74 65 73 74 73 65  * Which --testse
8860: 74 20 74 6f 72 75 6e 20 2a 2f 0a 20 20 69 6e 74  t torun */.  int
8870: 20 64 6f 54 72 61 63 65 20 3d 20 30 3b 20 20 20   doTrace = 0;   
8880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8890: 75 65 20 66 6f 72 20 2d 2d 74 72 61 63 65 20 2a  ue for --trace *
88a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
88b0: 7a 45 6e 63 6f 64 69 6e 67 20 3d 20 30 3b 20 20  zEncoding = 0;  
88c0: 20 20 2f 2a 20 2d 2d 75 74 66 31 36 62 65 20 6f    /* --utf16be o
88d0: 72 20 2d 2d 75 74 66 31 36 6c 65 20 2a 2f 0a 20  r --utf16le */. 
88e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
88f0: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  Name = 0;      /
8900: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  * Name of the te
8910: 73 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  st database */..
8920: 20 20 76 6f 69 64 20 2a 70 48 65 61 70 20 3d 20    void *pHeap = 
8930: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8940: 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 68 65 61  /* Allocated hea
8950: 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 76 6f 69  p space */.  voi
8960: 64 20 2a 70 4c 6f 6f 6b 20 3d 20 30 3b 20 20 20  d *pLook = 0;   
8970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
8980: 6c 6f 63 61 74 65 64 20 6c 6f 6f 6b 61 73 69 64  located lookasid
8990: 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 76 6f 69  e space */.  voi
89a0: 64 20 2a 70 50 43 61 63 68 65 20 3d 20 30 3b 20  d *pPCache = 0; 
89b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
89c0: 6c 6f 63 61 74 65 64 20 73 74 6f 72 61 67 65 20  located storage 
89d0: 66 6f 72 20 70 63 61 63 68 65 20 2a 2f 0a 20 20  for pcache */.  
89e0: 76 6f 69 64 20 2a 70 53 63 72 61 74 63 68 20 3d  void *pScratch =
89f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
8a00: 20 41 6c 6c 6f 63 61 74 65 64 20 73 74 6f 72 61   Allocated stora
8a10: 67 65 20 66 6f 72 20 73 63 72 61 74 63 68 20 2a  ge for scratch *
8a20: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 69 48  /.  int iCur, iH
8a30: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8a40: 20 20 2f 2a 20 53 74 61 74 73 20 76 61 6c 75 65    /* Stats value
8a50: 73 2c 20 63 75 72 72 65 6e 74 20 61 6e 64 20 22  s, current and "
8a60: 68 69 67 68 77 61 74 65 72 22 20 2a 2f 0a 20 20  highwater" */.  
8a70: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a90: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
8aa0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 20 2f 2a 20 41 50 49 20 72 65 74 75 72 6e 20 63   /* API return c
8ad0: 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 6f  ode */..  /* Pro
8ae0: 63 65 73 73 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  cess command-lin
8af0: 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  e arguments */. 
8b00: 20 67 2e 7a 57 52 20 3d 20 22 22 3b 0a 20 20 67   g.zWR = "";.  g
8b10: 2e 7a 4e 4e 20 3d 20 22 22 3b 0a 20 20 67 2e 7a  .zNN = "";.  g.z
8b20: 50 4b 20 3d 20 22 55 4e 49 51 55 45 22 3b 0a 20  PK = "UNIQUE";. 
8b30: 20 67 2e 73 7a 54 65 73 74 20 3d 20 31 30 30 3b   g.szTest = 100;
8b40: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72  .  for(i=1; i<ar
8b50: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  gc; i++){.    co
8b60: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 72  nst char *z = ar
8b70: 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a  gv[i];.    if( z
8b80: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
8b90: 20 20 64 6f 7b 20 7a 2b 2b 3b 20 7d 77 68 69 6c    do{ z++; }whil
8ba0: 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 3b 0a  e( z[0]=='-' );.
8bb0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
8bc0: 28 7a 2c 22 61 75 74 6f 76 61 63 75 75 6d 22 29  (z,"autovacuum")
8bd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ==0 ){.        d
8be0: 6f 41 75 74 6f 76 61 63 20 3d 20 31 3b 0a 20 20  oAutovac = 1;.  
8bf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
8c00: 72 63 6d 70 28 7a 2c 22 63 61 63 68 65 73 69 7a  rcmp(z,"cachesiz
8c10: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
8c20: 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20    if( i>=argc-1 
8c30: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 6d  ) fatal_error("m
8c40: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
8c50: 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b 69  on %s\n", argv[i
8c60: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  ]);.        i++;
8c70: 0a 20 20 20 20 20 20 20 20 63 61 63 68 65 53 69  .        cacheSi
8c80: 7a 65 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75  ze = integerValu
8c90: 65 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  e(argv[i]);.    
8ca0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
8cb0: 6d 70 28 7a 2c 22 65 78 63 6c 75 73 69 76 65 22  mp(z,"exclusive"
8cc0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8cd0: 64 6f 45 78 63 6c 75 73 69 76 65 20 3d 20 31 3b  doExclusive = 1;
8ce0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8cf0: 20 73 74 72 63 6d 70 28 7a 2c 22 65 78 70 6c 61   strcmp(z,"expla
8d00: 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
8d10: 20 20 20 67 2e 62 53 71 6c 4f 6e 6c 79 20 3d 20     g.bSqlOnly = 
8d20: 31 3b 0a 20 20 20 20 20 20 20 20 67 2e 62 45 78  1;.        g.bEx
8d30: 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20 20 20  plain = 1;.     
8d40: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
8d50: 70 28 7a 2c 22 68 65 61 70 22 29 3d 3d 30 20 29  p(z,"heap")==0 )
8d60: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
8d70: 3d 61 72 67 63 2d 32 20 29 20 66 61 74 61 6c 5f  =argc-2 ) fatal_
8d80: 65 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  error("missing a
8d90: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 5c 6e  rguments on %s\n
8da0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
8db0: 20 20 20 20 20 6e 48 65 61 70 20 3d 20 69 6e 74       nHeap = int
8dc0: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 69  egerValue(argv[i
8dd0: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6d 6e  +1]);.        mn
8de0: 48 65 61 70 20 3d 20 69 6e 74 65 67 65 72 56 61  Heap = integerVa
8df0: 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d 29 3b 0a  lue(argv[i+2]);.
8e00: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a          i += 2;.
8e10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8e20: 73 74 72 63 6d 70 28 7a 2c 22 69 6e 63 72 76 61  strcmp(z,"incrva
8e30: 63 75 75 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20  cuum")==0 ){.   
8e40: 20 20 20 20 20 64 6f 49 6e 63 72 76 61 63 20 3d       doIncrvac =
8e50: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
8e60: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6a 6f  if( strcmp(z,"jo
8e70: 75 72 6e 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  urnal")==0 ){.  
8e80: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67        if( i>=arg
8e90: 63 2d 31 20 29 20 66 61 74 61 6c 5f 65 72 72 6f  c-1 ) fatal_erro
8ea0: 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d  r("missing argum
8eb0: 65 6e 74 20 6f 6e 20 25 73 5c 6e 22 2c 20 61 72  ent on %s\n", ar
8ec0: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[i]);.        
8ed0: 7a 4a 4d 6f 64 65 20 3d 20 61 72 67 76 5b 2b 2b  zJMode = argv[++
8ee0: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i];.      }else 
8ef0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6b 65  if( strcmp(z,"ke
8f00: 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
8f10: 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20    if( i>=argc-1 
8f20: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 6d  ) fatal_error("m
8f30: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
8f40: 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b 69  on %s\n", argv[i
8f50: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 4b 65 79  ]);.        zKey
8f60: 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20   = argv[++i];.  
8f70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
8f80: 72 63 6d 70 28 7a 2c 22 6c 6f 6f 6b 61 73 69 64  rcmp(z,"lookasid
8f90: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
8fa0: 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 32 20    if( i>=argc-2 
8fb0: 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 6d  ) fatal_error("m
8fc0: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73  issing arguments
8fd0: 20 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b   on %s\n", argv[
8fe0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 4c 6f  i]);.        nLo
8ff0: 6f 6b 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75  ok = integerValu
9000: 65 28 61 72 67 76 5b 69 2b 31 5d 29 3b 0a 20 20  e(argv[i+1]);.  
9010: 20 20 20 20 20 20 73 7a 4c 6f 6f 6b 20 3d 20 69        szLook = i
9020: 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76  ntegerValue(argv
9030: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  [i+2]);.        
9040: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65  i += 2;.      }e
9050: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
9060: 2c 22 6e 6f 73 79 6e 63 22 29 3d 3d 30 20 29 7b  ,"nosync")==0 ){
9070: 0a 20 20 20 20 20 20 20 20 6e 6f 53 79 6e 63 20  .        noSync 
9080: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
9090: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e   if( strcmp(z,"n
90a0: 6f 74 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  otnull")==0 ){. 
90b0: 20 20 20 20 20 20 20 67 2e 7a 4e 4e 20 3d 20 22         g.zNN = "
90c0: 4e 4f 54 20 4e 55 4c 4c 22 3b 0a 20 20 20 20 20  NOT NULL";.     
90d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
90e0: 70 28 7a 2c 22 70 61 67 65 73 69 7a 65 22 29 3d  p(z,"pagesize")=
90f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
9100: 28 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61  ( i>=argc-1 ) fa
9110: 74 61 6c 5f 65 72 72 6f 72 28 22 6d 69 73 73 69  tal_error("missi
9120: 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 25  ng argument on %
9130: 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\n", argv[i]);.
9140: 20 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65          pageSize
9150: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
9160: 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  argv[++i]);.    
9170: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
9180: 6d 70 28 7a 2c 22 70 63 61 63 68 65 22 29 3d 3d  mp(z,"pcache")==
9190: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
91a0: 20 69 3e 3d 61 72 67 63 2d 32 20 29 20 66 61 74   i>=argc-2 ) fat
91b0: 61 6c 5f 65 72 72 6f 72 28 22 6d 69 73 73 69 6e  al_error("missin
91c0: 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25  g arguments on %
91d0: 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\n", argv[i]);.
91e0: 20 20 20 20 20 20 20 20 6e 50 43 61 63 68 65 20          nPCache 
91f0: 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  = integerValue(a
9200: 72 67 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20  rgv[i+1]);.     
9210: 20 20 20 73 7a 50 43 61 63 68 65 20 3d 20 69 6e     szPCache = in
9220: 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b  tegerValue(argv[
9230: 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  i+2]);.        i
9240: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c   += 2;.      }el
9250: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
9260: 22 70 72 69 6d 61 72 79 6b 65 79 22 29 3d 3d 30  "primarykey")==0
9270: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 2e 7a 50   ){.        g.zP
9280: 4b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  K = "PRIMARY KEY
9290: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
92a0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 72 65 70  f( strcmp(z,"rep
92b0: 72 65 70 61 72 65 22 29 3d 3d 30 20 29 7b 0a 20  repare")==0 ){. 
92c0: 20 20 20 20 20 20 20 67 2e 62 52 65 70 72 65 70         g.bReprep
92d0: 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  are = 1;.      }
92e0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
92f0: 7a 2c 22 73 63 72 61 74 63 68 22 29 3d 3d 30 20  z,"scratch")==0 
9300: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
9310: 3e 3d 61 72 67 63 2d 32 20 29 20 66 61 74 61 6c  >=argc-2 ) fatal
9320: 5f 65 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20  _error("missing 
9330: 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 5c  arguments on %s\
9340: 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  n", argv[i]);.  
9350: 20 20 20 20 20 20 6e 53 63 72 61 74 63 68 20 3d        nScratch =
9360: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72   integerValue(ar
9370: 67 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20  gv[i+1]);.      
9380: 20 20 73 7a 53 63 72 61 74 63 68 20 3d 20 69 6e    szScratch = in
9390: 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b  tegerValue(argv[
93a0: 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  i+2]);.        i
93b0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c   += 2;.      }el
93c0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
93d0: 22 73 71 6c 6f 6e 6c 79 22 29 3d 3d 30 20 29 7b  "sqlonly")==0 ){
93e0: 0a 20 20 20 20 20 20 20 20 67 2e 62 53 71 6c 4f  .        g.bSqlO
93f0: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
9400: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
9410: 7a 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  z,"size")==0 ){.
9420: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61          if( i>=a
9430: 72 67 63 2d 31 20 29 20 66 61 74 61 6c 5f 65 72  rgc-1 ) fatal_er
9440: 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67  ror("missing arg
9450: 75 6d 65 6e 74 20 6f 6e 20 25 73 5c 6e 22 2c 20  ument on %s\n", 
9460: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
9470: 20 20 67 2e 73 7a 54 65 73 74 20 3d 20 69 6e 74    g.szTest = int
9480: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b  egerValue(argv[+
9490: 2b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +i]);.      }els
94a0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
94b0: 73 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20  stats")==0 ){.  
94c0: 20 20 20 20 20 20 73 68 6f 77 53 74 61 74 73 20        showStats 
94d0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
94e0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 74   if( strcmp(z,"t
94f0: 65 73 74 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20  estset")==0 ){. 
9500: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72         if( i>=ar
9510: 67 63 2d 31 20 29 20 66 61 74 61 6c 5f 65 72 72  gc-1 ) fatal_err
9520: 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75  or("missing argu
9530: 6d 65 6e 74 20 6f 6e 20 25 73 5c 6e 22 2c 20 61  ment on %s\n", a
9540: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
9550: 20 7a 54 53 65 74 20 3d 20 61 72 67 76 5b 2b 2b   zTSet = argv[++
9560: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i];.      }else 
9570: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 74 72  if( strcmp(z,"tr
9580: 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ace")==0 ){.    
9590: 20 20 20 20 64 6f 54 72 61 63 65 20 3d 20 31 3b      doTrace = 1;
95a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
95b0: 20 73 74 72 63 6d 70 28 7a 2c 22 75 74 66 31 36   strcmp(z,"utf16
95c0: 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
95d0: 20 20 20 7a 45 6e 63 6f 64 69 6e 67 20 3d 20 22     zEncoding = "
95e0: 75 74 66 31 36 6c 65 22 3b 0a 20 20 20 20 20 20  utf16le";.      
95f0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
9600: 28 7a 2c 22 75 74 66 31 36 62 65 22 29 3d 3d 30  (z,"utf16be")==0
9610: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 63   ){.        zEnc
9620: 6f 64 69 6e 67 20 3d 20 22 75 74 66 31 36 62 65  oding = "utf16be
9630: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
9640: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 76 65 72  f( strcmp(z,"ver
9650: 69 66 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ify")==0 ){.    
9660: 20 20 20 20 67 2e 62 56 65 72 69 66 79 20 3d 20      g.bVerify = 
9670: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
9680: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 77 69 74  f( strcmp(z,"wit
9690: 68 6f 75 74 2d 72 6f 77 69 64 22 29 3d 3d 30 20  hout-rowid")==0 
96a0: 29 7b 0a 20 20 20 20 20 20 20 20 67 2e 7a 57 52  ){.        g.zWR
96b0: 20 3d 20 22 57 49 54 48 4f 55 54 20 52 4f 57 49   = "WITHOUT ROWI
96c0: 44 22 3b 0a 20 20 20 20 20 20 20 20 67 2e 7a 50  D";.        g.zP
96d0: 4b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45 59  K = "PRIMARY KEY
96e0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ";.      }else i
96f0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 68 65  f( strcmp(z, "he
9700: 6c 70 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  lp")==0 || strcm
9710: 70 28 7a 2c 22 3f 22 29 3d 3d 30 20 29 7b 0a 20  p(z,"?")==0 ){. 
9720: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 7a 48         printf(zH
9730: 65 6c 70 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20  elp, argv[0]);. 
9740: 20 20 20 20 20 20 20 65 78 69 74 28 30 29 3b 0a         exit(0);.
9750: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9760: 20 20 20 20 20 66 61 74 61 6c 5f 65 72 72 6f 72       fatal_error
9770: 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e  ("unknown option
9780: 3a 20 25 73 5c 6e 55 73 65 20 5c 22 25 73 20 2d  : %s\nUse \"%s -
9790: 3f 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c  ?\" for help\n",
97a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
97b0: 20 20 20 20 20 61 72 67 76 5b 69 5d 2c 20 61 72       argv[i], ar
97c0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  gv[0]);.      }.
97d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
97e0: 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
97f0: 20 20 7a 44 62 4e 61 6d 65 20 3d 20 61 72 67 76    zDbName = argv
9800: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
9810: 20 20 20 20 20 20 66 61 74 61 6c 5f 65 72 72 6f        fatal_erro
9820: 72 28 22 73 75 72 70 6c 75 73 20 61 72 67 75 6d  r("surplus argum
9830: 65 6e 74 3a 20 25 73 5c 6e 55 73 65 20 5c 22 25  ent: %s\nUse \"%
9840: 73 20 2d 3f 5c 22 20 66 6f 72 20 68 65 6c 70 5c  s -?\" for help\
9850: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
9860: 20 20 20 20 20 20 61 72 67 76 5b 69 5d 2c 20 61        argv[i], a
9870: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  rgv[0]);.    }. 
9880: 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20 7a   }.#if 0.  if( z
9890: 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  DbName==0 ){.   
98a0: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 7a 48 65   fatal_error(zHe
98b0: 6c 70 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20  lp, argv[0]);.  
98c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e  }.#endif.  if( n
98d0: 48 65 61 70 3e 30 20 29 7b 0a 20 20 20 20 70 48  Heap>0 ){.    pH
98e0: 65 61 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 48  eap = malloc( nH
98f0: 65 61 70 20 29 3b 0a 20 20 20 20 69 66 28 20 70  eap );.    if( p
9900: 48 65 61 70 3d 3d 30 20 29 20 66 61 74 61 6c 5f  Heap==0 ) fatal_
9910: 65 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 61 6c  error("cannot al
9920: 6c 6f 63 61 74 65 20 25 64 2d 62 79 74 65 20 68  locate %d-byte h
9930: 65 61 70 5c 6e 22 2c 20 6e 48 65 61 70 29 3b 0a  eap\n", nHeap);.
9940: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9950: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
9960: 4f 4e 46 49 47 5f 48 45 41 50 2c 20 70 48 65 61  ONFIG_HEAP, pHea
9970: 70 2c 20 6e 48 65 61 70 2c 20 6d 6e 48 65 61 70  p, nHeap, mnHeap
9980: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9990: 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 68 65 61  fatal_error("hea
99a0: 70 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  p configuration 
99b0: 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72  failed: %d\n", r
99c0: 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  c);.  }.  if( nP
99d0: 43 61 63 68 65 3e 30 20 26 26 20 73 7a 50 43 61  Cache>0 && szPCa
99e0: 63 68 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 43  che>0 ){.    pPC
99f0: 61 63 68 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  ache = malloc( n
9a00: 50 43 61 63 68 65 2a 28 73 71 6c 69 74 65 33 5f  PCache*(sqlite3_
9a10: 69 6e 74 36 34 29 73 7a 50 43 61 63 68 65 20 29  int64)szPCache )
9a20: 3b 0a 20 20 20 20 69 66 28 20 70 50 43 61 63 68  ;.    if( pPCach
9a30: 65 3d 3d 30 20 29 20 66 61 74 61 6c 5f 65 72 72  e==0 ) fatal_err
9a40: 6f 72 28 22 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63  or("cannot alloc
9a50: 61 74 65 20 25 6c 6c 64 2d 62 79 74 65 20 70 63  ate %lld-byte pc
9a60: 61 63 68 65 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ache\n",.       
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 20 20 20 20 20 20 6e 50 43 61 63 68            nPCach
9a90: 65 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e*(sqlite3_int64
9aa0: 29 73 7a 50 43 61 63 68 65 29 3b 0a 20 20 20 20  )szPCache);.    
9ab0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  rc = sqlite3_con
9ac0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
9ad0: 47 5f 50 41 47 45 43 41 43 48 45 2c 20 70 50 43  G_PAGECACHE, pPC
9ae0: 61 63 68 65 2c 20 73 7a 50 43 61 63 68 65 2c 20  ache, szPCache, 
9af0: 6e 50 43 61 63 68 65 29 3b 0a 20 20 20 20 69 66  nPCache);.    if
9b00: 28 20 72 63 20 29 20 66 61 74 61 6c 5f 65 72 72  ( rc ) fatal_err
9b10: 6f 72 28 22 70 63 61 63 68 65 20 63 6f 6e 66 69  or("pcache confi
9b20: 67 75 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a  guration failed:
9b30: 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 7d   %d\n", rc);.  }
9b40: 0a 20 20 69 66 28 20 6e 53 63 72 61 74 63 68 3e  .  if( nScratch>
9b50: 30 20 26 26 20 73 7a 53 63 72 61 74 63 68 3e 30  0 && szScratch>0
9b60: 20 29 7b 0a 20 20 20 20 70 53 63 72 61 74 63 68   ){.    pScratch
9b70: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 63 72 61   = malloc( nScra
9b80: 74 63 68 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  tch*(sqlite3_int
9b90: 36 34 29 73 7a 53 63 72 61 74 63 68 20 29 3b 0a  64)szScratch );.
9ba0: 20 20 20 20 69 66 28 20 70 53 63 72 61 74 63 68      if( pScratch
9bb0: 3d 3d 30 20 29 20 66 61 74 61 6c 5f 65 72 72 6f  ==0 ) fatal_erro
9bc0: 72 28 22 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61  r("cannot alloca
9bd0: 74 65 20 25 6c 6c 64 2d 62 79 74 65 20 73 63 72  te %lld-byte scr
9be0: 61 74 63 68 5c 6e 22 2c 0a 20 20 20 20 20 20 20  atch\n",.       
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 20 20 20 20 20 20 20 20 6e 53 63 72 61 74            nScrat
9c10: 63 68 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ch*(sqlite3_int6
9c20: 34 29 73 7a 53 63 72 61 74 63 68 29 3b 0a 20 20  4)szScratch);.  
9c30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
9c40: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
9c50: 46 49 47 5f 53 43 52 41 54 43 48 2c 20 70 53 63  FIG_SCRATCH, pSc
9c60: 72 61 74 63 68 2c 20 73 7a 53 63 72 61 74 63 68  ratch, szScratch
9c70: 2c 20 6e 53 63 72 61 74 63 68 29 3b 0a 20 20 20  , nScratch);.   
9c80: 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 5f   if( rc ) fatal_
9c90: 65 72 72 6f 72 28 22 73 63 72 61 74 63 68 20 63  error("scratch c
9ca0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 61 69  onfiguration fai
9cb0: 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b  led: %d\n", rc);
9cc0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 6b  .  }.  if( nLook
9cd0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
9ce0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
9cf0: 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45  CONFIG_LOOKASIDE
9d00: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 0a 20  , 0, 0);.  }. . 
9d10: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 64 61 74   /* Open the dat
9d20: 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 69 6e  abase and the in
9d30: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 66  put file */.  if
9d40: 28 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  ( sqlite3_open(z
9d50: 44 62 4e 61 6d 65 2c 20 26 67 2e 64 62 29 20 29  DbName, &g.db) )
9d60: 7b 0a 20 20 20 20 66 61 74 61 6c 5f 65 72 72 6f  {.    fatal_erro
9d70: 72 28 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 64  r("Cannot open d
9d80: 61 74 61 62 61 73 65 20 66 69 6c 65 3a 20 25 73  atabase file: %s
9d90: 5c 6e 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  \n", zDbName);. 
9da0: 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 6b 3e 30   }.  if( nLook>0
9db0: 20 26 26 20 73 7a 4c 6f 6f 6b 3e 30 20 29 7b 0a   && szLook>0 ){.
9dc0: 20 20 20 20 70 4c 6f 6f 6b 20 3d 20 6d 61 6c 6c      pLook = mall
9dd0: 6f 63 28 20 6e 4c 6f 6f 6b 2a 73 7a 4c 6f 6f 6b  oc( nLook*szLook
9de0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
9df0: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 67  ite3_db_config(g
9e00: 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  .db, SQLITE_DBCO
9e10: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 2c 20  NFIG_LOOKASIDE, 
9e20: 70 4c 6f 6f 6b 2c 20 73 7a 4c 6f 6f 6b 2c 6e 4c  pLook, szLook,nL
9e30: 6f 6f 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ook);.    if( rc
9e40: 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22   ) fatal_error("
9e50: 6c 6f 6f 6b 61 73 69 64 65 20 63 6f 6e 66 69 67  lookaside config
9e60: 75 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a 20  uration failed: 
9e70: 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 7d 0a  %d\n", rc);.  }.
9e80: 0a 20 20 2f 2a 20 53 65 74 20 64 61 74 61 62 61  .  /* Set databa
9e90: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  se connection op
9ea0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74  tions */.  sqlit
9eb0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
9ec0: 6f 6e 28 67 2e 64 62 2c 20 22 72 61 6e 64 6f 6d  on(g.db, "random
9ed0: 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 0, SQLITE_UTF
9ee0: 38 2c 20 30 2c 20 72 61 6e 64 6f 6d 46 75 6e 63  8, 0, randomFunc
9ef0: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 64  , 0, 0);.  if( d
9f00: 6f 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  oTrace ) sqlite3
9f10: 5f 74 72 61 63 65 28 67 2e 64 62 2c 20 74 72 61  _trace(g.db, tra
9f20: 63 65 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a  ceCallback, 0);.
9f30: 20 20 69 66 28 20 7a 4b 65 79 20 29 7b 0a 20 20    if( zKey ){.  
9f40: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
9f50: 63 28 22 50 52 41 47 4d 41 20 6b 65 79 28 27 25  c("PRAGMA key('%
9f60: 73 27 29 22 2c 20 7a 4b 65 79 29 3b 0a 20 20 7d  s')", zKey);.  }
9f70: 0a 20 20 69 66 28 20 7a 45 6e 63 6f 64 69 6e 67  .  if( zEncoding
9f80: 20 29 7b 0a 20 20 20 20 73 70 65 65 64 74 65 73   ){.    speedtes
9f90: 74 31 5f 65 78 65 63 28 22 50 52 41 47 4d 41 20  t1_exec("PRAGMA 
9fa0: 65 6e 63 6f 64 69 6e 67 3d 25 73 22 2c 20 7a 45  encoding=%s", zE
9fb0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 7d 0a 20 20  ncoding);.  }.  
9fc0: 69 66 28 20 64 6f 41 75 74 6f 76 61 63 20 29 7b  if( doAutovac ){
9fd0: 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f  .    speedtest1_
9fe0: 65 78 65 63 28 22 50 52 41 47 4d 41 20 61 75 74  exec("PRAGMA aut
9ff0: 6f 5f 76 61 63 75 75 6d 3d 46 55 4c 4c 22 29 3b  o_vacuum=FULL");
a000: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 6f 49  .  }else if( doI
a010: 6e 63 72 76 61 63 20 29 7b 0a 20 20 20 20 73 70  ncrvac ){.    sp
a020: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 50  eedtest1_exec("P
a030: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
a040: 6d 3d 49 4e 43 52 45 4d 45 4e 54 41 4c 22 29 3b  m=INCREMENTAL");
a050: 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53  .  }.  if( pageS
a060: 69 7a 65 20 29 7b 0a 20 20 20 20 73 70 65 65 64  ize ){.    speed
a070: 74 65 73 74 31 5f 65 78 65 63 28 22 50 52 41 47  test1_exec("PRAG
a080: 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 25 64 22  MA page_size=%d"
a090: 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  , pageSize);.  }
a0a0: 0a 20 20 69 66 28 20 63 61 63 68 65 53 69 7a 65  .  if( cacheSize
a0b0: 20 29 7b 0a 20 20 20 20 73 70 65 65 64 74 65 73   ){.    speedtes
a0c0: 74 31 5f 65 78 65 63 28 22 50 52 41 47 4d 41 20  t1_exec("PRAGMA 
a0d0: 63 61 63 68 65 5f 73 69 7a 65 3d 25 64 22 2c 20  cache_size=%d", 
a0e0: 63 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  cacheSize);.  }.
a0f0: 20 20 69 66 28 20 6e 6f 53 79 6e 63 20 29 20 73    if( noSync ) s
a100: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
a110: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
a120: 75 73 3d 4f 46 46 22 29 3b 0a 20 20 69 66 28 20  us=OFF");.  if( 
a130: 64 6f 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20  doExclusive ){. 
a140: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78     speedtest1_ex
a150: 65 63 28 22 50 52 41 47 4d 41 20 6c 6f 63 6b 69  ec("PRAGMA locki
a160: 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
a170: 45 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  E");.  }.  if( z
a180: 4a 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 70 65  JMode ){.    spe
a190: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 50 52  edtest1_exec("PR
a1a0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
a1b0: 65 3d 25 73 22 2c 20 7a 4a 4d 6f 64 65 29 3b 0a  e=%s", zJMode);.
a1c0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 2e 62 45 78    }..  if( g.bEx
a1d0: 70 6c 61 69 6e 20 29 20 70 72 69 6e 74 66 28 22  plain ) printf("
a1e0: 2e 65 78 70 6c 61 69 6e 5c 6e 2e 65 63 68 6f 20  .explain\n.echo 
a1f0: 6f 6e 5c 6e 22 29 3b 0a 20 20 69 66 28 20 73 74  on\n");.  if( st
a200: 72 63 6d 70 28 7a 54 53 65 74 2c 22 6d 61 69 6e  rcmp(zTSet,"main
a210: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73  ")==0 ){.    tes
a220: 74 73 65 74 5f 6d 61 69 6e 28 29 3b 0a 20 20 7d  tset_main();.  }
a230: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
a240: 7a 54 53 65 74 2c 22 64 65 62 75 67 31 22 29 3d  zTSet,"debug1")=
a250: 3d 30 20 29 7b 0a 20 20 20 20 74 65 73 74 73 65  =0 ){.    testse
a260: 74 5f 64 65 62 75 67 31 28 29 3b 0a 20 20 7d 65  t_debug1();.  }e
a270: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
a280: 54 53 65 74 2c 22 63 74 65 22 29 3d 3d 30 20 29  TSet,"cte")==0 )
a290: 7b 0a 20 20 20 20 74 65 73 74 73 65 74 5f 63 74  {.    testset_ct
a2a0: 65 28 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  e();.  }else if(
a2b0: 20 73 74 72 63 6d 70 28 7a 54 53 65 74 2c 22 72   strcmp(zTSet,"r
a2c0: 74 72 65 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tree")==0 ){.   
a2d0: 20 74 65 73 74 73 65 74 5f 72 74 72 65 65 28 36   testset_rtree(6
a2e0: 2c 20 31 34 37 29 3b 0a 20 20 7d 65 6c 73 65 7b  , 147);.  }else{
a2f0: 0a 20 20 20 20 66 61 74 61 6c 5f 65 72 72 6f 72  .    fatal_error
a300: 28 22 75 6e 6b 6e 6f 77 6e 20 74 65 73 74 73 65  ("unknown testse
a310: 74 3a 20 5c 22 25 73 5c 22 5c 6e 43 68 6f 69 63  t: \"%s\"\nChoic
a320: 65 73 3a 20 6d 61 69 6e 20 64 65 62 75 67 31 20  es: main debug1 
a330: 63 74 65 20 72 74 72 65 65 5c 6e 22 2c 0a 20 20  cte rtree\n",.  
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
a350: 54 53 65 74 29 3b 0a 20 20 7d 0a 20 20 73 70 65  TSet);.  }.  spe
a360: 65 64 74 65 73 74 31 5f 66 69 6e 61 6c 28 29 3b  edtest1_final();
a370: 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ..  /* Database 
a380: 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 69  connection stati
a390: 73 74 69 63 73 20 70 72 69 6e 74 65 64 20 61 66  stics printed af
a3a0: 74 65 72 20 62 6f 74 68 20 70 72 65 70 61 72 65  ter both prepare
a3b0: 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 2a  d statements.  *
a3c0: 2a 20 68 61 76 65 20 62 65 65 6e 20 66 69 6e 61  * have been fina
a3d0: 6c 69 7a 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c  lized */.#if SQL
a3e0: 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
a3f0: 45 52 3e 3d 33 30 30 37 30 30 39 0a 20 20 69 66  ER>=3007009.  if
a400: 28 20 73 68 6f 77 53 74 61 74 73 20 29 7b 0a 20  ( showStats ){. 
a410: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
a420: 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54  atus(g.db, SQLIT
a430: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
a440: 53 49 44 45 5f 55 53 45 44 2c 20 26 69 43 75 72  SIDE_USED, &iCur
a450: 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20  , &iHi, 0);.    
a460: 70 72 69 6e 74 66 28 22 2d 2d 20 4c 6f 6f 6b 61  printf("-- Looka
a470: 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65 64 3a  side Slots Used:
a480: 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20          %d (max 
a490: 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69  %d)\n", iCur,iHi
a4a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  );.    sqlite3_d
a4b0: 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20 53  b_status(g.db, S
a4c0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
a4d0: 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 20 26 69  OOKASIDE_HIT, &i
a4e0: 43 75 72 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20  Cur, &iHi, 0);. 
a4f0: 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 53 75     printf("-- Su
a500: 63 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69  ccessful lookasi
a510: 64 65 73 3a 20 20 20 20 20 20 20 25 64 5c 6e 22  des:       %d\n"
a520: 2c 20 69 48 69 29 3b 0a 20 20 20 20 73 71 6c 69  , iHi);.    sqli
a530: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e  te3_db_status(g.
a540: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
a550: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49  TUS_LOOKASIDE_MI
a560: 53 53 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 26  SS_SIZE, &iCur,&
a570: 69 48 69 2c 30 29 3b 0a 20 20 20 20 70 72 69 6e  iHi,0);.    prin
a580: 74 66 28 22 2d 2d 20 4c 6f 6f 6b 61 73 69 64 65  tf("-- Lookaside
a590: 20 73 69 7a 65 20 66 61 75 6c 74 73 3a 20 20 20   size faults:   
a5a0: 20 20 20 20 25 64 5c 6e 22 2c 20 69 48 69 29 3b      %d\n", iHi);
a5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
a5c0: 73 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c  status(g.db, SQL
a5d0: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
a5e0: 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c  KASIDE_MISS_FULL
a5f0: 2c 20 26 69 43 75 72 2c 26 69 48 69 2c 30 29 3b  , &iCur,&iHi,0);
a600: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20  .    printf("-- 
a610: 4c 6f 6f 6b 61 73 69 64 65 20 4f 4f 4d 20 66 61  Lookaside OOM fa
a620: 75 6c 74 73 3a 20 20 20 20 20 20 20 20 25 64 5c  ults:        %d\
a630: 6e 22 2c 20 69 48 69 29 3b 0a 20 20 20 20 73 71  n", iHi);.    sq
a640: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
a650: 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  g.db, SQLITE_DBS
a660: 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45 44  TATUS_CACHE_USED
a670: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30  , &iCur, &iHi, 0
a680: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d  );.    printf("-
a690: 2d 20 50 61 67 65 72 20 48 65 61 70 20 55 73 61  - Pager Heap Usa
a6a0: 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 25  ge:            %
a6b0: 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72  d bytes\n", iCur
a6c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  );.    sqlite3_d
a6d0: 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20 53  b_status(g.db, S
a6e0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
a6f0: 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  ACHE_HIT, &iCur,
a700: 20 26 69 48 69 2c 20 31 29 3b 0a 20 20 20 20 70   &iHi, 1);.    p
a710: 72 69 6e 74 66 28 22 2d 2d 20 50 61 67 65 20 63  rintf("-- Page c
a720: 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20  ache hits:      
a730: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
a740: 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
a750: 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c  _db_status(g.db,
a760: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
a770: 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43  _CACHE_MISS, &iC
a780: 75 72 2c 20 26 69 48 69 2c 20 31 29 3b 0a 20 20  ur, &iHi, 1);.  
a790: 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 50 61 67    printf("-- Pag
a7a0: 65 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20  e cache misses: 
a7b0: 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
a7c0: 20 69 43 75 72 29 3b 0a 23 69 66 20 53 51 4c 49   iCur);.#if SQLI
a7d0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
a7e0: 52 3e 3d 33 30 30 37 30 31 32 0a 20 20 20 20 73  R>=3007012.    s
a7f0: 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73  qlite3_db_status
a800: 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  (g.db, SQLITE_DB
a810: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 57 52 49  STATUS_CACHE_WRI
a820: 54 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 2c  TE, &iCur, &iHi,
a830: 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   1);.    printf(
a840: 22 2d 2d 20 50 61 67 65 20 63 61 63 68 65 20 77  "-- Page cache w
a850: 72 69 74 65 73 3a 20 20 20 20 20 20 20 20 20 20  rites:          
a860: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a   %d\n", iCur); .
a870: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
a880: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64  e3_db_status(g.d
a890: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
a8a0: 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20  US_SCHEMA_USED, 
a8b0: 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30 29 3b  &iCur, &iHi, 0);
a8c0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20  .    printf("-- 
a8d0: 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67  Schema Heap Usag
a8e0: 65 3a 20 20 20 20 20 20 20 20 20 20 20 25 64 20  e:           %d 
a8f0: 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72 29 3b  bytes\n", iCur);
a900: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62   .    sqlite3_db
a910: 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51  _status(g.db, SQ
a920: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54  LITE_DBSTATUS_ST
a930: 4d 54 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20  MT_USED, &iCur, 
a940: 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70 72  &iHi, 0);.    pr
a950: 69 6e 74 66 28 22 2d 2d 20 53 74 61 74 65 6d 65  intf("-- Stateme
a960: 6e 74 20 48 65 61 70 20 55 73 61 67 65 3a 20 20  nt Heap Usage:  
a970: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
a980: 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 7d 0a 23  ", iCur); .  }.#
a990: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
a9a0: 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 0a 20  _close(g.db);.. 
a9b0: 20 2f 2a 20 47 6c 6f 62 61 6c 20 6d 65 6d 6f 72   /* Global memor
a9c0: 79 20 75 73 61 67 65 20 73 74 61 74 69 73 74 69  y usage statisti
a9d0: 63 73 20 70 72 69 6e 74 65 64 20 61 66 74 65 72  cs printed after
a9e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
a9f0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2a 20 68 61  nnection.  ** ha
aa00: 73 20 63 6c 6f 73 65 64 2e 20 20 4d 65 6d 6f 72  s closed.  Memor
aa10: 79 20 75 73 61 67 65 20 73 68 6f 75 6c 64 20 62  y usage should b
aa20: 65 20 7a 65 72 6f 20 61 74 20 74 68 69 73 20 70  e zero at this p
aa30: 6f 69 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 73  oint. */.  if( s
aa40: 68 6f 77 53 74 61 74 73 20 29 7b 0a 20 20 20 20  howStats ){.    
aa50: 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53  sqlite3_status(S
aa60: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 45 4d  QLITE_STATUS_MEM
aa70: 4f 52 59 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  ORY_USED, &iCur,
aa80: 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70   &iHi, 0);.    p
aa90: 72 69 6e 74 66 28 22 2d 2d 20 4d 65 6d 6f 72 79  rintf("-- Memory
aaa0: 20 55 73 65 64 20 28 62 79 74 65 73 29 3a 20 20   Used (bytes):  
aab0: 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25         %d (max %
aac0: 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69 29  d)\n", iCur,iHi)
aad0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45 52  ;.#if SQLITE_VER
aae0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30 30  SION_NUMBER>=300
aaf0: 37 30 30 30 0a 20 20 20 20 73 71 6c 69 74 65 33  7000.    sqlite3
ab00: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
ab10: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
ab20: 4e 54 2c 20 26 69 43 75 72 2c 20 26 69 48 69 2c  NT, &iCur, &iHi,
ab30: 20 30 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   0);.    printf(
ab40: 22 2d 2d 20 4f 75 74 73 74 61 6e 64 69 6e 67 20  "-- Outstanding 
ab50: 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 20 20 20 20  Allocations:    
ab60: 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c   %d (max %d)\n",
ab70: 20 69 43 75 72 2c 69 48 69 29 3b 0a 23 65 6e 64   iCur,iHi);.#end
ab80: 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  if.    sqlite3_s
ab90: 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41  tatus(SQLITE_STA
aba0: 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56  TUS_PAGECACHE_OV
abb0: 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26  ERFLOW, &iCur, &
abc0: 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70 72 69  iHi, 0);.    pri
abd0: 6e 74 66 28 22 2d 2d 20 50 63 61 63 68 65 20 4f  ntf("-- Pcache O
abe0: 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 20 20  verflow Bytes:  
abf0: 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
ac00: 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69 29 3b 0a  \n", iCur,iHi);.
ac10: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74      sqlite3_stat
ac20: 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53  us(SQLITE_STATUS
ac30: 5f 53 43 52 41 54 43 48 5f 4f 56 45 52 46 4c 4f  _SCRATCH_OVERFLO
ac40: 57 2c 20 26 69 43 75 72 2c 20 26 69 48 69 2c 20  W, &iCur, &iHi, 
ac50: 30 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  0);.    printf("
ac60: 2d 2d 20 53 63 72 61 74 63 68 20 4f 76 65 72 66  -- Scratch Overf
ac70: 6c 6f 77 20 42 79 74 65 73 3a 20 20 20 20 20 20  low Bytes:      
ac80: 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22 2c 20  %d (max %d)\n", 
ac90: 69 43 75 72 2c 69 48 69 29 3b 0a 20 20 20 20 73  iCur,iHi);.    s
aca0: 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51  qlite3_status(SQ
acb0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
acc0: 4f 43 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20  OC_SIZE, &iCur, 
acd0: 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70 72  &iHi, 0);.    pr
ace0: 69 6e 74 66 28 22 2d 2d 20 4c 61 72 67 65 73 74  intf("-- Largest
acf0: 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20 20 20   Allocation:    
ad00: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
ad10: 22 2c 69 48 69 29 3b 0a 20 20 20 20 73 71 6c 69  ",iHi);.    sqli
ad20: 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54  te3_status(SQLIT
ad30: 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
ad40: 48 45 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20  HE_SIZE, &iCur, 
ad50: 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70 72  &iHi, 0);.    pr
ad60: 69 6e 74 66 28 22 2d 2d 20 4c 61 72 67 65 73 74  intf("-- Largest
ad70: 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69   Pcache Allocati
ad80: 6f 6e 3a 20 20 20 25 64 20 62 79 74 65 73 5c 6e  on:   %d bytes\n
ad90: 22 2c 69 48 69 29 3b 0a 20 20 20 20 73 71 6c 69  ",iHi);.    sqli
ada0: 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54  te3_status(SQLIT
adb0: 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54 43 48  E_STATUS_SCRATCH
adc0: 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20 26 69  _SIZE, &iCur, &i
add0: 48 69 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e  Hi, 0);.    prin
ade0: 74 66 28 22 2d 2d 20 4c 61 72 67 65 73 74 20 53  tf("-- Largest S
adf0: 63 72 61 74 63 68 20 41 6c 6c 6f 63 61 74 69 6f  cratch Allocatio
ae00: 6e 3a 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c  n:  %d bytes\n",
ae10: 20 69 48 69 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   iHi);.  }..  /*
ae20: 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   Release memory 
ae30: 2a 2f 0a 20 20 66 72 65 65 28 20 70 4c 6f 6f 6b  */.  free( pLook
ae40: 20 29 3b 0a 20 20 66 72 65 65 28 20 70 50 43 61   );.  free( pPCa
ae50: 63 68 65 20 29 3b 0a 20 20 66 72 65 65 28 20 70  che );.  free( p
ae60: 53 63 72 61 74 63 68 20 29 3b 0a 20 20 66 72 65  Scratch );.  fre
ae70: 65 28 20 70 48 65 61 70 20 29 3b 0a 20 20 72 65  e( pHeap );.  re
ae80: 74 75 72 6e 20 30 3b 0a 7d 0a                    turn 0;.}.