SQLite
Hex Artifact Content
Not logged in

Artifact 83f6b3318f7ee60e52b978b5a5e5dd7e83dfb7ee:


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 74 68 72 65 61 64 73 20 4e    "  --threads N
0610: 20 20 20 20 20 20 20 20 20 55 73 65 20 75 70 20           Use up 
0620: 74 6f 20 4e 20 74 68 72 65 61 64 73 20 66 6f 72  to N threads for
0630: 20 73 6f 72 74 69 6e 67 5c 6e 22 0a 20 20 22 20   sorting\n".  " 
0640: 20 2d 2d 75 74 66 31 36 62 65 20 20 20 20 20 20   --utf16be      
0650: 20 20 20 20 20 53 65 74 20 74 65 78 74 20 65 6e       Set text en
0660: 63 6f 64 69 6e 67 20 74 6f 20 55 54 46 2d 31 36  coding to UTF-16
0670: 42 45 5c 6e 22 0a 20 20 22 20 20 2d 2d 75 74 66  BE\n".  "  --utf
0680: 31 36 6c 65 20 20 20 20 20 20 20 20 20 20 20 53  16le           S
0690: 65 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  et text encoding
06a0: 20 74 6f 20 55 54 46 2d 31 36 4c 45 5c 6e 22 0a   to UTF-16LE\n".
06b0: 20 20 22 20 20 2d 2d 76 65 72 69 66 79 20 20 20    "  --verify   
06c0: 20 20 20 20 20 20 20 20 20 52 75 6e 20 61 64 64           Run add
06d0: 69 74 69 6f 6e 61 6c 20 76 65 72 69 66 69 63 61  itional verifica
06e0: 74 69 6f 6e 20 73 74 65 70 73 2e 5c 6e 22 0a 20  tion steps.\n". 
06f0: 20 22 20 20 2d 2d 77 69 74 68 6f 75 74 2d 72 6f   "  --without-ro
0700: 77 69 64 20 20 20 20 20 55 73 65 20 57 49 54 48  wid     Use WITH
0710: 4f 55 54 20 52 4f 57 49 44 20 77 68 65 72 65 20  OUT ROWID where 
0720: 61 70 70 72 6f 70 72 69 61 74 65 5c 6e 22 0a 3b  appropriate\n".;
0730: 0a 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  ...#include "sql
0740: 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ite3.h".#include
0750: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
0760: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0770: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0780: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0790: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
07a0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c  <string.h>.#incl
07b0: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f  ude <ctype.h>../
07c0: 2a 20 41 6c 6c 20 67 6c 6f 62 61 6c 20 73 74 61  * All global sta
07d0: 74 65 20 69 73 20 68 65 6c 64 20 69 6e 20 74 68  te is held in th
07e0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
07f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 47 6c  static struct Gl
0800: 6f 62 61 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33  obal {.  sqlite3
0810: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
0820: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20      /* The open 
0830: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0840: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
0850: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20  _stmt *pStmt;   
0860: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 53      /* Current S
0870: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
0880: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
0890: 69 53 74 61 72 74 3b 20 20 20 20 20 20 2f 2a 20  iStart;      /* 
08a0: 53 74 61 72 74 2d 74 69 6d 65 20 66 6f 72 20 74  Start-time for t
08b0: 68 65 20 63 75 72 72 65 6e 74 20 74 65 73 74 20  he current test 
08c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
08d0: 36 34 20 69 54 6f 74 61 6c 3b 20 20 20 20 20 20  64 iTotal;      
08e0: 2f 2a 20 54 6f 74 61 6c 20 74 69 6d 65 20 2a 2f  /* Total time */
08f0: 0a 20 20 69 6e 74 20 62 57 69 74 68 6f 75 74 52  .  int bWithoutR
0900: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  owid;         /*
0910: 20 54 72 75 65 20 66 6f 72 20 2d 2d 77 69 74 68   True for --with
0920: 6f 75 74 2d 72 6f 77 69 64 20 2a 2f 0a 20 20 69  out-rowid */.  i
0930: 6e 74 20 62 52 65 70 72 65 70 61 72 65 3b 20 20  nt bReprepare;  
0940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0950: 65 20 74 6f 20 72 65 70 72 65 70 61 72 65 20 74  e to reprepare t
0960: 68 65 20 53 51 4c 20 6f 6e 20 65 61 63 68 20 72  he SQL on each r
0970: 65 72 75 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 53  erun */.  int bS
0980: 71 6c 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  qlOnly;         
0990: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
09a0: 70 72 69 6e 74 20 74 68 65 20 53 51 4c 20 6f 6e  print the SQL on
09b0: 63 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  ce only */.  int
09c0: 20 62 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20   bExplain;      
09d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e 74          /* Print
09e0: 20 53 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49   SQL with EXPLAI
09f0: 4e 20 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e  N prefix */.  in
0a00: 74 20 62 56 65 72 69 66 79 3b 20 20 20 20 20 20  t bVerify;      
0a10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 79 20           /* Try 
0a20: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 72  to verify that r
0a30: 65 73 75 6c 74 73 20 61 72 65 20 63 6f 72 72 65  esults are corre
0a40: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 54 65  ct */.  int szTe
0a50: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
0a60: 20 20 20 2f 2a 20 53 63 61 6c 65 20 66 61 63 74     /* Scale fact
0a70: 6f 72 20 66 6f 72 20 74 65 73 74 20 69 74 65 72  or for test iter
0a80: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73  ations */.  cons
0a90: 74 20 63 68 61 72 20 2a 7a 57 52 3b 20 20 20 20  t char *zWR;    
0aa0: 20 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20         /* Might 
0ab0: 62 65 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  be WITHOUT ROWID
0ac0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0ad0: 20 2a 7a 4e 4e 3b 20 20 20 20 20 20 20 20 20 20   *zNN;          
0ae0: 20 2f 2a 20 4d 69 67 68 74 20 62 65 20 4e 4f 54   /* Might be NOT
0af0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
0b00: 20 63 68 61 72 20 2a 7a 50 4b 3b 20 20 20 20 20   char *zPK;     
0b10: 20 20 20 20 20 20 2f 2a 20 4d 69 67 68 74 20 62        /* Might b
0b20: 65 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  e UNIQUE or PRIM
0b30: 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 75 6e 73  ARY KEY */.  uns
0b40: 69 67 6e 65 64 20 69 6e 74 20 78 2c 20 79 3b 20  igned int x, y; 
0b50: 20 20 20 20 20 20 20 20 2f 2a 20 50 73 65 75 64          /* Pseud
0b60: 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  o-random number 
0b70: 67 65 6e 65 72 61 74 6f 72 20 73 74 61 74 65 20  generator state 
0b80: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
0b90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0ba0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 63  /* Size of the c
0bb0: 75 72 72 65 6e 74 20 72 65 73 75 6c 74 20 2a 2f  urrent result */
0bc0: 0a 20 20 63 68 61 72 20 7a 52 65 73 75 6c 74 5b  .  char zResult[
0bd0: 33 30 30 30 5d 3b 20 20 20 20 20 20 20 20 2f 2a  3000];        /*
0be0: 20 54 65 78 74 20 6f 66 20 74 68 65 20 63 75 72   Text of the cur
0bf0: 72 65 6e 74 20 72 65 73 75 6c 74 20 2a 2f 0a 7d  rent result */.}
0c00: 20 67 3b 0a 0a 0a 2f 2a 20 50 72 69 6e 74 20 61   g;.../* Print a
0c10: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
0c20: 61 6e 64 20 65 78 69 74 20 2a 2f 0a 73 74 61 74  and exit */.stat
0c30: 69 63 20 76 6f 69 64 20 66 61 74 61 6c 5f 65 72  ic void fatal_er
0c40: 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ror(const char *
0c50: 7a 4d 73 67 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  zMsg, ...){.  va
0c60: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
0c70: 74 61 72 74 28 61 70 2c 20 7a 4d 73 67 29 3b 0a  tart(ap, zMsg);.
0c80: 20 20 76 66 70 72 69 6e 74 66 28 73 74 64 65 72    vfprintf(stder
0c90: 72 2c 20 7a 4d 73 67 2c 20 61 70 29 3b 0a 20 20  r, zMsg, ap);.  
0ca0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65 78  va_end(ap);.  ex
0cb0: 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
0cc0: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
0cd0: 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d 61   of a hexadecima
0ce0: 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72 6e  l digit.  Return
0cf0: 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75 74   -1 if the input
0d00: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65 78  .** is not a hex
0d10: 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   digit..*/.stati
0d20: 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56 61  c int hexDigitVa
0d30: 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20 69  lue(char c){.  i
0d40: 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
0d50: 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  '9' ) return c -
0d60: 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27   '0';.  if( c>='
0d70: 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20 72  a' && c<='f' ) r
0d80: 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20  eturn c - 'a' + 
0d90: 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41 27  10;.  if( c>='A'
0da0: 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65 74   && c<='F' ) ret
0db0: 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31 30  urn c - 'A' + 10
0dc0: 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
0dd0: 0a 0a 2f 2a 20 50 72 6f 76 69 64 65 20 61 6e 20  ../* Provide an 
0de0: 61 6c 74 65 72 6e 61 74 69 76 65 20 74 6f 20 73  alternative to s
0df0: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 29  qlite3_stricmp()
0e00: 20 69 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   in older versio
0e10: 6e 73 20 6f 66 0a 2a 2a 20 53 51 4c 69 74 65 20  ns of.** SQLite 
0e20: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 56 45  */.#if SQLITE_VE
0e30: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3c 33 30 30  RSION_NUMBER<300
0e40: 37 30 31 31 0a 23 20 64 65 66 69 6e 65 20 73 71  7011.# define sq
0e50: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 20 73 74  lite3_stricmp st
0e60: 72 63 6d 70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rcmp.#endif../*.
0e70: 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72  ** Interpret zAr
0e80: 67 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20  g as an integer 
0e90: 76 61 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20  value, possibly 
0ea0: 77 69 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a  with suffixes..*
0eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 74  /.static int int
0ec0: 65 67 65 72 56 61 6c 75 65 28 63 6f 6e 73 74 20  egerValue(const 
0ed0: 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73  char *zArg){.  s
0ee0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 20 3d  qlite3_int64 v =
0ef0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   0;.  static con
0f00: 73 74 20 73 74 72 75 63 74 20 7b 20 63 68 61 72  st struct { char
0f10: 20 2a 7a 53 75 66 66 69 78 3b 20 69 6e 74 20 69   *zSuffix; int i
0f20: 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20  Mult; } aMult[] 
0f30: 3d 20 7b 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c  = {.    { "KiB",
0f40: 20 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22   1024 },.    { "
0f50: 4d 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 20  MiB", 1024*1024 
0f60: 7d 2c 0a 20 20 20 20 7b 20 22 47 69 42 22 2c 20  },.    { "GiB", 
0f70: 31 30 32 34 2a 31 30 32 34 2a 31 30 32 34 20 7d  1024*1024*1024 }
0f80: 2c 0a 20 20 20 20 7b 20 22 4b 42 22 2c 20 20 31  ,.    { "KB",  1
0f90: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42  000 },.    { "MB
0fa0: 22 2c 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ",  1000000 },. 
0fb0: 20 20 20 7b 20 22 47 42 22 2c 20 20 31 30 30 30     { "GB",  1000
0fc0: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
0fd0: 22 4b 22 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20  "K",   1000 },. 
0fe0: 20 20 20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30     { "M",   1000
0ff0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22  000 },.    { "G"
1000: 2c 20 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ,   1000000000 }
1010: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
1020: 20 20 69 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b    int isNeg = 0;
1030: 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  .  if( zArg[0]==
1040: 27 2d 27 20 29 7b 0a 20 20 20 20 69 73 4e 65 67  '-' ){.    isNeg
1050: 20 3d 20 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b   = 1;.    zArg++
1060: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 41  ;.  }else if( zA
1070: 72 67 5b 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20  rg[0]=='+' ){.  
1080: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20    zArg++;.  }.  
1090: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27  if( zArg[0]=='0'
10a0: 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27   && zArg[1]=='x'
10b0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20   ){.    int x;. 
10c0: 20 20 20 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20     zArg += 2;.  
10d0: 20 20 77 68 69 6c 65 28 20 28 78 20 3d 20 68 65    while( (x = he
10e0: 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72 67  xDigitValue(zArg
10f0: 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20  [0]))>=0 ){.    
1100: 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78    v = (v<<4) + x
1110: 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
1120: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1130: 20 20 20 77 68 69 6c 65 28 20 69 73 64 69 67 69     while( isdigi
1140: 74 28 7a 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20  t(zArg[0]) ){.  
1150: 20 20 20 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a      v = v*10 + z
1160: 41 72 67 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20  Arg[0] - '0';.  
1170: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
1180: 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
1190: 20 69 3c 73 69 7a 65 6f 66 28 61 4d 75 6c 74 29   i<sizeof(aMult)
11a0: 2f 73 69 7a 65 6f 66 28 61 4d 75 6c 74 5b 30 5d  /sizeof(aMult[0]
11b0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
11c0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
11d0: 28 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66 66 69  (aMult[i].zSuffi
11e0: 78 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20  x, zArg)==0 ){. 
11f0: 20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c 74 5b       v *= aMult[
1200: 69 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20 20 20  i].iMult;.      
1210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1220: 0a 20 20 69 66 28 20 76 3e 30 78 37 66 66 66 66  .  if( v>0x7ffff
1230: 66 66 66 20 29 20 66 61 74 61 6c 5f 65 72 72 6f  fff ) fatal_erro
1240: 72 28 22 70 61 72 61 6d 65 74 65 72 20 74 6f 6f  r("parameter too
1250: 20 6c 61 72 67 65 20 2d 20 6d 61 78 20 32 31 34   large - max 214
1260: 37 34 38 33 36 34 38 22 29 3b 0a 20 20 72 65 74  7483648");.  ret
1270: 75 72 6e 20 28 69 6e 74 29 28 69 73 4e 65 67 3f  urn (int)(isNeg?
1280: 20 2d 76 20 3a 20 76 29 3b 0a 7d 0a 0a 2f 2a 20   -v : v);.}../* 
1290: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
12a0: 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69  nt wall-clock ti
12b0: 6d 65 2c 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  me, in milliseco
12c0: 6e 64 73 20 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  nds */.sqlite3_i
12d0: 6e 74 36 34 20 73 70 65 65 64 74 65 73 74 31 5f  nt64 speedtest1_
12e0: 74 69 6d 65 73 74 61 6d 70 28 76 6f 69 64 29 7b  timestamp(void){
12f0: 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
1300: 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20  3_vfs *clockVfs 
1310: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
1320: 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c  nt64 t;.  if( cl
1330: 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63  ockVfs==0 ) cloc
1340: 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  kVfs = sqlite3_v
1350: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 23 69 66 20  fs_find(0);.#if 
1360: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1370: 55 4d 42 45 52 3e 3d 33 30 30 37 30 30 30 0a 20  UMBER>=3007000. 
1380: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69   if( clockVfs->i
1390: 56 65 72 73 69 6f 6e 3e 3d 32 20 26 26 20 63 6c  Version>=2 && cl
13a0: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
13b0: 54 69 6d 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a  TimeInt64!=0 ){.
13c0: 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43      clockVfs->xC
13d0: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
13e0: 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20  clockVfs, &t);. 
13f0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1400: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a  {.    double r;.
1410: 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43      clockVfs->xC
1420: 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63 6b  urrentTime(clock
1430: 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20 74 20  Vfs, &r);.    t 
1440: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
1450: 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30 29 3b  )(r*86400000.0);
1460: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b  .  }.  return t;
1470: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
1480: 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 75 6e  pseudo-random un
1490: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
14a0: 2f 0a 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 73  /.unsigned int s
14b0: 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d  peedtest1_random
14c0: 28 76 6f 69 64 29 7b 0a 20 20 67 2e 78 20 3d 20  (void){.  g.x = 
14d0: 28 67 2e 78 3e 3e 31 29 20 5e 20 28 28 31 2b 7e  (g.x>>1) ^ ((1+~
14e0: 28 67 2e 78 26 31 29 29 20 26 20 30 78 64 30 30  (g.x&1)) & 0xd00
14f0: 30 30 30 30 31 29 3b 0a 20 20 67 2e 79 20 3d 20  00001);.  g.y = 
1500: 67 2e 79 2a 31 31 30 33 35 31 35 32 34 35 20 2b  g.y*1103515245 +
1510: 20 31 32 33 34 35 3b 0a 20 20 72 65 74 75 72 6e   12345;.  return
1520: 20 67 2e 78 20 5e 20 67 2e 79 3b 0a 7d 0a 0a 2f   g.x ^ g.y;.}../
1530: 2a 20 4d 61 70 20 74 68 65 20 76 61 6c 75 65 20  * Map the value 
1540: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  in within the ra
1550: 6e 67 65 20 6f 66 20 31 2e 2e 2e 6c 69 6d 69 74  nge of 1...limit
1560: 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 0a 2a 2a   into another.**
1570: 20 6e 75 6d 62 65 72 20 69 6e 20 61 20 77 61 79   number in a way
1580: 20 74 68 61 74 20 69 73 20 63 68 61 74 69 63 20   that is chatic 
1590: 61 6e 64 20 69 6e 76 65 72 74 61 62 6c 65 2e 0a  and invertable..
15a0: 2a 2f 0a 75 6e 73 69 67 6e 65 64 20 73 77 69 7a  */.unsigned swiz
15b0: 7a 6c 65 28 75 6e 73 69 67 6e 65 64 20 69 6e 2c  zle(unsigned in,
15c0: 20 75 6e 73 69 67 6e 65 64 20 6c 69 6d 69 74 29   unsigned limit)
15d0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6f 75 74  {.  unsigned out
15e0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c   = 0;.  while( l
15f0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 6f 75 74 20  imit ){.    out 
1600: 3d 20 28 6f 75 74 3c 3c 31 29 20 7c 20 28 69 6e  = (out<<1) | (in
1610: 26 31 29 3b 0a 20 20 20 20 69 6e 20 3e 3e 3d 20  &1);.    in >>= 
1620: 31 3b 0a 20 20 20 20 6c 69 6d 69 74 20 3e 3e 3d  1;.    limit >>=
1630: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
1640: 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 20 52 6f 75 6e   out;.}../* Roun
1650: 64 20 75 70 20 61 20 6e 75 6d 62 65 72 20 73 6f  d up a number so
1660: 20 74 68 61 74 20 69 74 20 69 73 20 61 20 70 6f   that it is a po
1670: 77 65 72 20 6f 66 20 74 77 6f 20 6d 69 6e 75 73  wer of two minus
1680: 20 6f 6e 65 0a 2a 2f 0a 75 6e 73 69 67 6e 65 64   one.*/.unsigned
1690: 20 72 6f 75 6e 64 75 70 5f 61 6c 6c 6f 6e 65 73   roundup_allones
16a0: 28 75 6e 73 69 67 6e 65 64 20 6c 69 6d 69 74 29  (unsigned limit)
16b0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 20 3d  {.  unsigned m =
16c0: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6d 3c 6c   1;.  while( m<l
16d0: 69 6d 69 74 20 29 20 6d 20 3d 20 28 6d 3c 3c 31  imit ) m = (m<<1
16e0: 29 2b 31 3b 0a 20 20 72 65 74 75 72 6e 20 6d 3b  )+1;.  return m;
16f0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 73 70 65 65 64  .}../* The speed
1700: 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65  test1_numbername
1710: 20 70 72 6f 63 65 64 75 72 65 20 62 65 6c 6f 77   procedure below
1720: 20 63 6f 6e 76 65 72 74 73 20 69 74 73 20 61 72   converts its ar
1730: 67 6d 65 6e 74 20 28 61 6e 20 69 6e 74 65 67 65  gment (an intege
1740: 72 29 0a 2a 2a 20 69 6e 74 6f 20 61 20 73 74 72  r).** into a str
1750: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
1760: 20 45 6e 67 6c 69 73 68 2d 6c 61 6e 67 75 61 67   English-languag
1770: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 61 74 20  e name for that 
1780: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 54 68 65 20 72  number..** The r
1790: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 73  eturned string s
17a0: 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 77  hould be freed w
17b0: 69 74 68 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ith sqlite3_free
17c0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  ()..**.** Exampl
17d0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 70 65  e:.**.**     spe
17e0: 65 64 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61  edtest1_numberna
17f0: 6d 65 28 31 32 33 29 20 20 20 2d 3e 20 20 22 6f  me(123)   ->  "o
1800: 6e 65 20 68 75 6e 64 72 65 64 20 74 77 65 6e 74  ne hundred twent
1810: 79 20 74 68 72 65 65 22 0a 2a 2f 0a 69 6e 74 20  y three".*/.int 
1820: 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d 62 65  speedtest1_numbe
1830: 72 6e 61 6d 65 28 75 6e 73 69 67 6e 65 64 20 69  rname(unsigned i
1840: 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 4f 75 74  nt n, char *zOut
1850: 2c 20 69 6e 74 20 6e 4f 75 74 29 7b 0a 20 20 73  , int nOut){.  s
1860: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1870: 20 2a 6f 6e 65 73 5b 5d 20 3d 20 7b 20 20 22 7a   *ones[] = {  "z
1880: 65 72 6f 22 2c 20 22 6f 6e 65 22 2c 20 22 74 77  ero", "one", "tw
1890: 6f 22 2c 20 22 74 68 72 65 65 22 2c 20 22 66 6f  o", "three", "fo
18a0: 75 72 22 2c 20 22 66 69 76 65 22 2c 20 0a 20 20  ur", "five", .  
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 22 73 69 78 22 2c 20 22 73 65 76 65 6e 22 2c 20  "six", "seven", 
18d0: 22 65 69 67 68 74 22 2c 20 22 6e 69 6e 65 22 2c  "eight", "nine",
18e0: 20 22 74 65 6e 22 2c 20 22 65 6c 65 76 65 6e 22   "ten", "eleven"
18f0: 2c 20 22 74 77 65 6c 76 65 22 2c 20 0a 20 20 20  , "twelve", .   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1910: 74 68 69 72 74 65 65 6e 22 2c 20 22 66 6f 75 72  thirteen", "four
1920: 74 65 65 6e 22 2c 20 22 66 69 66 74 65 65 6e 22  teen", "fifteen"
1930: 2c 20 22 73 69 78 74 65 65 6e 22 2c 20 22 73 65  , "sixteen", "se
1940: 76 65 6e 74 65 65 6e 22 2c 0a 20 20 20 20 20 20  venteen",.      
1950: 20 20 20 20 20 20 20 20 20 20 20 20 22 65 69 67              "eig
1960: 68 74 65 65 6e 22 2c 20 22 6e 69 6e 65 74 65 65  hteen", "ninetee
1970: 6e 22 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  n" };.  static c
1980: 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 6e 73 5b  onst char *tens[
1990: 5d 20 3d 20 7b 20 22 22 2c 20 22 74 65 6e 22 2c  ] = { "", "ten",
19a0: 20 22 74 77 65 6e 74 79 22 2c 20 22 74 68 69 72   "twenty", "thir
19b0: 74 79 22 2c 20 22 66 6f 72 74 79 22 2c 0a 20 20  ty", "forty",.  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19d0: 66 69 66 74 79 22 2c 20 22 73 69 78 74 79 22 2c  fifty", "sixty",
19e0: 20 22 73 65 76 65 6e 74 79 22 2c 20 22 65 69 67   "seventy", "eig
19f0: 68 74 79 22 2c 20 22 6e 69 6e 65 74 79 22 20 7d  hty", "ninety" }
1a00: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 0a  ;.  int i = 0;..
1a10: 20 20 69 66 28 20 6e 3e 3d 31 30 30 30 30 30 30    if( n>=1000000
1a20: 30 30 30 20 29 7b 0a 20 20 20 20 69 20 2b 3d 20  000 ){.    i += 
1a30: 73 70 65 65 64 74 65 73 74 31 5f 6e 75 6d 62 65  speedtest1_numbe
1a40: 72 6e 61 6d 65 28 6e 2f 31 30 30 30 30 30 30 30  rname(n/10000000
1a50: 30 30 2c 20 7a 4f 75 74 2b 69 2c 20 6e 4f 75 74  00, zOut+i, nOut
1a60: 2d 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -i);.    sqlite3
1a70: 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69  _snprintf(nOut-i
1a80: 2c 20 7a 4f 75 74 2b 69 2c 20 22 20 62 69 6c 6c  , zOut+i, " bill
1a90: 69 6f 6e 22 29 3b 0a 20 20 20 20 69 20 2b 3d 20  ion");.    i += 
1aa0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
1ab0: 2b 69 29 3b 0a 20 20 20 20 6e 20 3d 20 6e 20 25  +i);.    n = n %
1ac0: 20 31 30 30 30 30 30 30 30 30 30 3b 0a 20 20 7d   1000000000;.  }
1ad0: 0a 20 20 69 66 28 20 6e 3e 3d 31 30 30 30 30 30  .  if( n>=100000
1ae0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 20 26  0 ){.    if( i &
1af0: 26 20 69 3c 6e 4f 75 74 2d 31 20 29 20 7a 4f 75  & i<nOut-1 ) zOu
1b00: 74 5b 69 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  t[i++] = ' ';.  
1b10: 20 20 69 20 2b 3d 20 73 70 65 65 64 74 65 73 74    i += speedtest
1b20: 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 6e 2f 31  1_numbername(n/1
1b30: 30 30 30 30 30 30 2c 20 7a 4f 75 74 2b 69 2c 20  000000, zOut+i, 
1b40: 6e 4f 75 74 2d 69 29 3b 0a 20 20 20 20 73 71 6c  nOut-i);.    sql
1b50: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
1b60: 75 74 2d 69 2c 20 7a 4f 75 74 2b 69 2c 20 22 20  ut-i, zOut+i, " 
1b70: 6d 69 6c 6c 69 6f 6e 22 29 3b 0a 20 20 20 20 69  million");.    i
1b80: 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28   += (int)strlen(
1b90: 7a 4f 75 74 2b 69 29 3b 0a 20 20 20 20 6e 20 3d  zOut+i);.    n =
1ba0: 20 6e 20 25 20 31 30 30 30 30 30 30 3b 0a 20 20   n % 1000000;.  
1bb0: 7d 0a 20 20 69 66 28 20 6e 3e 3d 31 30 30 30 20  }.  if( n>=1000 
1bc0: 29 7b 0a 20 20 20 20 69 66 28 20 69 20 26 26 20  ){.    if( i && 
1bd0: 69 3c 6e 4f 75 74 2d 31 20 29 20 7a 4f 75 74 5b  i<nOut-1 ) zOut[
1be0: 69 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  i++] = ' ';.    
1bf0: 69 20 2b 3d 20 73 70 65 65 64 74 65 73 74 31 5f  i += speedtest1_
1c00: 6e 75 6d 62 65 72 6e 61 6d 65 28 6e 2f 31 30 30  numbername(n/100
1c10: 30 2c 20 7a 4f 75 74 2b 69 2c 20 6e 4f 75 74 2d  0, zOut+i, nOut-
1c20: 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  i);.    sqlite3_
1c30: 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 2c  snprintf(nOut-i,
1c40: 20 7a 4f 75 74 2b 69 2c 20 22 20 74 68 6f 75 73   zOut+i, " thous
1c50: 61 6e 64 22 29 3b 0a 20 20 20 20 69 20 2b 3d 20  and");.    i += 
1c60: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74  (int)strlen(zOut
1c70: 2b 69 29 3b 0a 20 20 20 20 6e 20 3d 20 6e 20 25  +i);.    n = n %
1c80: 20 31 30 30 30 3b 0a 20 20 7d 0a 20 20 69 66 28   1000;.  }.  if(
1c90: 20 6e 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 69   n>=100 ){.    i
1ca0: 66 28 20 69 20 26 26 20 69 3c 6e 4f 75 74 2d 31  f( i && i<nOut-1
1cb0: 20 29 20 7a 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27   ) zOut[i++] = '
1cc0: 20 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ';.    sqlite3_
1cd0: 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69 2c  snprintf(nOut-i,
1ce0: 20 7a 4f 75 74 2b 69 2c 20 22 25 73 20 68 75 6e   zOut+i, "%s hun
1cf0: 64 72 65 64 22 2c 20 6f 6e 65 73 5b 6e 2f 31 30  dred", ones[n/10
1d00: 30 5d 29 3b 0a 20 20 20 20 69 20 2b 3d 20 28 69  0]);.    i += (i
1d10: 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 2b 69  nt)strlen(zOut+i
1d20: 29 3b 0a 20 20 20 20 6e 20 3d 20 6e 20 25 20 31  );.    n = n % 1
1d30: 30 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  00;.  }.  if( n>
1d40: 3d 32 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  =20 ){.    if( i
1d50: 20 26 26 20 69 3c 6e 4f 75 74 2d 31 20 29 20 7a   && i<nOut-1 ) z
1d60: 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 20 27 3b 0a  Out[i++] = ' ';.
1d70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1d80: 69 6e 74 66 28 6e 4f 75 74 2d 69 2c 20 7a 4f 75  intf(nOut-i, zOu
1d90: 74 2b 69 2c 20 22 25 73 22 2c 20 74 65 6e 73 5b  t+i, "%s", tens[
1da0: 6e 2f 31 30 5d 29 3b 0a 20 20 20 20 69 20 2b 3d  n/10]);.    i +=
1db0: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75   (int)strlen(zOu
1dc0: 74 2b 69 29 3b 0a 20 20 20 20 6e 20 3d 20 6e 20  t+i);.    n = n 
1dd0: 25 20 31 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  % 10;.  }.  if( 
1de0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  n>0 ){.    if( i
1df0: 20 26 26 20 69 3c 6e 4f 75 74 2d 31 20 29 20 7a   && i<nOut-1 ) z
1e00: 4f 75 74 5b 69 2b 2b 5d 20 3d 20 27 20 27 3b 0a  Out[i++] = ' ';.
1e10: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1e20: 69 6e 74 66 28 6e 4f 75 74 2d 69 2c 20 7a 4f 75  intf(nOut-i, zOu
1e30: 74 2b 69 2c 20 22 25 73 22 2c 20 6f 6e 65 73 5b  t+i, "%s", ones[
1e40: 6e 5d 29 3b 0a 20 20 20 20 69 20 2b 3d 20 28 69  n]);.    i += (i
1e50: 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 2b 69  nt)strlen(zOut+i
1e60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d  );.  }.  if( i==
1e70: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1e80: 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 69  _snprintf(nOut-i
1e90: 2c 20 7a 4f 75 74 2b 69 2c 20 22 7a 65 72 6f 22  , zOut+i, "zero"
1ea0: 29 3b 0a 20 20 20 20 69 20 2b 3d 20 28 69 6e 74  );.    i += (int
1eb0: 29 73 74 72 6c 65 6e 28 7a 4f 75 74 2b 69 29 3b  )strlen(zOut+i);
1ec0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
1ed0: 0a 7d 0a 0a 0a 2f 2a 20 53 74 61 72 74 20 61 20  .}.../* Start a 
1ee0: 6e 65 77 20 74 65 73 74 20 63 61 73 65 20 2a 2f  new test case */
1ef0: 0a 23 64 65 66 69 6e 65 20 4e 41 4d 45 57 49 44  .#define NAMEWID
1f00: 54 48 20 36 30 0a 73 74 61 74 69 63 20 63 6f 6e  TH 60.static con
1f10: 73 74 20 63 68 61 72 20 7a 44 6f 74 73 5b 5d 20  st char zDots[] 
1f20: 3d 0a 20 20 22 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  =.  "...........
1f30: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1f40: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1f50: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1f60: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 3b 0a 76  ............";.v
1f70: 6f 69 64 20 73 70 65 65 64 74 65 73 74 31 5f 62  oid speedtest1_b
1f80: 65 67 69 6e 5f 74 65 73 74 28 69 6e 74 20 69 54  egin_test(int iT
1f90: 65 73 74 4e 75 6d 2c 20 63 6f 6e 73 74 20 63 68  estNum, const ch
1fa0: 61 72 20 2a 7a 54 65 73 74 4e 61 6d 65 2c 20 2e  ar *zTestName, .
1fb0: 2e 2e 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28  ..){.  int n = (
1fc0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 73 74  int)strlen(zTest
1fd0: 4e 61 6d 65 29 3b 0a 20 20 63 68 61 72 20 2a 7a  Name);.  char *z
1fe0: 4e 61 6d 65 3b 0a 20 20 76 61 5f 6c 69 73 74 20  Name;.  va_list 
1ff0: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
2000: 70 2c 20 7a 54 65 73 74 4e 61 6d 65 29 3b 0a 20  p, zTestName);. 
2010: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
2020: 5f 76 6d 70 72 69 6e 74 66 28 7a 54 65 73 74 4e  _vmprintf(zTestN
2030: 61 6d 65 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  ame, ap);.  va_e
2040: 6e 64 28 61 70 29 3b 0a 20 20 6e 20 3d 20 28 69  nd(ap);.  n = (i
2050: 6e 74 29 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  nt)strlen(zName)
2060: 3b 0a 20 20 69 66 28 20 6e 3e 4e 41 4d 45 57 49  ;.  if( n>NAMEWI
2070: 44 54 48 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  DTH ){.    zName
2080: 5b 4e 41 4d 45 57 49 44 54 48 5d 20 3d 20 30 3b  [NAMEWIDTH] = 0;
2090: 0a 20 20 20 20 6e 20 3d 20 4e 41 4d 45 57 49 44  .    n = NAMEWID
20a0: 54 48 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e  TH;.  }.  if( g.
20b0: 62 53 71 6c 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  bSqlOnly ){.    
20c0: 70 72 69 6e 74 66 28 22 2f 2a 20 25 34 64 20 2d  printf("/* %4d -
20d0: 20 25 73 25 2e 2a 73 20 2a 2f 5c 6e 22 2c 20 69   %s%.*s */\n", i
20e0: 54 65 73 74 4e 75 6d 2c 20 7a 4e 61 6d 65 2c 20  TestNum, zName, 
20f0: 4e 41 4d 45 57 49 44 54 48 2d 6e 2c 20 7a 44 6f  NAMEWIDTH-n, zDo
2100: 74 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ts);.  }else{.  
2110: 20 20 70 72 69 6e 74 66 28 22 25 34 64 20 2d 20    printf("%4d - 
2120: 25 73 25 2e 2a 73 20 22 2c 20 69 54 65 73 74 4e  %s%.*s ", iTestN
2130: 75 6d 2c 20 7a 4e 61 6d 65 2c 20 4e 41 4d 45 57  um, zName, NAMEW
2140: 49 44 54 48 2d 6e 2c 20 7a 44 6f 74 73 29 3b 0a  IDTH-n, zDots);.
2150: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
2160: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
2170: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  3_free(zName);. 
2180: 20 67 2e 6e 52 65 73 75 6c 74 20 3d 20 30 3b 0a   g.nResult = 0;.
2190: 20 20 67 2e 69 53 74 61 72 74 20 3d 20 73 70 65    g.iStart = spe
21a0: 65 64 74 65 73 74 31 5f 74 69 6d 65 73 74 61 6d  edtest1_timestam
21b0: 70 28 29 3b 0a 20 20 67 2e 78 20 3d 20 30 78 61  p();.  g.x = 0xa
21c0: 64 31 33 31 64 30 62 3b 0a 20 20 67 2e 79 20 3d  d131d0b;.  g.y =
21d0: 20 30 78 34 34 66 39 65 61 63 38 3b 0a 7d 0a 0a   0x44f9eac8;.}..
21e0: 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 61 20 74 65  /* Complete a te
21f0: 73 74 20 63 61 73 65 20 2a 2f 0a 76 6f 69 64 20  st case */.void 
2200: 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74  speedtest1_end_t
2210: 65 73 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  est(void){.  sql
2220: 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6c 61 70  ite3_int64 iElap
2230: 73 65 54 69 6d 65 20 3d 20 73 70 65 65 64 74 65  seTime = speedte
2240: 73 74 31 5f 74 69 6d 65 73 74 61 6d 70 28 29 20  st1_timestamp() 
2250: 2d 20 67 2e 69 53 74 61 72 74 3b 0a 20 20 69 66  - g.iStart;.  if
2260: 28 20 21 67 2e 62 53 71 6c 4f 6e 6c 79 20 29 7b  ( !g.bSqlOnly ){
2270: 0a 20 20 20 20 67 2e 69 54 6f 74 61 6c 20 2b 3d  .    g.iTotal +=
2280: 20 69 45 6c 61 70 73 65 54 69 6d 65 3b 0a 20 20   iElapseTime;.  
2290: 20 20 70 72 69 6e 74 66 28 22 25 34 64 2e 25 30    printf("%4d.%0
22a0: 33 64 73 5c 6e 22 2c 20 28 69 6e 74 29 28 69 45  3ds\n", (int)(iE
22b0: 6c 61 70 73 65 54 69 6d 65 2f 31 30 30 30 29 2c  lapseTime/1000),
22c0: 20 28 69 6e 74 29 28 69 45 6c 61 70 73 65 54 69   (int)(iElapseTi
22d0: 6d 65 25 31 30 30 30 29 29 3b 0a 20 20 7d 0a 20  me%1000));.  }. 
22e0: 20 69 66 28 20 67 2e 70 53 74 6d 74 20 29 7b 0a   if( g.pStmt ){.
22f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2300: 6c 69 7a 65 28 67 2e 70 53 74 6d 74 29 3b 0a 20  lize(g.pStmt);. 
2310: 20 20 20 67 2e 70 53 74 6d 74 20 3d 20 30 3b 0a     g.pStmt = 0;.
2320: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 70 6f 72 74    }.}../* Report
2330: 20 65 6e 64 20 6f 66 20 74 65 73 74 69 6e 67 20   end of testing 
2340: 2a 2f 0a 76 6f 69 64 20 73 70 65 65 64 74 65 73  */.void speedtes
2350: 74 31 5f 66 69 6e 61 6c 28 76 6f 69 64 29 7b 0a  t1_final(void){.
2360: 20 20 69 66 28 20 21 67 2e 62 53 71 6c 4f 6e 6c    if( !g.bSqlOnl
2370: 79 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  y ){.    printf(
2380: 22 20 20 20 20 20 20 20 54 4f 54 41 4c 25 2e 2a  "       TOTAL%.*
2390: 73 20 25 34 64 2e 25 30 33 64 73 5c 6e 22 2c 20  s %4d.%03ds\n", 
23a0: 4e 41 4d 45 57 49 44 54 48 2d 35 2c 20 7a 44 6f  NAMEWIDTH-5, zDo
23b0: 74 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  ts,.           (
23c0: 69 6e 74 29 28 67 2e 69 54 6f 74 61 6c 2f 31 30  int)(g.iTotal/10
23d0: 30 30 29 2c 20 28 69 6e 74 29 28 67 2e 69 54 6f  00), (int)(g.iTo
23e0: 74 61 6c 25 31 30 30 30 29 29 3b 0a 20 20 7d 0a  tal%1000));.  }.
23f0: 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 53  }../* Print an S
2400: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
2410: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20  standard output 
2420: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
2430: 72 69 6e 74 53 71 6c 28 63 6f 6e 73 74 20 63 68  rintSql(const ch
2440: 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74  ar *zSql){.  int
2450: 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
2460: 28 7a 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28  (zSql);.  while(
2470: 20 6e 3e 30 20 26 26 20 28 7a 53 71 6c 5b 6e 2d   n>0 && (zSql[n-
2480: 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61  1]==';' || isspa
2490: 63 65 28 7a 53 71 6c 5b 6e 2d 31 5d 29 29 20 29  ce(zSql[n-1])) )
24a0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 69 66 28 20 67  { n--; }.  if( g
24b0: 2e 62 45 78 70 6c 61 69 6e 20 29 20 70 72 69 6e  .bExplain ) prin
24c0: 74 66 28 22 45 58 50 4c 41 49 4e 20 22 29 3b 0a  tf("EXPLAIN ");.
24d0: 20 20 70 72 69 6e 74 66 28 22 25 2e 2a 73 3b 5c    printf("%.*s;\
24e0: 6e 22 2c 20 6e 2c 20 7a 53 71 6c 29 3b 0a 20 20  n", n, zSql);.  
24f0: 69 66 28 20 67 2e 62 45 78 70 6c 61 69 6e 0a 23  if( g.bExplain.#
2500: 69 66 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f  if SQLITE_VERSIO
2510: 4e 5f 4e 55 4d 42 45 52 3e 3d 33 30 30 37 30 31  N_NUMBER>=300701
2520: 30 20 0a 20 20 20 26 26 20 28 20 73 71 6c 69 74  0 .   && ( sqlit
2530: 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45 41  e3_strglob("CREA
2540: 54 45 20 2a 22 2c 20 7a 53 71 6c 29 3d 3d 30 0a  TE *", zSql)==0.
2550: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
2560: 73 74 72 67 6c 6f 62 28 22 44 52 4f 50 20 2a 22  strglob("DROP *"
2570: 2c 20 7a 53 71 6c 29 3d 3d 30 0a 20 20 20 20 20  , zSql)==0.     
2580: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  || sqlite3_strgl
2590: 6f 62 28 22 41 4c 54 45 52 20 2a 22 2c 20 7a 53  ob("ALTER *", zS
25a0: 71 6c 29 3d 3d 30 0a 20 20 20 20 20 20 29 0a 23  ql)==0.      ).#
25b0: 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 70  endif.  ){.    p
25c0: 72 69 6e 74 66 28 22 25 2e 2a 73 3b 5c 6e 22 2c  rintf("%.*s;\n",
25d0: 20 6e 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 7d   n, zSql);.  }.}
25e0: 0a 0a 2f 2a 20 52 75 6e 20 53 51 4c 20 2a 2f 0a  ../* Run SQL */.
25f0: 76 6f 69 64 20 73 70 65 65 64 74 65 73 74 31 5f  void speedtest1_
2600: 65 78 65 63 28 63 6f 6e 73 74 20 63 68 61 72 20  exec(const char 
2610: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
2620: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2630: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61  char *zSql;.  va
2640: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
2650: 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  at);.  zSql = sq
2660: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
2670: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2680: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28  a_end(ap);.  if(
2690: 20 67 2e 62 53 71 6c 4f 6e 6c 79 20 29 7b 0a 20   g.bSqlOnly ){. 
26a0: 20 20 20 70 72 69 6e 74 53 71 6c 28 7a 53 71 6c     printSql(zSql
26b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
26c0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
26d0: 30 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  0;.    int rc = 
26e0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64  sqlite3_exec(g.d
26f0: 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  b, zSql, 0, 0, &
2700: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
2710: 28 20 7a 45 72 72 4d 73 67 20 29 20 66 61 74 61  ( zErrMsg ) fata
2720: 6c 5f 65 72 72 6f 72 28 22 53 51 4c 20 65 72 72  l_error("SQL err
2730: 6f 72 3a 20 25 73 5c 6e 25 73 5c 6e 22 2c 20 7a  or: %s\n%s\n", z
2740: 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20  ErrMsg, zSql);. 
2750: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2760: 45 5f 4f 4b 20 29 20 66 61 74 61 6c 5f 65 72 72  E_OK ) fatal_err
2770: 6f 72 28 22 65 78 65 63 20 65 72 72 6f 72 3a 20  or("exec error: 
2780: 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
2790: 72 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a 20 20  rrmsg(g.db));.  
27a0: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
27b0: 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 72  (zSql);.}../* Pr
27c0: 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61  epare an SQL sta
27d0: 74 65 6d 65 6e 74 20 2a 2f 0a 76 6f 69 64 20 73  tement */.void s
27e0: 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72  peedtest1_prepar
27f0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
2800: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
2810: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2820: 72 20 2a 7a 53 71 6c 3b 0a 20 20 76 61 5f 73 74  r *zSql;.  va_st
2830: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
2840: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
2850: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
2860: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
2870: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 67 2e  nd(ap);.  if( g.
2880: 62 53 71 6c 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  bSqlOnly ){.    
2890: 70 72 69 6e 74 53 71 6c 28 7a 53 71 6c 29 3b 0a  printSql(zSql);.
28a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
28b0: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 67 2e 70   rc;.    if( g.p
28c0: 53 74 6d 74 20 29 20 73 71 6c 69 74 65 33 5f 66  Stmt ) sqlite3_f
28d0: 69 6e 61 6c 69 7a 65 28 67 2e 70 53 74 6d 74 29  inalize(g.pStmt)
28e0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
28f0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 2e  e3_prepare_v2(g.
2900: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 67  db, zSql, -1, &g
2910: 2e 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  .pStmt, 0);.    
2920: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2930: 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 53 51 4c  fatal_error("SQL
2940: 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73   error: %s\n", s
2950: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e  qlite3_errmsg(g.
2960: 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  db));.    }.  }.
2970: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2980: 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 52 75 6e 20  Sql);.}../* Run 
2990: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
29a0: 20 70 72 65 76 69 6f 75 73 6c 79 20 70 72 65 70   previously prep
29b0: 61 72 65 64 20 2a 2f 0a 76 6f 69 64 20 73 70 65  ared */.void spe
29c0: 65 64 74 65 73 74 31 5f 72 75 6e 28 76 6f 69 64  edtest1_run(void
29d0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 2c 20 6c  ){.  int i, n, l
29e0: 65 6e 3b 0a 20 20 69 66 28 20 67 2e 62 53 71 6c  en;.  if( g.bSql
29f0: 4f 6e 6c 79 20 29 20 72 65 74 75 72 6e 3b 0a 20  Only ) return;. 
2a00: 20 61 73 73 65 72 74 28 20 67 2e 70 53 74 6d 74   assert( g.pStmt
2a10: 20 29 3b 0a 20 20 67 2e 6e 52 65 73 75 6c 74 20   );.  g.nResult 
2a20: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71  = 0;.  while( sq
2a30: 6c 69 74 65 33 5f 73 74 65 70 28 67 2e 70 53 74  lite3_step(g.pSt
2a40: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
2a50: 29 7b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74  ){.    n = sqlit
2a60: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
2a70: 67 2e 70 53 74 6d 74 29 3b 0a 20 20 20 20 66 6f  g.pStmt);.    fo
2a80: 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
2a90: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
2aa0: 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ar *z = (const c
2ab0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2ac0: 75 6d 6e 5f 74 65 78 74 28 67 2e 70 53 74 6d 74  umn_text(g.pStmt
2ad0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
2ae0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 6e 69 6c 22  z==0 ) z = "nil"
2af0: 3b 0a 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 69  ;.      len = (i
2b00: 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20  nt)strlen(z);.  
2b10: 20 20 20 20 69 66 28 20 67 2e 6e 52 65 73 75 6c      if( g.nResul
2b20: 74 2b 6c 65 6e 3c 73 69 7a 65 6f 66 28 67 2e 7a  t+len<sizeof(g.z
2b30: 52 65 73 75 6c 74 29 2d 32 20 29 7b 0a 20 20 20  Result)-2 ){.   
2b40: 20 20 20 20 20 69 66 28 20 67 2e 6e 52 65 73 75       if( g.nResu
2b50: 6c 74 3e 30 20 29 20 67 2e 7a 52 65 73 75 6c 74  lt>0 ) g.zResult
2b60: 5b 67 2e 6e 52 65 73 75 6c 74 2b 2b 5d 20 3d 20  [g.nResult++] = 
2b70: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ' ';.        mem
2b80: 63 70 79 28 67 2e 7a 52 65 73 75 6c 74 20 2b 20  cpy(g.zResult + 
2b90: 67 2e 6e 52 65 73 75 6c 74 2c 20 7a 2c 20 6c 65  g.nResult, z, le
2ba0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 67 2e  n+1);.        g.
2bb0: 6e 52 65 73 75 6c 74 20 2b 3d 20 6c 65 6e 3b 0a  nResult += len;.
2bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bd0: 7d 0a 20 20 69 66 28 20 67 2e 62 52 65 70 72 65  }.  if( g.bRepre
2be0: 70 61 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  pare ){.    sqli
2bf0: 74 65 33 5f 73 74 6d 74 20 2a 70 4e 65 77 3b 0a  te3_stmt *pNew;.
2c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
2c10: 61 72 65 5f 76 32 28 67 2e 64 62 2c 20 73 71 6c  are_v2(g.db, sql
2c20: 69 74 65 33 5f 73 71 6c 28 67 2e 70 53 74 6d 74  ite3_sql(g.pStmt
2c30: 29 2c 20 2d 31 2c 20 26 70 4e 65 77 2c 20 30 29  ), -1, &pNew, 0)
2c40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
2c50: 6e 61 6c 69 7a 65 28 67 2e 70 53 74 6d 74 29 3b  nalize(g.pStmt);
2c60: 0a 20 20 20 20 67 2e 70 53 74 6d 74 20 3d 20 70  .    g.pStmt = p
2c70: 4e 65 77 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  New;.  }else{.  
2c80: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
2c90: 67 2e 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 7d 0a  g.pStmt);.  }.}.
2ca0: 0a 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f  ./* The sqlite3_
2cb0: 74 72 61 63 65 28 29 20 63 61 6c 6c 62 61 63 6b  trace() callback
2cc0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 73 74 61   function */.sta
2cd0: 74 69 63 20 76 6f 69 64 20 74 72 61 63 65 43 61  tic void traceCa
2ce0: 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 4e 6f 74  llback(void *Not
2cf0: 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
2d00: 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 6e   *zSql){.  int n
2d10: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
2d20: 53 71 6c 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  Sql);.  while( n
2d30: 3e 30 20 26 26 20 28 7a 53 71 6c 5b 6e 2d 31 5d  >0 && (zSql[n-1]
2d40: 3d 3d 27 3b 27 20 7c 7c 20 69 73 73 70 61 63 65  ==';' || isspace
2d50: 28 7a 53 71 6c 5b 6e 2d 31 5d 29 29 20 29 20 6e  (zSql[n-1])) ) n
2d60: 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  --;.  fprintf(st
2d70: 64 65 72 72 2c 22 25 2e 2a 73 3b 5c 6e 22 2c 20  derr,"%.*s;\n", 
2d80: 6e 2c 20 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20  n, zSql);.}../* 
2d90: 53 75 62 73 74 69 74 75 74 65 20 72 61 6e 64 6f  Substitute rando
2da0: 6d 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  m() function tha
2db0: 74 20 67 69 76 65 73 20 74 68 65 20 73 61 6d 65  t gives the same
2dc0: 20 72 61 6e 64 6f 6d 0a 2a 2a 20 73 65 71 75 65   random.** seque
2dd0: 6e 63 65 20 6f 6e 20 65 61 63 68 20 72 75 6e 2c  nce on each run,
2de0: 20 66 6f 72 20 72 65 70 65 61 74 61 62 69 6c 69   for repeatabili
2df0: 74 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ty. */.static vo
2e00: 69 64 20 72 61 6e 64 6f 6d 46 75 6e 63 28 0a 20  id randomFunc(. 
2e10: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2e20: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
2e30: 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69   NotUsed,.  sqli
2e40: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 4e 6f 74 55  te3_value **NotU
2e50: 73 65 64 32 0a 29 7b 0a 20 20 73 71 6c 69 74 65  sed2.){.  sqlite
2e60: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
2e70: 6f 6e 74 65 78 74 2c 20 28 73 71 6c 69 74 65 33  ontext, (sqlite3
2e80: 5f 69 6e 74 36 34 29 73 70 65 65 64 74 65 73 74  _int64)speedtest
2e90: 31 5f 72 61 6e 64 6f 6d 28 29 29 3b 0a 7d 0a 0a  1_random());.}..
2ea0: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
2eb0: 73 71 75 61 72 65 20 72 6f 6f 74 20 6f 66 20 61  square root of a
2ec0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 73 74 61  n integer */.sta
2ed0: 74 69 63 20 69 6e 74 20 65 73 74 5f 73 71 75 61  tic int est_squa
2ee0: 72 65 5f 72 6f 6f 74 28 69 6e 74 20 78 29 7b 0a  re_root(int x){.
2ef0: 20 20 69 6e 74 20 79 30 20 3d 20 78 2f 32 3b 0a    int y0 = x/2;.
2f00: 20 20 69 6e 74 20 79 31 3b 0a 20 20 69 6e 74 20    int y1;.  int 
2f10: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 79 30  n;.  for(n=0; y0
2f20: 3e 30 20 26 26 20 6e 3c 31 30 3b 20 6e 2b 2b 29  >0 && n<10; n++)
2f30: 7b 0a 20 20 20 20 79 31 20 3d 20 28 79 30 20 2b  {.    y1 = (y0 +
2f40: 20 78 2f 79 30 29 2f 32 3b 0a 20 20 20 20 69 66   x/y0)/2;.    if
2f50: 28 20 79 31 3d 3d 79 30 20 29 20 62 72 65 61 6b  ( y1==y0 ) break
2f60: 3b 0a 20 20 20 20 79 30 20 3d 20 79 31 3b 0a 20  ;.    y0 = y1;. 
2f70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 79 30 3b 0a   }.  return y0;.
2f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  }../*.** The mai
2f90: 6e 20 61 6e 64 20 64 65 66 61 75 6c 74 20 74 65  n and default te
2fa0: 73 74 73 65 74 0a 2a 2f 0a 76 6f 69 64 20 74 65  stset.*/.void te
2fb0: 73 74 73 65 74 5f 6d 61 69 6e 28 76 6f 69 64 29  stset_main(void)
2fc0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2ff0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  r */.  int n;   
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 2f 2a 20 69 74 65 72 61 74 69 6f       /* iteratio
3020: 6e 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 69 6e 74  n count */.  int
3030: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   sz;            
3040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3050: 7a 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ze of the tables
3060: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 62 3b 20   */.  int maxb; 
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 73      /* Maximum s
3090: 77 69 7a 7a 6c 65 64 20 76 61 6c 75 65 20 2a 2f  wizzled value */
30a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 78 31 2c 20  .  unsigned x1, 
30b0: 78 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x2;             
30c0: 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 73 20 2a   /* Parameters *
30d0: 2f 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 20 20 20  /.  int len;    
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
3100: 68 65 20 7a 4e 75 6d 5b 5d 20 73 74 72 69 6e 67  he zNum[] string
3110: 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4e 75 6d 5b   */.  char zNum[
3120: 32 30 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  2000];          
3130: 20 20 20 20 2f 2a 20 41 20 6e 75 6d 62 65 72 20      /* A number 
3140: 6e 61 6d 65 20 2a 2f 0a 0a 20 20 73 7a 20 3d 20  name */..  sz = 
3150: 6e 20 3d 20 67 2e 73 7a 54 65 73 74 2a 35 30 30  n = g.szTest*500
3160: 3b 0a 20 20 6d 61 78 62 20 3d 20 72 6f 75 6e 64  ;.  maxb = round
3170: 75 70 5f 61 6c 6c 6f 6e 65 73 28 73 7a 29 3b 0a  up_allones(sz);.
3180: 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67    speedtest1_beg
3190: 69 6e 5f 74 65 73 74 28 31 30 30 2c 20 22 25 64  in_test(100, "%d
31a0: 20 49 4e 53 45 52 54 73 20 69 6e 74 6f 20 74 61   INSERTs into ta
31b0: 62 6c 65 20 77 69 74 68 20 6e 6f 20 69 6e 64 65  ble with no inde
31c0: 78 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74  x", n);.  speedt
31d0: 65 73 74 31 5f 65 78 65 63 28 22 42 45 47 49 4e  est1_exec("BEGIN
31e0: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
31f0: 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 54 41  _exec("CREATE TA
3200: 42 4c 45 20 74 31 28 61 20 49 4e 54 45 47 45 52  BLE t1(a INTEGER
3210: 20 25 73 2c 20 62 20 49 4e 54 45 47 45 52 20 25   %s, b INTEGER %
3220: 73 2c 20 63 20 54 45 58 54 20 25 73 29 3b 22 2c  s, c TEXT %s);",
3230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3240: 20 20 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 4e 4e 2c     g.zNN, g.zNN,
3250: 20 67 2e 7a 4e 4e 29 3b 0a 20 20 73 70 65 65 64   g.zNN);.  speed
3260: 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 22 49  test1_prepare("I
3270: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3280: 4c 55 45 53 28 3f 31 2c 3f 32 2c 3f 33 29 3b 20  LUES(?1,?2,?3); 
3290: 2d 2d 20 20 25 64 20 74 69 6d 65 73 22 2c 20 6e  --  %d times", n
32a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
32b0: 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31  =n; i++){.    x1
32c0: 20 3d 20 73 77 69 7a 7a 6c 65 28 69 2c 6d 61 78   = swizzle(i,max
32d0: 62 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73  b);.    speedtes
32e0: 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 78 31  t1_numbername(x1
32f0: 2c 20 7a 4e 75 6d 2c 20 73 69 7a 65 6f 66 28 7a  , zNum, sizeof(z
3300: 4e 75 6d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  Num));.    sqlit
3310: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 67 2e  e3_bind_int64(g.
3320: 70 53 74 6d 74 2c 20 31 2c 20 28 73 71 6c 69 74  pStmt, 1, (sqlit
3330: 65 33 5f 69 6e 74 36 34 29 78 31 29 3b 0a 20 20  e3_int64)x1);.  
3340: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
3350: 6e 74 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 69  nt(g.pStmt, 2, i
3360: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
3370: 69 6e 64 5f 74 65 78 74 28 67 2e 70 53 74 6d 74  ind_text(g.pStmt
3380: 2c 20 33 2c 20 7a 4e 75 6d 2c 20 2d 31 2c 20 53  , 3, zNum, -1, S
3390: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
33a0: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75     speedtest1_ru
33b0: 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64  n();.  }.  speed
33c0: 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d  test1_exec("COMM
33d0: 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IT");.  speedtes
33e0: 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a  t1_end_test();..
33f0: 0a 20 20 6e 20 3d 20 73 7a 3b 0a 20 20 73 70 65  .  n = sz;.  spe
3400: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
3410: 73 74 28 31 31 30 2c 20 22 25 64 20 6f 72 64 65  st(110, "%d orde
3420: 72 65 64 20 49 4e 53 45 52 54 53 20 77 69 74 68  red INSERTS with
3430: 20 6f 6e 65 20 69 6e 64 65 78 2f 50 4b 22 2c 20   one index/PK", 
3440: 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  n);.  speedtest1
3450: 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a  _exec("BEGIN");.
3460: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
3470: 63 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  c("CREATE TABLE 
3480: 74 32 28 61 20 49 4e 54 45 47 45 52 20 25 73 20  t2(a INTEGER %s 
3490: 25 73 2c 20 62 20 49 4e 54 45 47 45 52 20 25 73  %s, b INTEGER %s
34a0: 2c 20 63 20 54 45 58 54 20 25 73 29 20 25 73 22  , c TEXT %s) %s"
34b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34c0: 20 20 20 20 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 50       g.zNN, g.zP
34d0: 4b 2c 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 4e 4e 2c  K, g.zNN, g.zNN,
34e0: 20 67 2e 7a 57 52 29 3b 0a 20 20 73 70 65 65 64   g.zWR);.  speed
34f0: 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 22 49  test1_prepare("I
3500: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
3510: 4c 55 45 53 28 3f 31 2c 3f 32 2c 3f 33 29 3b 20  LUES(?1,?2,?3); 
3520: 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e 29  -- %d times", n)
3530: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
3540: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20  n; i++){.    x1 
3550: 3d 20 73 77 69 7a 7a 6c 65 28 69 2c 6d 61 78 62  = swizzle(i,maxb
3560: 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74  );.    speedtest
3570: 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 78 31 2c  1_numbername(x1,
3580: 20 7a 4e 75 6d 2c 20 73 69 7a 65 6f 66 28 7a 4e   zNum, sizeof(zN
3590: 75 6d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  um));.    sqlite
35a0: 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74  3_bind_int(g.pSt
35b0: 6d 74 2c 20 31 2c 20 69 29 3b 0a 20 20 20 20 73  mt, 1, i);.    s
35c0: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
35d0: 34 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 28 73  4(g.pStmt, 2, (s
35e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78 31 29  qlite3_int64)x1)
35f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
3600: 6e 64 5f 74 65 78 74 28 67 2e 70 53 74 6d 74 2c  nd_text(g.pStmt,
3610: 20 33 2c 20 7a 4e 75 6d 2c 20 2d 31 2c 20 53 51   3, zNum, -1, SQ
3620: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
3630: 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e    speedtest1_run
3640: 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64 74  ();.  }.  speedt
3650: 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49  est1_exec("COMMI
3660: 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  T");.  speedtest
3670: 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a  1_end_test();...
3680: 20 20 6e 20 3d 20 73 7a 3b 0a 20 20 73 70 65 65    n = sz;.  spee
3690: 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73  dtest1_begin_tes
36a0: 74 28 31 32 30 2c 20 22 25 64 20 75 6e 6f 72 64  t(120, "%d unord
36b0: 65 72 65 64 20 49 4e 53 45 52 54 53 20 77 69 74  ered INSERTS wit
36c0: 68 20 6f 6e 65 20 69 6e 64 65 78 2f 50 4b 22 2c  h one index/PK",
36d0: 20 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74   n);.  speedtest
36e0: 31 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b  1_exec("BEGIN");
36f0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
3700: 65 63 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ec("CREATE TABLE
3710: 20 74 33 28 61 20 49 4e 54 45 47 45 52 20 25 73   t3(a INTEGER %s
3720: 20 25 73 2c 20 62 20 49 4e 54 45 47 45 52 20 25   %s, b INTEGER %
3730: 73 2c 20 63 20 54 45 58 54 20 25 73 29 20 25 73  s, c TEXT %s) %s
3740: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
3750: 20 20 20 20 20 20 67 2e 7a 4e 4e 2c 20 67 2e 7a        g.zNN, g.z
3760: 50 4b 2c 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 4e 4e  PK, g.zNN, g.zNN
3770: 2c 20 67 2e 7a 57 52 29 3b 0a 20 20 73 70 65 65  , g.zWR);.  spee
3780: 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 22  dtest1_prepare("
3790: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
37a0: 41 4c 55 45 53 28 3f 31 2c 3f 32 2c 3f 33 29 3b  ALUES(?1,?2,?3);
37b0: 20 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e   -- %d times", n
37c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  );.  for(i=1; i<
37d0: 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31  =n; i++){.    x1
37e0: 20 3d 20 73 77 69 7a 7a 6c 65 28 69 2c 6d 61 78   = swizzle(i,max
37f0: 62 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73  b);.    speedtes
3800: 74 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 78 31  t1_numbername(x1
3810: 2c 20 7a 4e 75 6d 2c 20 73 69 7a 65 6f 66 28 7a  , zNum, sizeof(z
3820: 4e 75 6d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  Num));.    sqlit
3830: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
3840: 74 6d 74 2c 20 32 2c 20 69 29 3b 0a 20 20 20 20  tmt, 2, i);.    
3850: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
3860: 36 34 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 28  64(g.pStmt, 1, (
3870: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 78 31  sqlite3_int64)x1
3880: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
3890: 69 6e 64 5f 74 65 78 74 28 67 2e 70 53 74 6d 74  ind_text(g.pStmt
38a0: 2c 20 33 2c 20 7a 4e 75 6d 2c 20 2d 31 2c 20 53  , 3, zNum, -1, S
38b0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
38c0: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75     speedtest1_ru
38d0: 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64  n();.  }.  speed
38e0: 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d  test1_exec("COMM
38f0: 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IT");.  speedtes
3900: 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a  t1_end_test();..
3910: 0a 20 20 6e 20 3d 20 32 35 3b 0a 20 20 73 70 65  .  n = 25;.  spe
3920: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
3930: 73 74 28 31 33 30 2c 20 22 25 64 20 53 45 4c 45  st(130, "%d SELE
3940: 43 54 53 2c 20 6e 75 6d 65 72 69 63 20 42 45 54  CTS, numeric BET
3950: 57 45 45 4e 2c 20 75 6e 69 6e 64 65 78 65 64 22  WEEN, unindexed"
3960: 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73  , n);.  speedtes
3970: 74 31 5f 65 78 65 63 28 22 42 45 47 49 4e 22 29  t1_exec("BEGIN")
3980: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 70  ;.  speedtest1_p
3990: 72 65 70 61 72 65 28 0a 20 20 20 20 22 53 45 4c  repare(.    "SEL
39a0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20 61 76  ECT count(*), av
39b0: 67 28 62 29 2c 20 73 75 6d 28 6c 65 6e 67 74 68  g(b), sum(length
39c0: 28 63 29 29 20 46 52 4f 4d 20 74 31 5c 6e 22 0a  (c)) FROM t1\n".
39d0: 20 20 20 20 22 20 57 48 45 52 45 20 62 20 42 45      " WHERE b BE
39e0: 54 57 45 45 4e 20 3f 31 20 41 4e 44 20 3f 32 3b  TWEEN ?1 AND ?2;
39f0: 20 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e   -- %d times", n
3a00: 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  .  );.  for(i=1;
3a10: 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=n; i++){.   
3a20: 20 78 31 20 3d 20 73 70 65 65 64 74 65 73 74 31   x1 = speedtest1
3a30: 5f 72 61 6e 64 6f 6d 28 29 25 6d 61 78 62 3b 0a  _random()%maxb;.
3a40: 20 20 20 20 78 32 20 3d 20 73 70 65 65 64 74 65      x2 = speedte
3a50: 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 31 30 20  st1_random()%10 
3a60: 2b 20 73 7a 2f 35 30 30 30 20 2b 20 78 31 3b 0a  + sz/5000 + x1;.
3a70: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
3a80: 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c  _int(g.pStmt, 1,
3a90: 20 78 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   x1);.    sqlite
3aa0: 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74  3_bind_int(g.pSt
3ab0: 6d 74 2c 20 32 2c 20 78 32 29 3b 0a 20 20 20 20  mt, 2, x2);.    
3ac0: 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29  speedtest1_run()
3ad0: 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73  ;.  }.  speedtes
3ae0: 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22  t1_exec("COMMIT"
3af0: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
3b00: 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20  end_test();...  
3b10: 6e 20 3d 20 31 30 3b 0a 20 20 73 70 65 65 64 74  n = 10;.  speedt
3b20: 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28  est1_begin_test(
3b30: 31 34 30 2c 20 22 25 64 20 53 45 4c 45 43 54 53  140, "%d SELECTS
3b40: 2c 20 4c 49 4b 45 2c 20 75 6e 69 6e 64 65 78 65  , LIKE, unindexe
3b50: 64 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64 74  d", n);.  speedt
3b60: 65 73 74 31 5f 65 78 65 63 28 22 42 45 47 49 4e  est1_exec("BEGIN
3b70: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
3b80: 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20 22 53  _prepare(.    "S
3b90: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  ELECT count(*), 
3ba0: 61 76 67 28 62 29 2c 20 73 75 6d 28 6c 65 6e 67  avg(b), sum(leng
3bb0: 74 68 28 63 29 29 20 46 52 4f 4d 20 74 31 5c 6e  th(c)) FROM t1\n
3bc0: 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 63 20  ".    " WHERE c 
3bd0: 4c 49 4b 45 20 3f 31 3b 20 2d 2d 20 25 64 20 74  LIKE ?1; -- %d t
3be0: 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b 0a 20 20  imes", n.  );.  
3bf0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69  for(i=1; i<=n; i
3c00: 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73 70  ++){.    x1 = sp
3c10: 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28  eedtest1_random(
3c20: 29 25 6d 61 78 62 3b 0a 20 20 20 20 7a 4e 75 6d  )%maxb;.    zNum
3c30: 5b 30 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20 6c  [0] = '%';.    l
3c40: 65 6e 20 3d 20 73 70 65 65 64 74 65 73 74 31 5f  en = speedtest1_
3c50: 6e 75 6d 62 65 72 6e 61 6d 65 28 69 2c 20 7a 4e  numbername(i, zN
3c60: 75 6d 2b 31 2c 20 73 69 7a 65 6f 66 28 7a 4e 75  um+1, sizeof(zNu
3c70: 6d 29 2d 32 29 3b 0a 20 20 20 20 7a 4e 75 6d 5b  m)-2);.    zNum[
3c80: 6c 65 6e 5d 20 3d 20 27 25 27 3b 0a 20 20 20 20  len] = '%';.    
3c90: 7a 4e 75 6d 5b 6c 65 6e 2b 31 5d 20 3d 20 30 3b  zNum[len+1] = 0;
3ca0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
3cb0: 64 5f 74 65 78 74 28 67 2e 70 53 74 6d 74 2c 20  d_text(g.pStmt, 
3cc0: 31 2c 20 7a 4e 75 6d 2c 20 6c 65 6e 2c 20 53 51  1, zNum, len, SQ
3cd0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
3ce0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e    speedtest1_run
3cf0: 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64 74  ();.  }.  speedt
3d00: 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49  est1_exec("COMMI
3d10: 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  T");.  speedtest
3d20: 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a  1_end_test();...
3d30: 20 20 6e 20 3d 20 31 30 3b 0a 20 20 73 70 65 65    n = 10;.  spee
3d40: 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73  dtest1_begin_tes
3d50: 74 28 31 34 32 2c 20 22 25 64 20 53 45 4c 45 43  t(142, "%d SELEC
3d60: 54 53 20 77 2f 4f 52 44 45 52 20 42 59 2c 20 75  TS w/ORDER BY, u
3d70: 6e 69 6e 64 65 78 65 64 22 2c 20 6e 29 3b 0a 20  nindexed", n);. 
3d80: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
3d90: 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65  ("BEGIN");.  spe
3da0: 65 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28  edtest1_prepare(
3db0: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 61 2c 20  .    "SELECT a, 
3dc0: 62 2c 20 63 20 46 52 4f 4d 20 74 31 20 57 48 45  b, c FROM t1 WHE
3dd0: 52 45 20 63 20 4c 49 4b 45 20 3f 31 5c 6e 22 0a  RE c LIKE ?1\n".
3de0: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 61      " ORDER BY a
3df0: 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20  ; -- %d times", 
3e00: 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31  n.  );.  for(i=1
3e10: 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=n; i++){.  
3e20: 20 20 78 31 20 3d 20 73 70 65 65 64 74 65 73 74    x1 = speedtest
3e30: 31 5f 72 61 6e 64 6f 6d 28 29 25 6d 61 78 62 3b  1_random()%maxb;
3e40: 0a 20 20 20 20 7a 4e 75 6d 5b 30 5d 20 3d 20 27  .    zNum[0] = '
3e50: 25 27 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 70  %';.    len = sp
3e60: 65 65 64 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e  eedtest1_numbern
3e70: 61 6d 65 28 69 2c 20 7a 4e 75 6d 2b 31 2c 20 73  ame(i, zNum+1, s
3e80: 69 7a 65 6f 66 28 7a 4e 75 6d 29 2d 32 29 3b 0a  izeof(zNum)-2);.
3e90: 20 20 20 20 7a 4e 75 6d 5b 6c 65 6e 5d 20 3d 20      zNum[len] = 
3ea0: 27 25 27 3b 0a 20 20 20 20 7a 4e 75 6d 5b 6c 65  '%';.    zNum[le
3eb0: 6e 2b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  n+1] = 0;.    sq
3ec0: 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
3ed0: 67 2e 70 53 74 6d 74 2c 20 31 2c 20 7a 4e 75 6d  g.pStmt, 1, zNum
3ee0: 2c 20 6c 65 6e 2c 20 53 51 4c 49 54 45 5f 53 54  , len, SQLITE_ST
3ef0: 41 54 49 43 29 3b 0a 20 20 20 20 73 70 65 65 64  ATIC);.    speed
3f00: 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 7d  test1_run();.  }
3f10: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
3f20: 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20  ec("COMMIT");.  
3f30: 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74  speedtest1_end_t
3f40: 65 73 74 28 29 3b 0a 0a 20 20 6e 20 3d 20 31 30  est();..  n = 10
3f50: 3b 20 2f 2f 67 2e 73 7a 54 65 73 74 2f 35 3b 0a  ; //g.szTest/5;.
3f60: 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67    speedtest1_beg
3f70: 69 6e 5f 74 65 73 74 28 31 34 35 2c 20 22 25 64  in_test(145, "%d
3f80: 20 53 45 4c 45 43 54 53 20 77 2f 4f 52 44 45 52   SELECTS w/ORDER
3f90: 20 42 59 20 61 6e 64 20 4c 49 4d 49 54 2c 20 75   BY and LIMIT, u
3fa0: 6e 69 6e 64 65 78 65 64 22 2c 20 6e 29 3b 0a 20  nindexed", n);. 
3fb0: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
3fc0: 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65  ("BEGIN");.  spe
3fd0: 65 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28  edtest1_prepare(
3fe0: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 61 2c 20  .    "SELECT a, 
3ff0: 62 2c 20 63 20 46 52 4f 4d 20 74 31 20 57 48 45  b, c FROM t1 WHE
4000: 52 45 20 63 20 4c 49 4b 45 20 3f 31 5c 6e 22 0a  RE c LIKE ?1\n".
4010: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 61      " ORDER BY a
4020: 20 4c 49 4d 49 54 20 31 30 3b 20 2d 2d 20 25 64   LIMIT 10; -- %d
4030: 20 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b 0a   times", n.  );.
4040: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b    for(i=1; i<=n;
4050: 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20   i++){.    x1 = 
4060: 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f  speedtest1_rando
4070: 6d 28 29 25 6d 61 78 62 3b 0a 20 20 20 20 7a 4e  m()%maxb;.    zN
4080: 75 6d 5b 30 5d 20 3d 20 27 25 27 3b 0a 20 20 20  um[0] = '%';.   
4090: 20 6c 65 6e 20 3d 20 73 70 65 65 64 74 65 73 74   len = speedtest
40a0: 31 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 69 2c 20  1_numbername(i, 
40b0: 7a 4e 75 6d 2b 31 2c 20 73 69 7a 65 6f 66 28 7a  zNum+1, sizeof(z
40c0: 4e 75 6d 29 2d 32 29 3b 0a 20 20 20 20 7a 4e 75  Num)-2);.    zNu
40d0: 6d 5b 6c 65 6e 5d 20 3d 20 27 25 27 3b 0a 20 20  m[len] = '%';.  
40e0: 20 20 7a 4e 75 6d 5b 6c 65 6e 2b 31 5d 20 3d 20    zNum[len+1] = 
40f0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  0;.    sqlite3_b
4100: 69 6e 64 5f 74 65 78 74 28 67 2e 70 53 74 6d 74  ind_text(g.pStmt
4110: 2c 20 31 2c 20 7a 4e 75 6d 2c 20 6c 65 6e 2c 20  , 1, zNum, len, 
4120: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
4130: 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72      speedtest1_r
4140: 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65  un();.  }.  spee
4150: 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d  dtest1_exec("COM
4160: 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65  MIT");.  speedte
4170: 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a  st1_end_test();.
4180: 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62  ..  speedtest1_b
4190: 65 67 69 6e 5f 74 65 73 74 28 31 35 30 2c 20 22  egin_test(150, "
41a0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 66 69 76  CREATE INDEX fiv
41b0: 65 20 74 69 6d 65 73 22 29 3b 0a 20 20 73 70 65  e times");.  spe
41c0: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 42 45  edtest1_exec("BE
41d0: 47 49 4e 3b 22 29 3b 0a 20 20 73 70 65 65 64 74  GIN;");.  speedt
41e0: 65 73 74 31 5f 65 78 65 63 28 22 43 52 45 41 54  est1_exec("CREAT
41f0: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20 74  E UNIQUE INDEX t
4200: 31 62 20 4f 4e 20 74 31 28 62 29 3b 22 29 3b 0a  1b ON t1(b);");.
4210: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
4220: 63 28 22 43 52 45 41 54 45 20 49 4e 44 45 58 20  c("CREATE INDEX 
4230: 74 31 63 20 4f 4e 20 74 31 28 63 29 3b 22 29 3b  t1c ON t1(c);");
4240: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
4250: 65 63 28 22 43 52 45 41 54 45 20 55 4e 49 51 55  ec("CREATE UNIQU
4260: 45 20 49 4e 44 45 58 20 74 32 62 20 4f 4e 20 74  E INDEX t2b ON t
4270: 32 28 62 29 3b 22 29 3b 0a 20 20 73 70 65 65 64  2(b);");.  speed
4280: 74 65 73 74 31 5f 65 78 65 63 28 22 43 52 45 41  test1_exec("CREA
4290: 54 45 20 49 4e 44 45 58 20 74 32 63 20 4f 4e 20  TE INDEX t2c ON 
42a0: 74 32 28 63 20 44 45 53 43 29 3b 22 29 3b 0a 20  t2(c DESC);");. 
42b0: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
42c0: 28 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 74  ("CREATE INDEX t
42d0: 33 62 63 20 4f 4e 20 74 33 28 62 2c 63 29 3b 22  3bc ON t3(b,c);"
42e0: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
42f0: 65 78 65 63 28 22 43 4f 4d 4d 49 54 3b 22 29 3b  exec("COMMIT;");
4300: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
4310: 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20  d_test();...  n 
4320: 3d 20 73 7a 2f 35 3b 0a 20 20 73 70 65 65 64 74  = sz/5;.  speedt
4330: 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28  est1_begin_test(
4340: 31 36 30 2c 20 22 25 64 20 53 45 4c 45 43 54 53  160, "%d SELECTS
4350: 2c 20 6e 75 6d 65 72 69 63 20 42 45 54 57 45 45  , numeric BETWEE
4360: 4e 2c 20 69 6e 64 65 78 65 64 22 2c 20 6e 29 3b  N, indexed", n);
4370: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
4380: 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73  ec("BEGIN");.  s
4390: 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72  peedtest1_prepar
43a0: 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54 20 63  e(.    "SELECT c
43b0: 6f 75 6e 74 28 2a 29 2c 20 61 76 67 28 62 29 2c  ount(*), avg(b),
43c0: 20 73 75 6d 28 6c 65 6e 67 74 68 28 63 29 29 20   sum(length(c)) 
43d0: 46 52 4f 4d 20 74 31 5c 6e 22 0a 20 20 20 20 22  FROM t1\n".    "
43e0: 20 57 48 45 52 45 20 62 20 42 45 54 57 45 45 4e   WHERE b BETWEEN
43f0: 20 3f 31 20 41 4e 44 20 3f 32 3b 20 2d 2d 20 25   ?1 AND ?2; -- %
4400: 64 20 74 69 6d 65 73 22 2c 20 6e 0a 20 20 29 3b  d times", n.  );
4410: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
4420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d  ; i++){.    x1 =
4430: 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64   speedtest1_rand
4440: 6f 6d 28 29 25 6d 61 78 62 3b 0a 20 20 20 20 78  om()%maxb;.    x
4450: 32 20 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72  2 = speedtest1_r
4460: 61 6e 64 6f 6d 28 29 25 31 30 20 2b 20 73 7a 2f  andom()%10 + sz/
4470: 35 30 30 30 20 2b 20 78 31 3b 0a 20 20 20 20 73  5000 + x1;.    s
4480: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
4490: 67 2e 70 53 74 6d 74 2c 20 31 2c 20 78 31 29 3b  g.pStmt, 1, x1);
44a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
44b0: 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 32  d_int(g.pStmt, 2
44c0: 2c 20 78 32 29 3b 0a 20 20 20 20 73 70 65 65 64  , x2);.    speed
44d0: 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 7d  test1_run();.  }
44e0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
44f0: 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20  ec("COMMIT");.  
4500: 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74  speedtest1_end_t
4510: 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20 3d 20 73  est();...  n = s
4520: 7a 2f 35 3b 0a 20 20 73 70 65 65 64 74 65 73 74  z/5;.  speedtest
4530: 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 36 31  1_begin_test(161
4540: 2c 20 22 25 64 20 53 45 4c 45 43 54 53 2c 20 6e  , "%d SELECTS, n
4550: 75 6d 65 72 69 63 20 42 45 54 57 45 45 4e 2c 20  umeric BETWEEN, 
4560: 50 4b 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65 64  PK", n);.  speed
4570: 74 65 73 74 31 5f 65 78 65 63 28 22 42 45 47 49  test1_exec("BEGI
4580: 4e 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  N");.  speedtest
4590: 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20 22  1_prepare(.    "
45a0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
45b0: 20 61 76 67 28 62 29 2c 20 73 75 6d 28 6c 65 6e   avg(b), sum(len
45c0: 67 74 68 28 63 29 29 20 46 52 4f 4d 20 74 32 5c  gth(c)) FROM t2\
45d0: 6e 22 0a 20 20 20 20 22 20 57 48 45 52 45 20 61  n".    " WHERE a
45e0: 20 42 45 54 57 45 45 4e 20 3f 31 20 41 4e 44 20   BETWEEN ?1 AND 
45f0: 3f 32 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73 22  ?2; -- %d times"
4600: 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69  , n.  );.  for(i
4610: 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a  =1; i<=n; i++){.
4620: 20 20 20 20 78 31 20 3d 20 73 70 65 65 64 74 65      x1 = speedte
4630: 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 6d 61 78  st1_random()%max
4640: 62 3b 0a 20 20 20 20 78 32 20 3d 20 73 70 65 65  b;.    x2 = spee
4650: 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25  dtest1_random()%
4660: 31 30 20 2b 20 73 7a 2f 35 30 30 30 20 2b 20 78  10 + sz/5000 + x
4670: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  1;.    sqlite3_b
4680: 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c  ind_int(g.pStmt,
4690: 20 31 2c 20 78 31 29 3b 0a 20 20 20 20 73 71 6c   1, x1);.    sql
46a0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
46b0: 70 53 74 6d 74 2c 20 32 2c 20 78 32 29 3b 0a 20  pStmt, 2, x2);. 
46c0: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75     speedtest1_ru
46d0: 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64  n();.  }.  speed
46e0: 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d  test1_exec("COMM
46f0: 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IT");.  speedtes
4700: 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a  t1_end_test();..
4710: 0a 20 20 6e 20 3d 20 73 7a 2f 35 3b 0a 20 20 73  .  n = sz/5;.  s
4720: 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f  peedtest1_begin_
4730: 74 65 73 74 28 31 37 30 2c 20 22 25 64 20 53 45  test(170, "%d SE
4740: 4c 45 43 54 53 2c 20 74 65 78 74 20 42 45 54 57  LECTS, text BETW
4750: 45 45 4e 2c 20 69 6e 64 65 78 65 64 22 2c 20 6e  EEN, indexed", n
4760: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
4770: 65 78 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20  exec("BEGIN");. 
4780: 20 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70   speedtest1_prep
4790: 61 72 65 28 0a 20 20 20 20 22 53 45 4c 45 43 54  are(.    "SELECT
47a0: 20 63 6f 75 6e 74 28 2a 29 2c 20 61 76 67 28 62   count(*), avg(b
47b0: 29 2c 20 73 75 6d 28 6c 65 6e 67 74 68 28 63 29  ), sum(length(c)
47c0: 29 20 46 52 4f 4d 20 74 31 5c 6e 22 0a 20 20 20  ) FROM t1\n".   
47d0: 20 22 20 57 48 45 52 45 20 63 20 42 45 54 57 45   " WHERE c BETWE
47e0: 45 4e 20 3f 31 20 41 4e 44 20 28 3f 31 7c 7c 27  EN ?1 AND (?1||'
47f0: 7e 27 29 3b 20 2d 2d 20 25 64 20 74 69 6d 65 73  ~'); -- %d times
4800: 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28  ", n.  );.  for(
4810: 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b  i=1; i<=n; i++){
4820: 0a 20 20 20 20 78 31 20 3d 20 73 77 69 7a 7a 6c  .    x1 = swizzl
4830: 65 28 69 2c 20 6d 61 78 62 29 3b 0a 20 20 20 20  e(i, maxb);.    
4840: 6c 65 6e 20 3d 20 73 70 65 65 64 74 65 73 74 31  len = speedtest1
4850: 5f 6e 75 6d 62 65 72 6e 61 6d 65 28 78 31 2c 20  _numbername(x1, 
4860: 7a 4e 75 6d 2c 20 73 69 7a 65 6f 66 28 7a 4e 75  zNum, sizeof(zNu
4870: 6d 29 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  m)-1);.    sqlit
4880: 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 67 2e 70  e3_bind_text(g.p
4890: 53 74 6d 74 2c 20 31 2c 20 7a 4e 75 6d 2c 20 6c  Stmt, 1, zNum, l
48a0: 65 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  en, SQLITE_STATI
48b0: 43 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73  C);.    speedtes
48c0: 74 31 5f 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20  t1_run();.  }.  
48d0: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
48e0: 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65  "COMMIT");.  spe
48f0: 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74  edtest1_end_test
4900: 28 29 3b 0a 0a 20 20 6e 20 3d 20 73 7a 3b 0a 20  ();..  n = sz;. 
4910: 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69   speedtest1_begi
4920: 6e 5f 74 65 73 74 28 31 38 30 2c 20 22 25 64 20  n_test(180, "%d 
4930: 49 4e 53 45 52 54 53 20 77 69 74 68 20 74 68 72  INSERTS with thr
4940: 65 65 20 69 6e 64 65 78 65 73 22 2c 20 6e 29 3b  ee indexes", n);
4950: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
4960: 65 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73  ec("BEGIN");.  s
4970: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 0a  peedtest1_exec(.
4980: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
4990: 45 20 74 34 28 5c 6e 22 0a 20 20 20 20 22 20 20  E t4(\n".    "  
49a0: 61 20 49 4e 54 45 47 45 52 20 25 73 20 25 73 2c  a INTEGER %s %s,
49b0: 5c 6e 22 0a 20 20 20 20 22 20 20 62 20 49 4e 54  \n".    "  b INT
49c0: 45 47 45 52 20 25 73 2c 5c 6e 22 0a 20 20 20 20  EGER %s,\n".    
49d0: 22 20 20 63 20 54 45 58 54 20 25 73 5c 6e 22 0a  "  c TEXT %s\n".
49e0: 20 20 20 20 22 29 20 25 73 22 2c 0a 20 20 20 20      ") %s",.    
49f0: 67 2e 7a 4e 4e 2c 20 67 2e 7a 50 4b 2c 20 67 2e  g.zNN, g.zPK, g.
4a00: 7a 4e 4e 2c 20 67 2e 7a 4e 4e 2c 20 67 2e 7a 57  zNN, g.zNN, g.zW
4a10: 52 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  R);.  speedtest1
4a20: 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 49 4e  _exec("CREATE IN
4a30: 44 45 58 20 74 34 62 20 4f 4e 20 74 34 28 62 29  DEX t4b ON t4(b)
4a40: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
4a50: 5f 65 78 65 63 28 22 43 52 45 41 54 45 20 49 4e  _exec("CREATE IN
4a60: 44 45 58 20 74 34 63 20 4f 4e 20 74 34 28 63 29  DEX t4c ON t4(c)
4a70: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
4a80: 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 49 4e  _exec("INSERT IN
4a90: 54 4f 20 74 34 20 53 45 4c 45 43 54 20 2a 20 46  TO t4 SELECT * F
4aa0: 52 4f 4d 20 74 31 22 29 3b 0a 20 20 73 70 65 65  ROM t1");.  spee
4ab0: 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d  dtest1_exec("COM
4ac0: 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65  MIT");.  speedte
4ad0: 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a  st1_end_test();.
4ae0: 0a 20 20 6e 20 3d 20 73 7a 3b 0a 20 20 73 70 65  .  n = sz;.  spe
4af0: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
4b00: 73 74 28 31 39 30 2c 20 22 44 45 4c 45 54 45 20  st(190, "DELETE 
4b10: 61 6e 64 20 52 45 46 49 4c 4c 20 6f 6e 65 20 74  and REFILL one t
4b20: 61 62 6c 65 22 2c 20 6e 29 3b 0a 20 20 73 70 65  able", n);.  spe
4b30: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 44 45  edtest1_exec("DE
4b40: 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 22 29 3b  LETE FROM t2;");
4b50: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
4b60: 65 63 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ec("INSERT INTO 
4b70: 74 32 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t2 SELECT * FROM
4b80: 20 74 31 3b 22 29 3b 0a 20 20 73 70 65 65 64 74   t1;");.  speedt
4b90: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
4ba0: 0a 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  ...  speedtest1_
4bb0: 62 65 67 69 6e 5f 74 65 73 74 28 32 30 30 2c 20  begin_test(200, 
4bc0: 22 56 41 43 55 55 4d 22 29 3b 0a 20 20 73 70 65  "VACUUM");.  spe
4bd0: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 56 41  edtest1_exec("VA
4be0: 43 55 55 4d 22 29 3b 0a 20 20 73 70 65 65 64 74  CUUM");.  speedt
4bf0: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
4c00: 0a 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  ...  speedtest1_
4c10: 62 65 67 69 6e 5f 74 65 73 74 28 32 31 30 2c 20  begin_test(210, 
4c20: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 41 44 44  "ALTER TABLE ADD
4c30: 20 43 4f 4c 55 4d 4e 2c 20 61 6e 64 20 71 75 65   COLUMN, and que
4c40: 72 79 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  ry");.  speedtes
4c50: 74 31 5f 65 78 65 63 28 22 41 4c 54 45 52 20 54  t1_exec("ALTER T
4c60: 41 42 4c 45 20 74 32 20 41 44 44 20 43 4f 4c 55  ABLE t2 ADD COLU
4c70: 4d 4e 20 64 20 44 45 46 41 55 4c 54 20 31 32 33  MN d DEFAULT 123
4c80: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
4c90: 5f 65 78 65 63 28 22 53 45 4c 45 43 54 20 73 75  _exec("SELECT su
4ca0: 6d 28 64 29 20 46 52 4f 4d 20 74 32 22 29 3b 0a  m(d) FROM t2");.
4cb0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64    speedtest1_end
4cc0: 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20 3d  _test();...  n =
4cd0: 20 73 7a 2f 35 3b 0a 20 20 73 70 65 65 64 74 65   sz/5;.  speedte
4ce0: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 32  st1_begin_test(2
4cf0: 33 30 2c 20 22 25 64 20 55 50 44 41 54 45 53 2c  30, "%d UPDATES,
4d00: 20 6e 75 6d 65 72 69 63 20 42 45 54 57 45 45 4e   numeric BETWEEN
4d10: 2c 20 69 6e 64 65 78 65 64 22 2c 20 6e 29 3b 0a  , indexed", n);.
4d20: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
4d30: 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70  c("BEGIN");.  sp
4d40: 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72 65  eedtest1_prepare
4d50: 28 0a 20 20 20 20 22 55 50 44 41 54 45 20 74 32  (.    "UPDATE t2
4d60: 20 53 45 54 20 64 3d 62 2a 32 20 57 48 45 52 45   SET d=b*2 WHERE
4d70: 20 62 20 42 45 54 57 45 45 4e 20 3f 31 20 41 4e   b BETWEEN ?1 AN
4d80: 44 20 3f 32 3b 20 2d 2d 20 25 64 20 74 69 6d 65  D ?2; -- %d time
4d90: 73 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72  s", n.  );.  for
4da0: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
4db0: 7b 0a 20 20 20 20 78 31 20 3d 20 73 70 65 65 64  {.    x1 = speed
4dc0: 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 6d  test1_random()%m
4dd0: 61 78 62 3b 0a 20 20 20 20 78 32 20 3d 20 73 70  axb;.    x2 = sp
4de0: 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28  eedtest1_random(
4df0: 29 25 31 30 20 2b 20 73 7a 2f 35 30 30 30 20 2b  )%10 + sz/5000 +
4e00: 20 78 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   x1;.    sqlite3
4e10: 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d  _bind_int(g.pStm
4e20: 74 2c 20 31 2c 20 78 31 29 3b 0a 20 20 20 20 73  t, 1, x1);.    s
4e30: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
4e40: 67 2e 70 53 74 6d 74 2c 20 32 2c 20 78 32 29 3b  g.pStmt, 2, x2);
4e50: 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f  .    speedtest1_
4e60: 72 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65  run();.  }.  spe
4e70: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f  edtest1_exec("CO
4e80: 4d 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74  MMIT");.  speedt
4e90: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
4ea0: 0a 0a 0a 20 20 6e 20 3d 20 73 7a 3b 0a 20 20 73  ...  n = sz;.  s
4eb0: 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f  peedtest1_begin_
4ec0: 74 65 73 74 28 32 34 30 2c 20 22 25 64 20 55 50  test(240, "%d UP
4ed0: 44 41 54 45 53 20 6f 66 20 69 6e 64 69 76 69 64  DATES of individ
4ee0: 75 61 6c 20 72 6f 77 73 22 2c 20 6e 29 3b 0a 20  ual rows", n);. 
4ef0: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
4f00: 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65  ("BEGIN");.  spe
4f10: 65 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28  edtest1_prepare(
4f20: 0a 20 20 20 20 22 55 50 44 41 54 45 20 74 32 20  .    "UPDATE t2 
4f30: 53 45 54 20 64 3d 62 2a 33 20 57 48 45 52 45 20  SET d=b*3 WHERE 
4f40: 61 3d 3f 31 3b 20 2d 2d 20 25 64 20 74 69 6d 65  a=?1; -- %d time
4f50: 73 22 2c 20 6e 0a 20 20 29 3b 0a 20 20 66 6f 72  s", n.  );.  for
4f60: 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b 2b 29  (i=1; i<=n; i++)
4f70: 7b 0a 20 20 20 20 78 31 20 3d 20 73 70 65 65 64  {.    x1 = speed
4f80: 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29 25 73  test1_random()%s
4f90: 7a 20 2b 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  z + 1;.    sqlit
4fa0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
4fb0: 74 6d 74 2c 20 31 2c 20 78 31 29 3b 0a 20 20 20  tmt, 1, x1);.   
4fc0: 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28   speedtest1_run(
4fd0: 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65  );.  }.  speedte
4fe0: 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54  st1_exec("COMMIT
4ff0: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
5000: 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20  _end_test();..  
5010: 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e  speedtest1_begin
5020: 5f 74 65 73 74 28 32 35 30 2c 20 22 4f 6e 65 20  _test(250, "One 
5030: 62 69 67 20 55 50 44 41 54 45 20 6f 66 20 74 68  big UPDATE of th
5040: 65 20 77 68 6f 6c 65 20 25 64 2d 72 6f 77 20 74  e whole %d-row t
5050: 61 62 6c 65 22 2c 20 73 7a 29 3b 0a 20 20 73 70  able", sz);.  sp
5060: 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 55  eedtest1_exec("U
5070: 50 44 41 54 45 20 74 32 20 53 45 54 20 64 3d 62  PDATE t2 SET d=b
5080: 2a 34 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  *4");.  speedtes
5090: 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a  t1_end_test();..
50a0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65  .  speedtest1_be
50b0: 67 69 6e 5f 74 65 73 74 28 32 36 30 2c 20 22 51  gin_test(260, "Q
50c0: 75 65 72 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  uery added colum
50d0: 6e 20 61 66 74 65 72 20 66 69 6c 6c 69 6e 67 22  n after filling"
50e0: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
50f0: 65 78 65 63 28 22 53 45 4c 45 43 54 20 73 75 6d  exec("SELECT sum
5100: 28 64 29 20 46 52 4f 4d 20 74 32 22 29 3b 0a 20  (d) FROM t2");. 
5110: 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f   speedtest1_end_
5120: 74 65 73 74 28 29 3b 0a 0a 0a 0a 20 20 6e 20 3d  test();....  n =
5130: 20 73 7a 2f 35 3b 0a 20 20 73 70 65 65 64 74 65   sz/5;.  speedte
5140: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 32  st1_begin_test(2
5150: 37 30 2c 20 22 25 64 20 44 45 4c 45 54 45 73 2c  70, "%d DELETEs,
5160: 20 6e 75 6d 65 72 69 63 20 42 45 54 57 45 45 4e   numeric BETWEEN
5170: 2c 20 69 6e 64 65 78 65 64 22 2c 20 6e 29 3b 0a  , indexed", n);.
5180: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
5190: 63 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70  c("BEGIN");.  sp
51a0: 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72 65  eedtest1_prepare
51b0: 28 0a 20 20 20 20 22 44 45 4c 45 54 45 20 46 52  (.    "DELETE FR
51c0: 4f 4d 20 74 32 20 57 48 45 52 45 20 62 20 42 45  OM t2 WHERE b BE
51d0: 54 57 45 45 4e 20 3f 31 20 41 4e 44 20 3f 32 3b  TWEEN ?1 AND ?2;
51e0: 20 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e   -- %d times", n
51f0: 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  .  );.  for(i=1;
5200: 20 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20   i<=n; i++){.   
5210: 20 78 31 20 3d 20 73 70 65 65 64 74 65 73 74 31   x1 = speedtest1
5220: 5f 72 61 6e 64 6f 6d 28 29 25 6d 61 78 62 20 2b  _random()%maxb +
5230: 20 31 3b 0a 20 20 20 20 78 32 20 3d 20 73 70 65   1;.    x2 = spe
5240: 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29  edtest1_random()
5250: 25 31 30 20 2b 20 73 7a 2f 35 30 30 30 20 2b 20  %10 + sz/5000 + 
5260: 78 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x1;.    sqlite3_
5270: 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74  bind_int(g.pStmt
5280: 2c 20 31 2c 20 78 31 29 3b 0a 20 20 20 20 73 71  , 1, x1);.    sq
5290: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67  lite3_bind_int(g
52a0: 2e 70 53 74 6d 74 2c 20 32 2c 20 78 32 29 3b 0a  .pStmt, 2, x2);.
52b0: 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72      speedtest1_r
52c0: 75 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65  un();.  }.  spee
52d0: 64 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d  dtest1_exec("COM
52e0: 4d 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65  MIT");.  speedte
52f0: 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a  st1_end_test();.
5300: 0a 0a 20 20 6e 20 3d 20 73 7a 3b 0a 20 20 73 70  ..  n = sz;.  sp
5310: 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74  eedtest1_begin_t
5320: 65 73 74 28 32 38 30 2c 20 22 25 64 20 44 45 4c  est(280, "%d DEL
5330: 45 54 45 73 20 6f 66 20 69 6e 64 69 76 69 64 75  ETEs of individu
5340: 61 6c 20 72 6f 77 73 22 2c 20 6e 29 3b 0a 20 20  al rows", n);.  
5350: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
5360: 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65 65  "BEGIN");.  spee
5370: 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 0a  dtest1_prepare(.
5380: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
5390: 20 74 33 20 57 48 45 52 45 20 61 3d 3f 31 3b 20   t3 WHERE a=?1; 
53a0: 2d 2d 20 25 64 20 74 69 6d 65 73 22 2c 20 6e 0a  -- %d times", n.
53b0: 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20    );.  for(i=1; 
53c0: 69 3c 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=n; i++){.    
53d0: 78 31 20 3d 20 73 70 65 65 64 74 65 73 74 31 5f  x1 = speedtest1_
53e0: 72 61 6e 64 6f 6d 28 29 25 73 7a 20 2b 20 31 3b  random()%sz + 1;
53f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
5400: 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31  d_int(g.pStmt, 1
5410: 2c 20 78 31 29 3b 0a 20 20 20 20 73 70 65 65 64  , x1);.    speed
5420: 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 7d  test1_run();.  }
5430: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
5440: 65 63 28 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20  ec("COMMIT");.  
5450: 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74  speedtest1_end_t
5460: 65 73 74 28 29 3b 0a 0a 0a 20 20 73 70 65 65 64  est();...  speed
5470: 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74  test1_begin_test
5480: 28 32 39 30 2c 20 22 52 65 66 69 6c 6c 20 74 77  (290, "Refill tw
5490: 6f 20 25 64 2d 72 6f 77 20 74 61 62 6c 65 73 20  o %d-row tables 
54a0: 75 73 69 6e 67 20 52 45 50 4c 41 43 45 22 2c 20  using REPLACE", 
54b0: 73 7a 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  sz);.  speedtest
54c0: 31 5f 65 78 65 63 28 22 52 45 50 4c 41 43 45 20  1_exec("REPLACE 
54d0: 49 4e 54 4f 20 74 32 28 61 2c 62 2c 63 29 20 53  INTO t2(a,b,c) S
54e0: 45 4c 45 43 54 20 61 2c 62 2c 63 20 46 52 4f 4d  ELECT a,b,c FROM
54f0: 20 74 31 22 29 3b 0a 20 20 73 70 65 65 64 74 65   t1");.  speedte
5500: 73 74 31 5f 65 78 65 63 28 22 52 45 50 4c 41 43  st1_exec("REPLAC
5510: 45 20 49 4e 54 4f 20 74 33 28 61 2c 62 2c 63 29  E INTO t3(a,b,c)
5520: 20 53 45 4c 45 43 54 20 61 2c 62 2c 63 20 46 52   SELECT a,b,c FR
5530: 4f 4d 20 74 31 22 29 3b 0a 20 20 73 70 65 65 64  OM t1");.  speed
5540: 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29  test1_end_test()
5550: 3b 0a 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  ;..  speedtest1_
5560: 62 65 67 69 6e 5f 74 65 73 74 28 33 30 30 2c 20  begin_test(300, 
5570: 22 52 65 66 69 6c 6c 20 61 20 25 64 2d 72 6f 77  "Refill a %d-row
5580: 20 74 61 62 6c 65 20 75 73 69 6e 67 20 28 62 26   table using (b&
5590: 31 29 3d 3d 28 61 26 31 29 22 2c 20 73 7a 29 3b  1)==(a&1)", sz);
55a0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
55b0: 65 63 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ec("DELETE FROM 
55c0: 74 32 3b 22 29 3b 0a 20 20 73 70 65 65 64 74 65  t2;");.  speedte
55d0: 73 74 31 5f 65 78 65 63 28 22 49 4e 53 45 52 54  st1_exec("INSERT
55e0: 20 49 4e 54 4f 20 74 32 28 61 2c 62 2c 63 29 5c   INTO t2(a,b,c)\
55f0: 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
5600: 20 20 20 20 20 22 20 53 45 4c 45 43 54 20 61 2c       " SELECT a,
5610: 62 2c 63 20 46 52 4f 4d 20 74 31 20 20 57 48 45  b,c FROM t1  WHE
5620: 52 45 20 28 62 26 31 29 3d 3d 28 61 26 31 29 3b  RE (b&1)==(a&1);
5630: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
5640: 5f 65 78 65 63 28 22 49 4e 53 45 52 54 20 49 4e  _exec("INSERT IN
5650: 54 4f 20 74 32 28 61 2c 62 2c 63 29 5c 6e 22 0a  TO t2(a,b,c)\n".
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 20 22 20 53 45 4c 45 43 54 20 61 2c 62 2c 63    " SELECT a,b,c
5680: 20 46 52 4f 4d 20 74 31 20 20 57 48 45 52 45 20   FROM t1  WHERE 
5690: 28 62 26 31 29 3c 3e 28 61 26 31 29 3b 22 29 3b  (b&1)<>(a&1);");
56a0: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e  .  speedtest1_en
56b0: 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20 6e 20  d_test();...  n 
56c0: 3d 20 73 7a 2f 35 3b 0a 20 20 73 70 65 65 64 74  = sz/5;.  speedt
56d0: 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28  est1_begin_test(
56e0: 33 31 30 2c 20 22 25 64 20 66 6f 75 72 2d 77 61  310, "%d four-wa
56f0: 79 73 20 6a 6f 69 6e 73 22 2c 20 6e 29 3b 0a 20  ys joins", n);. 
5700: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
5710: 28 22 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65  ("BEGIN");.  spe
5720: 65 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28  edtest1_prepare(
5730: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 74 31 2e  .    "SELECT t1.
5740: 63 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  c FROM t1, t2, t
5750: 33 2c 20 74 34 5c 6e 22 0a 20 20 20 20 22 20 57  3, t4\n".    " W
5760: 48 45 52 45 20 74 34 2e 61 20 42 45 54 57 45 45  HERE t4.a BETWEE
5770: 4e 20 3f 31 20 41 4e 44 20 3f 32 5c 6e 22 0a 20  N ?1 AND ?2\n". 
5780: 20 20 20 22 20 20 20 41 4e 44 20 74 33 2e 61 3d     "   AND t3.a=
5790: 74 34 2e 62 5c 6e 22 0a 20 20 20 20 22 20 20 20  t4.b\n".    "   
57a0: 41 4e 44 20 74 32 2e 61 3d 74 33 2e 62 5c 6e 22  AND t2.a=t3.b\n"
57b0: 0a 20 20 20 20 22 20 20 20 41 4e 44 20 74 31 2e  .    "   AND t1.
57c0: 63 3d 74 32 2e 63 22 0a 20 20 29 3b 0a 20 20 66  c=t2.c".  );.  f
57d0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b  or(i=1; i<=n; i+
57e0: 2b 29 7b 0a 20 20 20 20 78 31 20 3d 20 73 70 65  +){.    x1 = spe
57f0: 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29  edtest1_random()
5800: 25 73 7a 20 2b 20 31 3b 0a 20 20 20 20 78 32 20  %sz + 1;.    x2 
5810: 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e  = speedtest1_ran
5820: 64 6f 6d 28 29 25 31 30 20 2b 20 78 31 20 2b 20  dom()%10 + x1 + 
5830: 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  4;.    sqlite3_b
5840: 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c  ind_int(g.pStmt,
5850: 20 31 2c 20 78 31 29 3b 0a 20 20 20 20 73 71 6c   1, x1);.    sql
5860: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
5870: 70 53 74 6d 74 2c 20 32 2c 20 78 32 29 3b 0a 20  pStmt, 2, x2);. 
5880: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75     speedtest1_ru
5890: 6e 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64  n();.  }.  speed
58a0: 74 65 73 74 31 5f 65 78 65 63 28 22 43 4f 4d 4d  test1_exec("COMM
58b0: 49 54 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  IT");.  speedtes
58c0: 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a  t1_end_test();..
58d0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67    speedtest1_beg
58e0: 69 6e 5f 74 65 73 74 28 33 32 30 2c 20 22 73 75  in_test(320, "su
58f0: 62 71 75 65 72 79 20 69 6e 20 72 65 73 75 6c 74  bquery in result
5900: 20 73 65 74 22 2c 20 6e 29 3b 0a 20 20 73 70 65   set", n);.  spe
5910: 65 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28  edtest1_prepare(
5920: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 73 75 6d  .    "SELECT sum
5930: 28 61 29 2c 20 6d 61 78 28 63 29 2c 5c 6e 22 0a  (a), max(c),\n".
5940: 20 20 20 20 22 20 20 20 20 20 20 20 61 76 67 28      "       avg(
5950: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74  (SELECT a FROM t
5960: 32 20 57 48 45 52 45 20 35 2b 74 32 2e 62 3d 74  2 WHERE 5+t2.b=t
5970: 31 2e 62 29 20 41 4e 44 20 72 6f 77 69 64 3c 3f  1.b) AND rowid<?
5980: 31 29 2c 20 6d 61 78 28 63 29 5c 6e 22 0a 20 20  1), max(c)\n".  
5990: 20 20 22 20 46 52 4f 4d 20 74 31 20 57 48 45 52    " FROM t1 WHER
59a0: 45 20 72 6f 77 69 64 3c 3f 31 3b 22 0a 20 20 29  E rowid<?1;".  )
59b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
59c0: 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c  _int(g.pStmt, 1,
59d0: 20 65 73 74 5f 73 71 75 61 72 65 5f 72 6f 6f 74   est_square_root
59e0: 28 67 2e 73 7a 54 65 73 74 29 2a 35 30 29 3b 0a  (g.szTest)*50);.
59f0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e    speedtest1_run
5a00: 28 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ();.  speedtest1
5a10: 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20  _end_test();..  
5a20: 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e  speedtest1_begin
5a30: 5f 74 65 73 74 28 39 38 30 2c 20 22 50 52 41 47  _test(980, "PRAG
5a40: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
5a50: 63 6b 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73  ck");.  speedtes
5a60: 74 31 5f 65 78 65 63 28 22 50 52 41 47 4d 41 20  t1_exec("PRAGMA 
5a70: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 22  integrity_check"
5a80: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
5a90: 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 0a 20 20  end_test();...  
5aa0: 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e  speedtest1_begin
5ab0: 5f 74 65 73 74 28 39 39 30 2c 20 22 41 4e 41 4c  _test(990, "ANAL
5ac0: 59 5a 45 22 29 3b 0a 20 20 73 70 65 65 64 74 65  YZE");.  speedte
5ad0: 73 74 31 5f 65 78 65 63 28 22 41 4e 41 4c 59 5a  st1_exec("ANALYZ
5ae0: 45 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  E");.  speedtest
5af0: 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 7d 0a  1_end_test();.}.
5b00: 0a 2f 2a 0a 2a 2a 20 41 20 74 65 73 74 73 65 74  ./*.** A testset
5b10: 20 66 6f 72 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c   for common tabl
5b20: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  e expressions.  
5b30: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 63  This exercises c
5b40: 6f 64 65 0a 2a 2a 20 66 6f 72 20 76 69 65 77 73  ode.** for views
5b50: 2c 20 73 75 62 71 75 65 72 69 65 73 2c 20 63 6f  , subqueries, co
5b60: 2d 72 6f 75 74 69 6e 65 73 2c 20 65 74 63 2e 0a  -routines, etc..
5b70: 2a 2f 0a 76 6f 69 64 20 74 65 73 74 73 65 74 5f  */.void testset_
5b80: 63 74 65 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  cte(void){.  sta
5b90: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
5ba0: 61 7a 50 75 7a 7a 6c 65 5b 5d 20 3d 20 7b 0a 20  azPuzzle[] = {. 
5bb0: 20 20 20 2f 2a 20 45 61 73 79 20 2a 2f 0a 20 20     /* Easy */.  
5bc0: 20 20 22 35 33 34 2e 2e 2e 39 2e 2e 22 0a 20 20    "534...9..".  
5bd0: 20 20 22 36 37 2e 31 39 35 2e 2e 2e 22 0a 20 20    "67.195...".  
5be0: 20 20 22 2e 39 38 2e 2e 2e 2e 36 2e 22 0a 20 20    ".98....6.".  
5bf0: 20 20 22 38 2e 2e 2e 36 2e 2e 2e 33 22 0a 20 20    "8...6...3".  
5c00: 20 20 22 34 2e 2e 38 2e 33 2e 2e 31 22 0a 20 20    "4..8.3..1".  
5c10: 20 20 22 2e 2e 2e 2e 32 2e 2e 2e 36 22 0a 20 20    "....2...6".  
5c20: 20 20 22 2e 36 2e 2e 2e 2e 32 38 2e 22 0a 20 20    ".6....28.".  
5c30: 20 20 22 2e 2e 2e 34 31 39 2e 2e 35 22 0a 20 20    "...419..5".  
5c40: 20 20 22 2e 2e 2e 32 38 2e 2e 37 39 22 2c 0a 0a    "...28..79",..
5c50: 20 20 20 20 2f 2a 20 4d 65 64 69 75 6d 20 2a 2f      /* Medium */
5c60: 0a 20 20 20 20 22 35 33 2e 2e 2e 2e 39 2e 2e 22  .    "53....9.."
5c70: 0a 20 20 20 20 22 36 2e 2e 31 39 35 2e 2e 2e 22  .    "6..195..."
5c80: 0a 20 20 20 20 22 2e 39 38 2e 2e 2e 2e 36 2e 22  .    ".98....6."
5c90: 0a 20 20 20 20 22 38 2e 2e 2e 36 2e 2e 2e 33 22  .    "8...6...3"
5ca0: 0a 20 20 20 20 22 34 2e 2e 38 2e 33 2e 2e 31 22  .    "4..8.3..1"
5cb0: 0a 20 20 20 20 22 2e 2e 2e 2e 32 2e 2e 2e 36 22  .    "....2...6"
5cc0: 0a 20 20 20 20 22 2e 36 2e 2e 2e 2e 32 38 2e 22  .    ".6....28."
5cd0: 0a 20 20 20 20 22 2e 2e 2e 34 31 39 2e 2e 35 22  .    "...419..5"
5ce0: 0a 20 20 20 20 22 2e 2e 2e 2e 38 2e 2e 37 39 22  .    "....8..79"
5cf0: 2c 0a 0a 20 20 20 20 2f 2a 20 48 61 72 64 20 2a  ,..    /* Hard *
5d00: 2f 0a 20 20 20 20 22 35 33 2e 2e 2e 2e 2e 2e 2e  /.    "53.......
5d10: 22 0a 20 20 20 20 22 36 2e 2e 31 39 35 2e 2e 2e  ".    "6..195...
5d20: 22 0a 20 20 20 20 22 2e 39 38 2e 2e 2e 2e 36 2e  ".    ".98....6.
5d30: 22 0a 20 20 20 20 22 38 2e 2e 2e 36 2e 2e 2e 33  ".    "8...6...3
5d40: 22 0a 20 20 20 20 22 34 2e 2e 38 2e 33 2e 2e 31  ".    "4..8.3..1
5d50: 22 0a 20 20 20 20 22 2e 2e 2e 2e 32 2e 2e 2e 36  ".    "....2...6
5d60: 22 0a 20 20 20 20 22 2e 36 2e 2e 2e 2e 32 38 2e  ".    ".6....28.
5d70: 22 0a 20 20 20 20 22 2e 2e 2e 34 31 39 2e 2e 35  ".    "...419..5
5d80: 22 0a 20 20 20 20 22 2e 2e 2e 2e 38 2e 2e 37 39  ".    "....8..79
5d90: 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ",.  };.  const 
5da0: 63 68 61 72 20 2a 7a 50 75 7a 3b 0a 20 20 64 6f  char *zPuz;.  do
5db0: 75 62 6c 65 20 72 53 70 61 63 69 6e 67 3b 0a 20  uble rSpacing;. 
5dc0: 20 69 6e 74 20 6e 45 6c 65 6d 3b 0a 0a 20 20 69   int nElem;..  i
5dd0: 66 28 20 67 2e 73 7a 54 65 73 74 3c 32 35 20 29  f( g.szTest<25 )
5de0: 7b 0a 20 20 20 20 7a 50 75 7a 20 3d 20 61 7a 50  {.    zPuz = azP
5df0: 75 7a 7a 6c 65 5b 30 5d 3b 0a 20 20 7d 65 6c 73  uzzle[0];.  }els
5e00: 65 20 69 66 28 20 67 2e 73 7a 54 65 73 74 3c 37  e if( g.szTest<7
5e10: 30 20 29 7b 0a 20 20 20 20 7a 50 75 7a 20 3d 20  0 ){.    zPuz = 
5e20: 61 7a 50 75 7a 7a 6c 65 5b 31 5d 3b 0a 20 20 7d  azPuzzle[1];.  }
5e30: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 75 7a 20 3d  else{.    zPuz =
5e40: 20 61 7a 50 75 7a 7a 6c 65 5b 32 5d 3b 0a 20 20   azPuzzle[2];.  
5e50: 7d 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 62  }.  speedtest1_b
5e60: 65 67 69 6e 5f 74 65 73 74 28 31 30 30 2c 20 22  egin_test(100, "
5e70: 53 75 64 6f 6b 75 20 77 69 74 68 20 72 65 63 75  Sudoku with recu
5e80: 72 73 69 76 65 20 27 64 69 67 69 74 73 27 22 29  rsive 'digits'")
5e90: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 70  ;.  speedtest1_p
5ea0: 72 65 70 61 72 65 28 0a 20 20 20 20 22 57 49 54  repare(.    "WIT
5eb0: 48 20 52 45 43 55 52 53 49 56 45 5c 6e 22 0a 20  H RECURSIVE\n". 
5ec0: 20 20 20 22 20 20 69 6e 70 75 74 28 73 75 64 29     "  input(sud)
5ed0: 20 41 53 20 28 56 41 4c 55 45 53 28 3f 31 29 29   AS (VALUES(?1))
5ee0: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 64 69 67 69  ,\n".    "  digi
5ef0: 74 73 28 7a 2c 6c 70 29 20 41 53 20 28 5c 6e 22  ts(z,lp) AS (\n"
5f00: 0a 20 20 20 20 22 20 20 20 20 56 41 4c 55 45 53  .    "    VALUES
5f10: 28 27 31 27 2c 20 31 29 5c 6e 22 0a 20 20 20 20  ('1', 1)\n".    
5f20: 22 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e  "    UNION ALL\n
5f30: 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43  ".    "    SELEC
5f40: 54 20 43 41 53 54 28 6c 70 2b 31 20 41 53 20 54  T CAST(lp+1 AS T
5f50: 45 58 54 29 2c 20 6c 70 2b 31 20 46 52 4f 4d 20  EXT), lp+1 FROM 
5f60: 64 69 67 69 74 73 20 57 48 45 52 45 20 6c 70 3c  digits WHERE lp<
5f70: 39 5c 6e 22 0a 20 20 20 20 22 20 20 29 2c 5c 6e  9\n".    "  ),\n
5f80: 22 0a 20 20 20 20 22 20 20 78 28 73 2c 20 69 6e  ".    "  x(s, in
5f90: 64 29 20 41 53 20 28 5c 6e 22 0a 20 20 20 20 22  d) AS (\n".    "
5fa0: 20 20 20 20 53 45 4c 45 43 54 20 73 75 64 2c 20      SELECT sud, 
5fb0: 69 6e 73 74 72 28 73 75 64 2c 20 27 2e 27 29 20  instr(sud, '.') 
5fc0: 46 52 4f 4d 20 69 6e 70 75 74 5c 6e 22 0a 20 20  FROM input\n".  
5fd0: 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c    "    UNION ALL
5fe0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c  \n".    "    SEL
5ff0: 45 43 54 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  ECT\n".    "    
6000: 20 20 73 75 62 73 74 72 28 73 2c 20 31 2c 20 69    substr(s, 1, i
6010: 6e 64 2d 31 29 20 7c 7c 20 7a 20 7c 7c 20 73 75  nd-1) || z || su
6020: 62 73 74 72 28 73 2c 20 69 6e 64 2b 31 29 2c 5c  bstr(s, ind+1),\
6030: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 69 6e  n".    "      in
6040: 73 74 72 28 20 73 75 62 73 74 72 28 73 2c 20 31  str( substr(s, 1
6050: 2c 20 69 6e 64 2d 31 29 20 7c 7c 20 7a 20 7c 7c  , ind-1) || z ||
6060: 20 73 75 62 73 74 72 28 73 2c 20 69 6e 64 2b 31   substr(s, ind+1
6070: 29 2c 20 27 2e 27 20 29 5c 6e 22 0a 20 20 20 20  ), '.' )\n".    
6080: 22 20 20 20 20 20 46 52 4f 4d 20 78 2c 20 64 69  "     FROM x, di
6090: 67 69 74 73 20 41 53 20 7a 5c 6e 22 0a 20 20 20  gits AS z\n".   
60a0: 20 22 20 20 20 20 57 48 45 52 45 20 69 6e 64 3e   "    WHERE ind>
60b0: 30 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  0\n".    "      
60c0: 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53 20 28  AND NOT EXISTS (
60d0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
60e0: 20 20 20 20 20 53 45 4c 45 43 54 20 31 5c 6e 22       SELECT 1\n"
60f0: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
6100: 20 20 20 20 46 52 4f 4d 20 64 69 67 69 74 73 20      FROM digits 
6110: 41 53 20 6c 70 5c 6e 22 0a 20 20 20 20 22 20 20  AS lp\n".    "  
6120: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
6130: 20 7a 2e 7a 20 3d 20 73 75 62 73 74 72 28 73 2c   z.z = substr(s,
6140: 20 28 28 69 6e 64 2d 31 29 2f 39 29 2a 39 20 2b   ((ind-1)/9)*9 +
6150: 20 6c 70 2c 20 31 29 5c 6e 22 0a 20 20 20 20 22   lp, 1)\n".    "
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 4f 52 20 7a 2e 7a 20 3d 20 73 75 62 73 74 72 28  OR z.z = substr(
6180: 73 2c 20 28 28 69 6e 64 2d 31 29 25 25 39 29 20  s, ((ind-1)%%9) 
6190: 2b 20 28 6c 70 2d 31 29 2a 39 20 2b 20 31 2c 20  + (lp-1)*9 + 1, 
61a0: 31 29 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20  1)\n".    "     
61b0: 20 20 20 20 20 20 20 20 20 20 20 4f 52 20 7a 2e             OR z.
61c0: 7a 20 3d 20 73 75 62 73 74 72 28 73 2c 20 28 28  z = substr(s, ((
61d0: 28 69 6e 64 2d 31 29 2f 33 29 20 25 25 20 33 29  (ind-1)/3) %% 3)
61e0: 20 2a 20 33 5c 6e 22 0a 20 20 20 20 22 20 20 20   * 3\n".    "   
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 2b 20 28 28 69 6e 64 2d 31 29 2f       + ((ind-1)/
6210: 32 37 29 20 2a 20 32 37 20 2b 20 6c 70 5c 6e 22  27) * 27 + lp\n"
6220: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
6240: 28 28 6c 70 2d 31 29 20 2f 20 33 29 20 2a 20 36  ((lp-1) / 3) * 6
6250: 2c 20 31 29 5c 6e 22 0a 20 20 20 20 22 20 20 20  , 1)\n".    "   
6260: 20 20 20 20 20 20 29 5c 6e 22 0a 20 20 20 20 22        )\n".    "
6270: 20 20 29 5c 6e 22 0a 20 20 20 20 22 53 45 4c 45    )\n".    "SELE
6280: 43 54 20 73 20 46 52 4f 4d 20 78 20 57 48 45 52  CT s FROM x WHER
6290: 45 20 69 6e 64 3d 30 3b 22 0a 20 20 29 3b 0a 20  E ind=0;".  );. 
62a0: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
62b0: 78 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 7a  xt(g.pStmt, 1, z
62c0: 50 75 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Puz, -1, SQLITE_
62d0: 53 54 41 54 49 43 29 3b 0a 20 20 73 70 65 65 64  STATIC);.  speed
62e0: 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 73  test1_run();.  s
62f0: 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65  peedtest1_end_te
6300: 73 74 28 29 3b 0a 0a 20 20 73 70 65 65 64 74 65  st();..  speedte
6310: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 32  st1_begin_test(2
6320: 30 30 2c 20 22 53 75 64 6f 6b 75 20 77 69 74 68  00, "Sudoku with
6330: 20 56 41 4c 55 45 53 20 27 64 69 67 69 74 73 27   VALUES 'digits'
6340: 22 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ");.  speedtest1
6350: 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20 22 57  _prepare(.    "W
6360: 49 54 48 20 52 45 43 55 52 53 49 56 45 5c 6e 22  ITH RECURSIVE\n"
6370: 0a 20 20 20 20 22 20 20 69 6e 70 75 74 28 73 75  .    "  input(su
6380: 64 29 20 41 53 20 28 56 41 4c 55 45 53 28 3f 31  d) AS (VALUES(?1
6390: 29 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 64 69  )),\n".    "  di
63a0: 67 69 74 73 28 7a 2c 6c 70 29 20 41 53 20 28 56  gits(z,lp) AS (V
63b0: 41 4c 55 45 53 28 27 31 27 2c 31 29 2c 28 27 32  ALUES('1',1),('2
63c0: 27 2c 32 29 2c 28 27 33 27 2c 33 29 2c 28 27 34  ',2),('3',3),('4
63d0: 27 2c 34 29 2c 28 27 35 27 2c 35 29 2c 5c 6e 22  ',4),('5',5),\n"
63e0: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 20  .    "          
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6400: 27 36 27 2c 36 29 2c 28 27 37 27 2c 37 29 2c 28  '6',6),('7',7),(
6410: 27 38 27 2c 38 29 2c 28 27 39 27 2c 39 29 29 2c  '8',8),('9',9)),
6420: 5c 6e 22 0a 20 20 20 20 22 20 20 78 28 73 2c 20  \n".    "  x(s, 
6430: 69 6e 64 29 20 41 53 20 28 5c 6e 22 0a 20 20 20  ind) AS (\n".   
6440: 20 22 20 20 20 20 53 45 4c 45 43 54 20 73 75 64   "    SELECT sud
6450: 2c 20 69 6e 73 74 72 28 73 75 64 2c 20 27 2e 27  , instr(sud, '.'
6460: 29 20 46 52 4f 4d 20 69 6e 70 75 74 5c 6e 22 0a  ) FROM input\n".
6470: 20 20 20 20 22 20 20 20 20 55 4e 49 4f 4e 20 41      "    UNION A
6480: 4c 4c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53  LL\n".    "    S
6490: 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 22 20 20  ELECT\n".    "  
64a0: 20 20 20 20 73 75 62 73 74 72 28 73 2c 20 31 2c      substr(s, 1,
64b0: 20 69 6e 64 2d 31 29 20 7c 7c 20 7a 20 7c 7c 20   ind-1) || z || 
64c0: 73 75 62 73 74 72 28 73 2c 20 69 6e 64 2b 31 29  substr(s, ind+1)
64d0: 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20  ,\n".    "      
64e0: 69 6e 73 74 72 28 20 73 75 62 73 74 72 28 73 2c  instr( substr(s,
64f0: 20 31 2c 20 69 6e 64 2d 31 29 20 7c 7c 20 7a 20   1, ind-1) || z 
6500: 7c 7c 20 73 75 62 73 74 72 28 73 2c 20 69 6e 64  || substr(s, ind
6510: 2b 31 29 2c 20 27 2e 27 20 29 5c 6e 22 0a 20 20  +1), '.' )\n".  
6520: 20 20 22 20 20 20 20 20 46 52 4f 4d 20 78 2c 20    "     FROM x, 
6530: 64 69 67 69 74 73 20 41 53 20 7a 5c 6e 22 0a 20  digits AS z\n". 
6540: 20 20 20 22 20 20 20 20 57 48 45 52 45 20 69 6e     "    WHERE in
6550: 64 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  d>0\n".    "    
6560: 20 20 41 4e 44 20 4e 4f 54 20 45 58 49 53 54 53    AND NOT EXISTS
6570: 20 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20   (\n".    "     
6580: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 31 5c         SELECT 1\
6590: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  n".    "        
65a0: 20 20 20 20 20 20 46 52 4f 4d 20 64 69 67 69 74        FROM digit
65b0: 73 20 41 53 20 6c 70 5c 6e 22 0a 20 20 20 20 22  s AS lp\n".    "
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
65d0: 52 45 20 7a 2e 7a 20 3d 20 73 75 62 73 74 72 28  RE z.z = substr(
65e0: 73 2c 20 28 28 69 6e 64 2d 31 29 2f 39 29 2a 39  s, ((ind-1)/9)*9
65f0: 20 2b 20 6c 70 2c 20 31 29 5c 6e 22 0a 20 20 20   + lp, 1)\n".   
6600: 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
6610: 20 20 4f 52 20 7a 2e 7a 20 3d 20 73 75 62 73 74    OR z.z = subst
6620: 72 28 73 2c 20 28 28 69 6e 64 2d 31 29 25 25 39  r(s, ((ind-1)%%9
6630: 29 20 2b 20 28 6c 70 2d 31 29 2a 39 20 2b 20 31  ) + (lp-1)*9 + 1
6640: 2c 20 31 29 5c 6e 22 0a 20 20 20 20 22 20 20 20  , 1)\n".    "   
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 52 20               OR 
6660: 7a 2e 7a 20 3d 20 73 75 62 73 74 72 28 73 2c 20  z.z = substr(s, 
6670: 28 28 28 69 6e 64 2d 31 29 2f 33 29 20 25 25 20  (((ind-1)/3) %% 
6680: 33 29 20 2a 20 33 5c 6e 22 0a 20 20 20 20 22 20  3) * 3\n".    " 
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 20 20 20 20 20 2b 20 28 28 69 6e 64 2d 31         + ((ind-1
66b0: 29 2f 32 37 29 20 2a 20 32 37 20 2b 20 6c 70 5c  )/27) * 27 + lp\
66c0: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  n".    "        
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 2b 20 28 28 6c 70 2d 31 29 20 2f 20 33 29 20 2a  + ((lp-1) / 3) *
66f0: 20 36 2c 20 31 29 5c 6e 22 0a 20 20 20 20 22 20   6, 1)\n".    " 
6700: 20 20 20 20 20 20 20 20 29 5c 6e 22 0a 20 20 20          )\n".   
6710: 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 53 45   "  )\n".    "SE
6720: 4c 45 43 54 20 73 20 46 52 4f 4d 20 78 20 57 48  LECT s FROM x WH
6730: 45 52 45 20 69 6e 64 3d 30 3b 22 0a 20 20 29 3b  ERE ind=0;".  );
6740: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6750: 74 65 78 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c  text(g.pStmt, 1,
6760: 20 7a 50 75 7a 2c 20 2d 31 2c 20 53 51 4c 49 54   zPuz, -1, SQLIT
6770: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 70 65  E_STATIC);.  spe
6780: 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a 20  edtest1_run();. 
6790: 20 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f   speedtest1_end_
67a0: 74 65 73 74 28 29 3b 0a 0a 20 20 72 53 70 61 63  test();..  rSpac
67b0: 69 6e 67 20 3d 20 35 2e 30 2f 67 2e 73 7a 54 65  ing = 5.0/g.szTe
67c0: 73 74 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  st;.  speedtest1
67d0: 5f 62 65 67 69 6e 5f 74 65 73 74 28 33 30 30 2c  _begin_test(300,
67e0: 20 22 4d 61 6e 64 65 6c 62 72 6f 74 20 53 65 74   "Mandelbrot Set
67f0: 20 77 69 74 68 20 73 70 61 63 69 6e 67 3d 25 66   with spacing=%f
6800: 22 2c 20 72 53 70 61 63 69 6e 67 29 3b 0a 20 20  ", rSpacing);.  
6810: 73 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61  speedtest1_prepa
6820: 72 65 28 0a 20 20 20 22 57 49 54 48 20 52 45 43  re(.   "WITH REC
6830: 55 52 53 49 56 45 20 5c 6e 22 0a 20 20 20 22 20  URSIVE \n".   " 
6840: 20 78 61 78 69 73 28 78 29 20 41 53 20 28 56 41   xaxis(x) AS (VA
6850: 4c 55 45 53 28 2d 32 2e 30 29 20 55 4e 49 4f 4e  LUES(-2.0) UNION
6860: 20 41 4c 4c 20 53 45 4c 45 43 54 20 78 2b 3f 31   ALL SELECT x+?1
6870: 20 46 52 4f 4d 20 78 61 78 69 73 20 57 48 45 52   FROM xaxis WHER
6880: 45 20 78 3c 31 2e 32 29 2c 5c 6e 22 0a 20 20 20  E x<1.2),\n".   
6890: 22 20 20 79 61 78 69 73 28 79 29 20 41 53 20 28  "  yaxis(y) AS (
68a0: 56 41 4c 55 45 53 28 2d 31 2e 30 29 20 55 4e 49  VALUES(-1.0) UNI
68b0: 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 79 2b  ON ALL SELECT y+
68c0: 3f 32 20 46 52 4f 4d 20 79 61 78 69 73 20 57 48  ?2 FROM yaxis WH
68d0: 45 52 45 20 79 3c 31 2e 30 29 2c 5c 6e 22 0a 20  ERE y<1.0),\n". 
68e0: 20 20 22 20 20 6d 28 69 74 65 72 2c 20 63 78 2c    "  m(iter, cx,
68f0: 20 63 79 2c 20 78 2c 20 79 29 20 41 53 20 28 5c   cy, x, y) AS (\
6900: 6e 22 0a 20 20 20 22 20 20 20 20 53 45 4c 45 43  n".   "    SELEC
6910: 54 20 30 2c 20 78 2c 20 79 2c 20 30 2e 30 2c 20  T 0, x, y, 0.0, 
6920: 30 2e 30 20 46 52 4f 4d 20 78 61 78 69 73 2c 20  0.0 FROM xaxis, 
6930: 79 61 78 69 73 5c 6e 22 0a 20 20 20 22 20 20 20  yaxis\n".   "   
6940: 20 55 4e 49 4f 4e 20 41 4c 4c 5c 6e 22 0a 20 20   UNION ALL\n".  
6950: 20 22 20 20 20 20 53 45 4c 45 43 54 20 69 74 65   "    SELECT ite
6960: 72 2b 31 2c 20 63 78 2c 20 63 79 2c 20 78 2a 78  r+1, cx, cy, x*x
6970: 2d 79 2a 79 20 2b 20 63 78 2c 20 32 2e 30 2a 78  -y*y + cx, 2.0*x
6980: 2a 79 20 2b 20 63 79 20 46 52 4f 4d 20 6d 20 5c  *y + cy FROM m \
6990: 6e 22 0a 20 20 20 22 20 20 20 20 20 57 48 45 52  n".   "     WHER
69a0: 45 20 28 78 2a 78 20 2b 20 79 2a 79 29 20 3c 20  E (x*x + y*y) < 
69b0: 34 2e 30 20 41 4e 44 20 69 74 65 72 3c 32 38 5c  4.0 AND iter<28\
69c0: 6e 22 0a 20 20 20 22 20 20 29 2c 5c 6e 22 0a 20  n".   "  ),\n". 
69d0: 20 20 22 20 20 6d 32 28 69 74 65 72 2c 20 63 78    "  m2(iter, cx
69e0: 2c 20 63 79 29 20 41 53 20 28 5c 6e 22 0a 20 20  , cy) AS (\n".  
69f0: 20 22 20 20 20 20 53 45 4c 45 43 54 20 6d 61 78   "    SELECT max
6a00: 28 69 74 65 72 29 2c 20 63 78 2c 20 63 79 20 46  (iter), cx, cy F
6a10: 52 4f 4d 20 6d 20 47 52 4f 55 50 20 42 59 20 63  ROM m GROUP BY c
6a20: 78 2c 20 63 79 5c 6e 22 0a 20 20 20 22 20 20 29  x, cy\n".   "  )
6a30: 2c 5c 6e 22 0a 20 20 20 22 20 20 61 28 74 29 20  ,\n".   "  a(t) 
6a40: 41 53 20 28 5c 6e 22 0a 20 20 20 22 20 20 20 20  AS (\n".   "    
6a50: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
6a60: 63 61 74 28 20 73 75 62 73 74 72 28 27 20 2e 2b  cat( substr(' .+
6a70: 2a 23 27 2c 20 31 2b 6d 69 6e 28 69 74 65 72 2f  *#', 1+min(iter/
6a80: 37 2c 34 29 2c 20 31 29 2c 20 27 27 29 20 5c 6e  7,4), 1), '') \n
6a90: 22 0a 20 20 20 22 20 20 20 20 46 52 4f 4d 20 6d  ".   "    FROM m
6aa0: 32 20 47 52 4f 55 50 20 42 59 20 63 79 5c 6e 22  2 GROUP BY cy\n"
6ab0: 0a 20 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 22  .   "  )\n".   "
6ac0: 53 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e  SELECT group_con
6ad0: 63 61 74 28 72 74 72 69 6d 28 74 29 2c 78 27 30  cat(rtrim(t),x'0
6ae0: 61 27 29 20 46 52 4f 4d 20 61 3b 22 0a 20 20 29  a') FROM a;".  )
6af0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
6b00: 5f 64 6f 75 62 6c 65 28 67 2e 70 53 74 6d 74 2c  _double(g.pStmt,
6b10: 20 31 2c 20 72 53 70 61 63 69 6e 67 2a 2e 30 35   1, rSpacing*.05
6b20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6b30: 64 5f 64 6f 75 62 6c 65 28 67 2e 70 53 74 6d 74  d_double(g.pStmt
6b40: 2c 20 32 2c 20 72 53 70 61 63 69 6e 67 29 3b 0a  , 2, rSpacing);.
6b50: 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e    speedtest1_run
6b60: 28 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  ();.  speedtest1
6b70: 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20  _end_test();..  
6b80: 6e 45 6c 65 6d 20 3d 20 31 30 30 30 30 2a 67 2e  nElem = 10000*g.
6b90: 73 7a 54 65 73 74 3b 0a 20 20 73 70 65 65 64 74  szTest;.  speedt
6ba0: 65 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28  est1_begin_test(
6bb0: 34 30 30 2c 20 22 45 58 43 45 50 54 20 6f 70 65  400, "EXCEPT ope
6bc0: 72 61 74 6f 72 20 6f 6e 20 25 64 2d 65 6c 65 6d  rator on %d-elem
6bd0: 65 6e 74 20 74 61 62 6c 65 73 22 2c 20 6e 45 6c  ent tables", nEl
6be0: 65 6d 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74  em);.  speedtest
6bf0: 31 5f 70 72 65 70 61 72 65 28 0a 20 20 20 20 22  1_prepare(.    "
6c00: 57 49 54 48 20 52 45 43 55 52 53 49 56 45 20 5c  WITH RECURSIVE \
6c10: 6e 22 0a 20 20 20 20 22 20 20 74 31 28 78 29 20  n".    "  t1(x) 
6c20: 41 53 20 28 56 41 4c 55 45 53 28 32 29 20 55 4e  AS (VALUES(2) UN
6c30: 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 78  ION ALL SELECT x
6c40: 2b 32 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  +2 FROM t1 WHERE
6c50: 20 78 3c 25 64 29 2c 5c 6e 22 0a 20 20 20 20 22   x<%d),\n".    "
6c60: 20 20 74 32 28 79 29 20 41 53 20 28 56 41 4c 55    t2(y) AS (VALU
6c70: 45 53 28 33 29 20 55 4e 49 4f 4e 20 41 4c 4c 20  ES(3) UNION ALL 
6c80: 53 45 4c 45 43 54 20 79 2b 33 20 46 52 4f 4d 20  SELECT y+3 FROM 
6c90: 74 32 20 57 48 45 52 45 20 79 3c 25 64 29 5c 6e  t2 WHERE y<%d)\n
6ca0: 22 0a 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f  ".    "SELECT co
6cb0: 75 6e 74 28 78 29 2c 20 61 76 67 28 78 29 20 46  unt(x), avg(x) F
6cc0: 52 4f 4d 20 28 5c 6e 22 0a 20 20 20 20 22 20 20  ROM (\n".    "  
6cd0: 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 31  SELECT x FROM t1
6ce0: 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 79   EXCEPT SELECT y
6cf0: 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
6d00: 59 20 31 5c 6e 22 0a 20 20 20 20 22 29 3b 22 2c  Y 1\n".    ");",
6d10: 0a 20 20 20 20 6e 45 6c 65 6d 2c 20 6e 45 6c 65  .    nElem, nEle
6d20: 6d 0a 20 20 29 3b 0a 20 20 73 70 65 65 64 74 65  m.  );.  speedte
6d30: 73 74 31 5f 72 75 6e 28 29 3b 0a 20 20 73 70 65  st1_run();.  spe
6d40: 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65 73 74  edtest1_end_test
6d50: 28 29 3b 0a 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ();..}../* Gener
6d60: 61 74 65 20 74 77 6f 20 6e 75 6d 62 65 72 73 20  ate two numbers 
6d70: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 6d 78  between 1 and mx
6d80: 2e 20 20 54 68 65 20 66 69 72 73 74 20 6e 75 6d  .  The first num
6d90: 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ber is less than
6da0: 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 2e 20  .** the second. 
6db0: 20 55 73 75 61 6c 6c 79 20 74 68 65 20 6e 75 6d   Usually the num
6dc0: 62 65 72 73 20 61 72 65 20 6e 65 61 72 20 65 61  bers are near ea
6dd0: 63 68 20 6f 74 68 65 72 20 62 75 74 20 63 61 6e  ch other but can
6de0: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 62 65   sometimes.** be
6df0: 20 66 61 72 20 61 70 61 72 74 2e 0a 2a 2f 0a 73   far apart..*/.s
6e00: 74 61 74 69 63 20 76 6f 69 64 20 74 77 6f 43 6f  tatic void twoCo
6e10: 6f 72 64 73 28 0a 20 20 69 6e 74 20 70 31 2c 20  ords(.  int p1, 
6e20: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
6e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
6e40: 61 6d 65 74 65 72 73 20 61 64 6a 75 73 74 69 6e  ameters adjustin
6e50: 67 20 73 69 7a 65 73 20 2a 2f 0a 20 20 75 6e 73  g sizes */.  uns
6e60: 69 67 6e 65 64 20 6d 78 2c 20 20 20 20 20 20 20  igned mx,       
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6e80: 2a 20 52 61 6e 67 65 20 6f 66 20 31 2e 2e 6d 78  * Range of 1..mx
6e90: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 2a   */.  unsigned *
6ea0: 70 58 30 2c 20 75 6e 73 69 67 6e 65 64 20 2a 70  pX0, unsigned *p
6eb0: 58 31 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  X1      /* OUT: 
6ec0: 77 72 69 74 65 20 72 65 73 75 6c 74 73 20 68 65  write results he
6ed0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  re */.){.  unsig
6ee0: 6e 65 64 20 64 2c 20 78 30 2c 20 78 31 2c 20 73  ned d, x0, x1, s
6ef0: 70 61 6e 3b 0a 0a 20 20 73 70 61 6e 20 3d 20 6d  pan;..  span = m
6f00: 78 2f 31 30 30 20 2b 20 31 3b 0a 20 20 69 66 28  x/100 + 1;.  if(
6f10: 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e 64   speedtest1_rand
6f20: 6f 6d 28 29 25 33 3d 3d 30 20 29 20 73 70 61 6e  om()%3==0 ) span
6f30: 20 2a 3d 20 70 31 3b 0a 20 20 69 66 28 20 73 70   *= p1;.  if( sp
6f40: 65 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28  eedtest1_random(
6f50: 29 25 70 32 3d 3d 30 20 29 20 73 70 61 6e 20 3d  )%p2==0 ) span =
6f60: 20 6d 78 2f 32 3b 0a 20 20 64 20 3d 20 73 70 65   mx/2;.  d = spe
6f70: 65 64 74 65 73 74 31 5f 72 61 6e 64 6f 6d 28 29  edtest1_random()
6f80: 25 73 70 61 6e 20 2b 20 31 3b 0a 20 20 78 30 20  %span + 1;.  x0 
6f90: 3d 20 73 70 65 65 64 74 65 73 74 31 5f 72 61 6e  = speedtest1_ran
6fa0: 64 6f 6d 28 29 25 28 6d 78 2d 64 29 20 2b 20 31  dom()%(mx-d) + 1
6fb0: 3b 0a 20 20 78 31 20 3d 20 78 30 20 2b 20 64 3b  ;.  x1 = x0 + d;
6fc0: 0a 20 20 2a 70 58 30 20 3d 20 78 30 3b 0a 20 20  .  *pX0 = x0;.  
6fd0: 2a 70 58 31 20 3d 20 78 31 3b 0a 7d 0a 0a 2f 2a  *pX1 = x1;.}../*
6fe0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
6ff0: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 52 2d 54  outine is an R-T
7000: 72 65 65 20 67 65 6f 6d 65 74 72 79 20 63 61 6c  ree geometry cal
7010: 6c 62 61 63 6b 2e 20 20 49 74 20 72 65 74 75 72  lback.  It retur
7020: 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  ns.** true if th
7030: 65 20 6f 62 6a 65 63 74 20 6f 76 65 72 6c 61 70  e object overlap
7040: 73 20 61 20 73 6c 69 63 65 20 6f 6e 20 74 68 65  s a slice on the
7050: 20 59 20 63 6f 6f 72 64 69 6e 61 74 65 20 62 65   Y coordinate be
7060: 74 77 65 65 6e 20 74 68 65 0a 2a 2a 20 74 77 6f  tween the.** two
7070: 20 76 61 6c 75 65 73 20 67 69 76 65 6e 20 61 73   values given as
7080: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 49 6e 20   arguments.  In 
7090: 6f 74 68 65 72 20 77 6f 72 64 73 0a 2a 2a 0a 2a  other words.**.*
70a0: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  *     SELECT cou
70b0: 6e 74 28 2a 29 20 46 52 4f 4d 20 72 74 31 20 57  nt(*) FROM rt1 W
70c0: 48 45 52 45 20 69 64 20 4d 41 54 43 48 20 78 73  HERE id MATCH xs
70d0: 6c 69 63 65 28 31 30 2c 32 30 29 3b 0a 2a 2a 0a  lice(10,20);.**.
70e0: 2a 2a 20 49 73 20 74 68 65 20 73 61 6d 65 20 61  ** Is the same a
70f0: 73 20 73 61 79 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  s saying:.**.** 
7100: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
7110: 28 2a 29 20 46 52 4f 4d 20 72 74 31 20 57 48 45  (*) FROM rt1 WHE
7120: 52 45 20 79 31 3e 3d 31 30 20 41 4e 44 20 79 30  RE y1>=10 AND y0
7130: 3c 3d 32 30 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  <=20;.*/.static 
7140: 69 6e 74 20 78 73 6c 69 63 65 47 65 6f 6d 65 74  int xsliceGeomet
7150: 72 79 43 61 6c 6c 62 61 63 6b 28 0a 20 20 73 71  ryCallback(.  sq
7160: 6c 69 74 65 33 5f 72 74 72 65 65 5f 67 65 6f 6d  lite3_rtree_geom
7170: 65 74 72 79 20 2a 70 2c 0a 20 20 69 6e 74 20 6e  etry *p,.  int n
7180: 43 6f 6f 72 64 2c 0a 20 20 64 6f 75 62 6c 65 20  Coord,.  double 
7190: 2a 61 43 6f 6f 72 64 2c 0a 20 20 69 6e 74 20 2a  *aCoord,.  int *
71a0: 70 52 65 73 0a 29 7b 0a 20 20 2a 70 52 65 73 20  pRes.){.  *pRes 
71b0: 3d 20 61 43 6f 6f 72 64 5b 33 5d 3e 3d 70 2d 3e  = aCoord[3]>=p->
71c0: 61 50 61 72 61 6d 5b 30 5d 20 26 26 20 61 43 6f  aParam[0] && aCo
71d0: 6f 72 64 5b 32 5d 3c 3d 70 2d 3e 61 50 61 72 61  ord[2]<=p->aPara
71e0: 6d 5b 31 5d 3b 0a 20 20 72 65 74 75 72 6e 20 53  m[1];.  return S
71f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
7200: 2a 2a 20 41 20 74 65 73 74 73 65 74 20 66 6f 72  ** A testset for
7210: 20 74 68 65 20 52 2d 54 72 65 65 20 76 69 72 74   the R-Tree virt
7220: 75 61 6c 20 74 61 62 6c 65 0a 2a 2f 0a 76 6f 69  ual table.*/.voi
7230: 64 20 74 65 73 74 73 65 74 5f 72 74 72 65 65 28  d testset_rtree(
7240: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
7250: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 2c 20 6e  .  unsigned i, n
7260: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 78 43  ;.  unsigned mxC
7270: 6f 6f 72 64 3b 0a 20 20 75 6e 73 69 67 6e 65 64  oord;.  unsigned
7280: 20 78 30 2c 20 78 31 2c 20 79 30 2c 20 79 31 2c   x0, x1, y0, y1,
7290: 20 7a 30 2c 20 7a 31 3b 0a 20 20 75 6e 73 69 67   z0, z1;.  unsig
72a0: 6e 65 64 20 69 53 74 65 70 3b 0a 20 20 69 6e 74  ned iStep;.  int
72b0: 20 2a 61 43 68 65 63 6b 20 3d 20 73 71 6c 69 74   *aCheck = sqlit
72c0: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
72d0: 66 28 69 6e 74 29 2a 67 2e 73 7a 54 65 73 74 2a  f(int)*g.szTest*
72e0: 31 30 30 20 29 3b 0a 0a 20 20 6d 78 43 6f 6f 72  100 );..  mxCoor
72f0: 64 20 3d 20 31 35 30 30 30 3b 0a 20 20 6e 20 3d  d = 15000;.  n =
7300: 20 67 2e 73 7a 54 65 73 74 2a 31 30 30 3b 0a 20   g.szTest*100;. 
7310: 20 73 70 65 65 64 74 65 73 74 31 5f 62 65 67 69   speedtest1_begi
7320: 6e 5f 74 65 73 74 28 31 30 30 2c 20 22 25 64 20  n_test(100, "%d 
7330: 49 4e 53 45 52 54 73 20 69 6e 74 6f 20 61 6e 20  INSERTs into an 
7340: 72 2d 74 72 65 65 22 2c 20 6e 29 3b 0a 20 20 73  r-tree", n);.  s
7350: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
7360: 42 45 47 49 4e 22 29 3b 0a 20 20 73 70 65 65 64  BEGIN");.  speed
7370: 74 65 73 74 31 5f 65 78 65 63 28 22 43 52 45 41  test1_exec("CREA
7380: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
7390: 20 72 74 31 20 55 53 49 4e 47 20 72 74 72 65 65   rt1 USING rtree
73a0: 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 31 2c  (id,x0,x1,y0,y1,
73b0: 7a 30 2c 7a 31 29 22 29 3b 0a 20 20 73 70 65 65  z0,z1)");.  spee
73c0: 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 22  dtest1_prepare("
73d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 74 31 28  INSERT INTO rt1(
73e0: 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 31 2c 7a  id,x0,x1,y0,y1,z
73f0: 30 2c 7a 31 29 22 0a 20 20 20 20 20 20 20 20 20  0,z1)".         
7400: 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41 4c              "VAL
7410: 55 45 53 28 3f 31 2c 3f 32 2c 3f 33 2c 3f 34 2c  UES(?1,?2,?3,?4,
7420: 3f 35 2c 3f 36 2c 3f 37 29 22 29 3b 0a 20 20 66  ?5,?6,?7)");.  f
7430: 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 2b  or(i=1; i<=n; i+
7440: 2b 29 7b 0a 20 20 20 20 74 77 6f 43 6f 6f 72 64  +){.    twoCoord
7450: 73 28 70 31 2c 20 70 32 2c 20 6d 78 43 6f 6f 72  s(p1, p2, mxCoor
7460: 64 2c 20 26 78 30 2c 20 26 78 31 29 3b 0a 20 20  d, &x0, &x1);.  
7470: 20 20 74 77 6f 43 6f 6f 72 64 73 28 70 31 2c 20    twoCoords(p1, 
7480: 70 32 2c 20 6d 78 43 6f 6f 72 64 2c 20 26 79 30  p2, mxCoord, &y0
7490: 2c 20 26 79 31 29 3b 0a 20 20 20 20 74 77 6f 43  , &y1);.    twoC
74a0: 6f 6f 72 64 73 28 70 31 2c 20 70 32 2c 20 6d 78  oords(p1, p2, mx
74b0: 43 6f 6f 72 64 2c 20 26 7a 30 2c 20 26 7a 31 29  Coord, &z0, &z1)
74c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
74d0: 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20  nd_int(g.pStmt, 
74e0: 31 2c 20 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, i);.    sqlit
74f0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
7500: 74 6d 74 2c 20 32 2c 20 78 30 29 3b 0a 20 20 20  tmt, 2, x0);.   
7510: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7520: 74 28 67 2e 70 53 74 6d 74 2c 20 33 2c 20 78 31  t(g.pStmt, 3, x1
7530: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
7540: 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c  ind_int(g.pStmt,
7550: 20 34 2c 20 79 30 29 3b 0a 20 20 20 20 73 71 6c   4, y0);.    sql
7560: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
7570: 70 53 74 6d 74 2c 20 35 2c 20 79 31 29 3b 0a 20  pStmt, 5, y1);. 
7580: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
7590: 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20 36 2c 20  int(g.pStmt, 6, 
75a0: 7a 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  z0);.    sqlite3
75b0: 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d  _bind_int(g.pStm
75c0: 74 2c 20 37 2c 20 7a 31 29 3b 0a 20 20 20 20 73  t, 7, z1);.    s
75d0: 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b  peedtest1_run();
75e0: 0a 20 20 7d 0a 20 20 73 70 65 65 64 74 65 73 74  .  }.  speedtest
75f0: 31 5f 65 78 65 63 28 22 43 4f 4d 4d 49 54 22 29  1_exec("COMMIT")
7600: 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65  ;.  speedtest1_e
7610: 6e 64 5f 74 65 73 74 28 29 3b 0a 0a 20 20 73 70  nd_test();..  sp
7620: 65 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74  eedtest1_begin_t
7630: 65 73 74 28 31 30 31 2c 20 22 43 6f 70 79 20 66  est(101, "Copy f
7640: 72 6f 6d 20 72 74 72 65 65 20 74 6f 20 61 20 72  rom rtree to a r
7650: 65 67 75 6c 61 72 20 74 61 62 6c 65 22 29 3b 0a  egular table");.
7660: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
7670: 63 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  c("CREATE TABLE 
7680: 74 31 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  t1(id INTEGER PR
7690: 49 4d 41 52 59 20 4b 45 59 2c 78 30 2c 78 31 2c  IMARY KEY,x0,x1,
76a0: 79 30 2c 79 31 2c 7a 30 2c 7a 31 29 22 29 3b 0a  y0,y1,z0,z1)");.
76b0: 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65    speedtest1_exe
76c0: 63 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  c("INSERT INTO t
76d0: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
76e0: 72 74 31 22 29 3b 0a 20 20 73 70 65 65 64 74 65  rt1");.  speedte
76f0: 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a  st1_end_test();.
7700: 0a 20 20 6e 20 3d 20 67 2e 73 7a 54 65 73 74 2a  .  n = g.szTest*
7710: 32 30 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  20;.  speedtest1
7720: 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 31 30 2c  _begin_test(110,
7730: 20 22 25 64 20 6f 6e 65 2d 64 69 6d 65 6e 73 69   "%d one-dimensi
7740: 6f 6e 61 6c 20 69 6e 74 65 72 73 65 63 74 20 73  onal intersect s
7750: 6c 69 63 65 20 71 75 65 72 69 65 73 22 2c 20 6e  lice queries", n
7760: 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f  );.  speedtest1_
7770: 70 72 65 70 61 72 65 28 22 53 45 4c 45 43 54 20  prepare("SELECT 
7780: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 72 74  count(*) FROM rt
7790: 31 20 57 48 45 52 45 20 78 30 3e 3d 3f 31 20 41  1 WHERE x0>=?1 A
77a0: 4e 44 20 78 31 3c 3d 3f 32 22 29 3b 0a 20 20 69  ND x1<=?2");.  i
77b0: 53 74 65 70 20 3d 20 6d 78 43 6f 6f 72 64 2f 6e  Step = mxCoord/n
77c0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
77d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
77e0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70  te3_bind_int(g.p
77f0: 53 74 6d 74 2c 20 31 2c 20 69 2a 69 53 74 65 70  Stmt, 1, i*iStep
7800: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
7810: 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c  ind_int(g.pStmt,
7820: 20 32 2c 20 28 69 2b 31 29 2a 69 53 74 65 70 29   2, (i+1)*iStep)
7830: 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  ;.    speedtest1
7840: 5f 72 75 6e 28 29 3b 0a 20 20 20 20 61 43 68 65  _run();.    aChe
7850: 63 6b 5b 69 5d 20 3d 20 61 74 6f 69 28 67 2e 7a  ck[i] = atoi(g.z
7860: 52 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 73  Result);.  }.  s
7870: 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74 65  peedtest1_end_te
7880: 73 74 28 29 3b 0a 0a 20 20 69 66 28 20 67 2e 62  st();..  if( g.b
7890: 56 65 72 69 66 79 20 29 7b 0a 20 20 20 20 6e 20  Verify ){.    n 
78a0: 3d 20 67 2e 73 7a 54 65 73 74 2a 32 30 3b 0a 20  = g.szTest*20;. 
78b0: 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 62 65     speedtest1_be
78c0: 67 69 6e 5f 74 65 73 74 28 31 31 31 2c 20 22 56  gin_test(111, "V
78d0: 65 72 69 66 79 20 72 65 73 75 6c 74 20 66 72 6f  erify result fro
78e0: 6d 20 31 2d 44 20 69 6e 74 65 72 73 65 63 74 20  m 1-D intersect 
78f0: 73 6c 69 63 65 20 71 75 65 72 69 65 73 22 29 3b  slice queries");
7900: 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f  .    speedtest1_
7910: 70 72 65 70 61 72 65 28 22 53 45 4c 45 43 54 20  prepare("SELECT 
7920: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
7930: 20 57 48 45 52 45 20 78 30 3e 3d 3f 31 20 41 4e   WHERE x0>=?1 AN
7940: 44 20 78 31 3c 3d 3f 32 22 29 3b 0a 20 20 20 20  D x1<=?2");.    
7950: 69 53 74 65 70 20 3d 20 6d 78 43 6f 6f 72 64 2f  iStep = mxCoord/
7960: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
7970: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
7980: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7990: 74 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 69 2a  t(g.pStmt, 1, i*
79a0: 69 53 74 65 70 29 3b 0a 20 20 20 20 20 20 73 71  iStep);.      sq
79b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67  lite3_bind_int(g
79c0: 2e 70 53 74 6d 74 2c 20 32 2c 20 28 69 2b 31 29  .pStmt, 2, (i+1)
79d0: 2a 69 53 74 65 70 29 3b 0a 20 20 20 20 20 20 73  *iStep);.      s
79e0: 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b  peedtest1_run();
79f0: 0a 20 20 20 20 20 20 69 66 28 20 61 43 68 65 63  .      if( aChec
7a00: 6b 5b 69 5d 21 3d 61 74 6f 69 28 67 2e 7a 52 65  k[i]!=atoi(g.zRe
7a10: 73 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  sult) ){.       
7a20: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 43 6f   fatal_error("Co
7a30: 75 6e 74 20 64 69 73 61 67 72 65 65 20 73 74 65  unt disagree ste
7a40: 70 20 25 64 3a 20 25 64 2e 2e 25 64 2e 20 20 25  p %d: %d..%d.  %
7a50: 64 20 76 73 20 25 64 22 2c 0a 20 20 20 20 20 20  d vs %d",.      
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c                i,
7a70: 20 69 2a 69 53 74 65 70 2c 20 28 69 2b 31 29 2a   i*iStep, (i+1)*
7a80: 69 53 74 65 70 2c 20 61 43 68 65 63 6b 5b 69 5d  iStep, aCheck[i]
7a90: 2c 20 61 74 6f 69 28 67 2e 7a 52 65 73 75 6c 74  , atoi(g.zResult
7aa0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
7ab0: 7d 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31  }.    speedtest1
7ac0: 5f 65 6e 64 5f 74 65 73 74 28 29 3b 0a 20 20 7d  _end_test();.  }
7ad0: 0a 20 20 0a 20 20 6e 20 3d 20 67 2e 73 7a 54 65  .  .  n = g.szTe
7ae0: 73 74 2a 32 30 3b 0a 20 20 73 70 65 65 64 74 65  st*20;.  speedte
7af0: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31  st1_begin_test(1
7b00: 32 30 2c 20 22 25 64 20 6f 6e 65 2d 64 69 6d 65  20, "%d one-dime
7b10: 6e 73 69 6f 6e 61 6c 20 6f 76 65 72 6c 61 70 20  nsional overlap 
7b20: 73 6c 69 63 65 20 71 75 65 72 69 65 73 22 2c 20  slice queries", 
7b30: 6e 29 3b 0a 20 20 73 70 65 65 64 74 65 73 74 31  n);.  speedtest1
7b40: 5f 70 72 65 70 61 72 65 28 22 53 45 4c 45 43 54  _prepare("SELECT
7b50: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 72   count(*) FROM r
7b60: 74 31 20 57 48 45 52 45 20 79 31 3e 3d 3f 31 20  t1 WHERE y1>=?1 
7b70: 41 4e 44 20 79 30 3c 3d 3f 32 22 29 3b 0a 20 20  AND y0<=?2");.  
7b80: 69 53 74 65 70 20 3d 20 6d 78 43 6f 6f 72 64 2f  iStep = mxCoord/
7b90: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
7ba0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  n; i++){.    sql
7bb0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
7bc0: 70 53 74 6d 74 2c 20 31 2c 20 69 2a 69 53 74 65  pStmt, 1, i*iSte
7bd0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
7be0: 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74  bind_int(g.pStmt
7bf0: 2c 20 32 2c 20 28 69 2b 31 29 2a 69 53 74 65 70  , 2, (i+1)*iStep
7c00: 29 3b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74  );.    speedtest
7c10: 31 5f 72 75 6e 28 29 3b 0a 20 20 20 20 61 43 68  1_run();.    aCh
7c20: 65 63 6b 5b 69 5d 20 3d 20 61 74 6f 69 28 67 2e  eck[i] = atoi(g.
7c30: 7a 52 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20 20  zResult);.  }.  
7c40: 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74  speedtest1_end_t
7c50: 65 73 74 28 29 3b 0a 0a 20 20 69 66 28 20 67 2e  est();..  if( g.
7c60: 62 56 65 72 69 66 79 20 29 7b 0a 20 20 20 20 6e  bVerify ){.    n
7c70: 20 3d 20 67 2e 73 7a 54 65 73 74 2a 32 30 3b 0a   = g.szTest*20;.
7c80: 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 62      speedtest1_b
7c90: 65 67 69 6e 5f 74 65 73 74 28 31 32 31 2c 20 22  egin_test(121, "
7ca0: 56 65 72 69 66 79 20 72 65 73 75 6c 74 20 66 72  Verify result fr
7cb0: 6f 6d 20 31 2d 44 20 6f 76 65 72 6c 61 70 20 73  om 1-D overlap s
7cc0: 6c 69 63 65 20 71 75 65 72 69 65 73 22 29 3b 0a  lice queries");.
7cd0: 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 70      speedtest1_p
7ce0: 72 65 70 61 72 65 28 22 53 45 4c 45 43 54 20 63  repare("SELECT c
7cf0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
7d00: 57 48 45 52 45 20 79 31 3e 3d 3f 31 20 41 4e 44  WHERE y1>=?1 AND
7d10: 20 79 30 3c 3d 3f 32 22 29 3b 0a 20 20 20 20 69   y0<=?2");.    i
7d20: 53 74 65 70 20 3d 20 6d 78 43 6f 6f 72 64 2f 6e  Step = mxCoord/n
7d30: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
7d40: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
7d50: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
7d60: 28 67 2e 70 53 74 6d 74 2c 20 31 2c 20 69 2a 69  (g.pStmt, 1, i*i
7d70: 53 74 65 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Step);.      sql
7d80: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
7d90: 70 53 74 6d 74 2c 20 32 2c 20 28 69 2b 31 29 2a  pStmt, 2, (i+1)*
7da0: 69 53 74 65 70 29 3b 0a 20 20 20 20 20 20 73 70  iStep);.      sp
7db0: 65 65 64 74 65 73 74 31 5f 72 75 6e 28 29 3b 0a  eedtest1_run();.
7dc0: 20 20 20 20 20 20 69 66 28 20 61 43 68 65 63 6b        if( aCheck
7dd0: 5b 69 5d 21 3d 61 74 6f 69 28 67 2e 7a 52 65 73  [i]!=atoi(g.zRes
7de0: 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ult) ){.        
7df0: 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 43 6f 75  fatal_error("Cou
7e00: 6e 74 20 64 69 73 61 67 72 65 65 20 73 74 65 70  nt disagree step
7e10: 20 25 64 3a 20 25 64 2e 2e 25 64 2e 20 20 25 64   %d: %d..%d.  %d
7e20: 20 76 73 20 25 64 22 2c 0a 20 20 20 20 20 20 20   vs %d",.       
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20               i, 
7e40: 69 2a 69 53 74 65 70 2c 20 28 69 2b 31 29 2a 69  i*iStep, (i+1)*i
7e50: 53 74 65 70 2c 20 61 43 68 65 63 6b 5b 69 5d 2c  Step, aCheck[i],
7e60: 20 61 74 6f 69 28 67 2e 7a 52 65 73 75 6c 74 29   atoi(g.zResult)
7e70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7e80: 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f  .    speedtest1_
7e90: 65 6e 64 5f 74 65 73 74 28 29 3b 0a 20 20 7d 0a  end_test();.  }.
7ea0: 20 20 0a 0a 20 20 6e 20 3d 20 67 2e 73 7a 54 65    ..  n = g.szTe
7eb0: 73 74 2a 32 30 3b 0a 20 20 73 70 65 65 64 74 65  st*20;.  speedte
7ec0: 73 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31  st1_begin_test(1
7ed0: 32 35 2c 20 22 25 64 20 63 75 73 74 6f 6d 20 67  25, "%d custom g
7ee0: 65 6f 6d 65 74 72 79 20 63 61 6c 6c 62 61 63 6b  eometry callback
7ef0: 20 71 75 65 72 69 65 73 22 2c 20 6e 29 3b 0a 20   queries", n);. 
7f00: 20 73 71 6c 69 74 65 33 5f 72 74 72 65 65 5f 67   sqlite3_rtree_g
7f10: 65 6f 6d 65 74 72 79 5f 63 61 6c 6c 62 61 63 6b  eometry_callback
7f20: 28 67 2e 64 62 2c 20 22 78 73 6c 69 63 65 22 2c  (g.db, "xslice",
7f30: 20 78 73 6c 69 63 65 47 65 6f 6d 65 74 72 79 43   xsliceGeometryC
7f40: 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 73  allback, 0);.  s
7f50: 70 65 65 64 74 65 73 74 31 5f 70 72 65 70 61 72  peedtest1_prepar
7f60: 65 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  e("SELECT count(
7f70: 2a 29 20 46 52 4f 4d 20 72 74 31 20 57 48 45 52  *) FROM rt1 WHER
7f80: 45 20 69 64 20 4d 41 54 43 48 20 78 73 6c 69 63  E id MATCH xslic
7f90: 65 28 3f 31 2c 3f 32 29 22 29 3b 0a 20 20 69 53  e(?1,?2)");.  iS
7fa0: 74 65 70 20 3d 20 6d 78 43 6f 6f 72 64 2f 6e 3b  tep = mxCoord/n;
7fb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
7fc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
7fd0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e 70 53  e3_bind_int(g.pS
7fe0: 74 6d 74 2c 20 31 2c 20 69 2a 69 53 74 65 70 29  tmt, 1, i*iStep)
7ff0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ;.    sqlite3_bi
8000: 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c 20  nd_int(g.pStmt, 
8010: 32 2c 20 28 69 2b 31 29 2a 69 53 74 65 70 29 3b  2, (i+1)*iStep);
8020: 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f  .    speedtest1_
8030: 72 75 6e 28 29 3b 0a 20 20 20 20 69 66 28 20 61  run();.    if( a
8040: 43 68 65 63 6b 5b 69 5d 21 3d 61 74 6f 69 28 67  Check[i]!=atoi(g
8050: 2e 7a 52 65 73 75 6c 74 29 20 29 7b 0a 20 20 20  .zResult) ){.   
8060: 20 20 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22     fatal_error("
8070: 43 6f 75 6e 74 20 64 69 73 61 67 72 65 65 20 73  Count disagree s
8080: 74 65 70 20 25 64 3a 20 25 64 2e 2e 25 64 2e 20  tep %d: %d..%d. 
8090: 20 25 64 20 76 73 20 25 64 22 2c 0a 20 20 20 20   %d vs %d",.    
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c                i,
80b0: 20 69 2a 69 53 74 65 70 2c 20 28 69 2b 31 29 2a   i*iStep, (i+1)*
80c0: 69 53 74 65 70 2c 20 61 43 68 65 63 6b 5b 69 5d  iStep, aCheck[i]
80d0: 2c 20 61 74 6f 69 28 67 2e 7a 52 65 73 75 6c 74  , atoi(g.zResult
80e0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
80f0: 73 70 65 65 64 74 65 73 74 31 5f 65 6e 64 5f 74  speedtest1_end_t
8100: 65 73 74 28 29 3b 0a 0a 20 20 6e 20 3d 20 67 2e  est();..  n = g.
8110: 73 7a 54 65 73 74 2a 38 30 3b 0a 20 20 73 70 65  szTest*80;.  spe
8120: 65 64 74 65 73 74 31 5f 62 65 67 69 6e 5f 74 65  edtest1_begin_te
8130: 73 74 28 31 33 30 2c 20 22 25 64 20 74 68 72 65  st(130, "%d thre
8140: 65 2d 64 69 6d 65 6e 73 69 6f 6e 61 6c 20 69 6e  e-dimensional in
8150: 74 65 72 73 65 63 74 20 62 6f 78 20 71 75 65 72  tersect box quer
8160: 69 65 73 22 2c 20 6e 29 3b 0a 20 20 73 70 65 65  ies", n);.  spee
8170: 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28 22  dtest1_prepare("
8180: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
8190: 46 52 4f 4d 20 72 74 31 20 57 48 45 52 45 20 78  FROM rt1 WHERE x
81a0: 31 3e 3d 3f 31 20 41 4e 44 20 78 30 3c 3d 3f 32  1>=?1 AND x0<=?2
81b0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
81c0: 20 20 20 20 20 20 20 22 20 41 4e 44 20 79 31 3e         " AND y1>
81d0: 3d 3f 31 20 41 4e 44 20 79 30 3c 3d 3f 32 20 41  =?1 AND y0<=?2 A
81e0: 4e 44 20 7a 31 3e 3d 3f 31 20 41 4e 44 20 7a 30  ND z1>=?1 AND z0
81f0: 3c 3d 3f 32 22 29 3b 0a 20 20 69 53 74 65 70 20  <=?2");.  iStep 
8200: 3d 20 6d 78 43 6f 6f 72 64 2f 6e 3b 0a 20 20 66  = mxCoord/n;.  f
8210: 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
8220: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
8230: 69 6e 64 5f 69 6e 74 28 67 2e 70 53 74 6d 74 2c  ind_int(g.pStmt,
8240: 20 31 2c 20 69 2a 69 53 74 65 70 29 3b 0a 20 20   1, i*iStep);.  
8250: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
8260: 6e 74 28 67 2e 70 53 74 6d 74 2c 20 32 2c 20 28  nt(g.pStmt, 2, (
8270: 69 2b 31 29 2a 69 53 74 65 70 29 3b 0a 20 20 20  i+1)*iStep);.   
8280: 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e 28   speedtest1_run(
8290: 29 3b 0a 20 20 20 20 61 43 68 65 63 6b 5b 69 5d  );.    aCheck[i]
82a0: 20 3d 20 61 74 6f 69 28 67 2e 7a 52 65 73 75 6c   = atoi(g.zResul
82b0: 74 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64 74  t);.  }.  speedt
82c0: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
82d0: 0a 0a 20 20 6e 20 3d 20 67 2e 73 7a 54 65 73 74  ..  n = g.szTest
82e0: 2a 31 30 30 3b 0a 20 20 73 70 65 65 64 74 65 73  *100;.  speedtes
82f0: 74 31 5f 62 65 67 69 6e 5f 74 65 73 74 28 31 34  t1_begin_test(14
8300: 30 2c 20 22 25 64 20 72 6f 77 69 64 20 71 75 65  0, "%d rowid que
8310: 72 69 65 73 22 2c 20 6e 29 3b 0a 20 20 73 70 65  ries", n);.  spe
8320: 65 64 74 65 73 74 31 5f 70 72 65 70 61 72 65 28  edtest1_prepare(
8330: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72  "SELECT * FROM r
8340: 74 31 20 57 48 45 52 45 20 69 64 3d 3f 31 22 29  t1 WHERE id=?1")
8350: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
8360: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  n; i++){.    sql
8370: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 67 2e  ite3_bind_int(g.
8380: 70 53 74 6d 74 2c 20 31 2c 20 69 29 3b 0a 20 20  pStmt, 1, i);.  
8390: 20 20 73 70 65 65 64 74 65 73 74 31 5f 72 75 6e    speedtest1_run
83a0: 28 29 3b 0a 20 20 7d 0a 20 20 73 70 65 65 64 74  ();.  }.  speedt
83b0: 65 73 74 31 5f 65 6e 64 5f 74 65 73 74 28 29 3b  est1_end_test();
83c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 65 73 74  .}../*.** A test
83d0: 73 65 74 20 75 73 65 64 20 66 6f 72 20 64 65 62  set used for deb
83e0: 75 67 67 69 6e 67 20 73 70 65 65 64 74 65 73 74  ugging speedtest
83f0: 31 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  1 itself..*/.voi
8400: 64 20 74 65 73 74 73 65 74 5f 64 65 62 75 67 31  d testset_debug1
8410: 28 76 6f 69 64 29 7b 0a 20 20 75 6e 73 69 67 6e  (void){.  unsign
8420: 65 64 20 69 2c 20 6e 3b 0a 20 20 75 6e 73 69 67  ed i, n;.  unsig
8430: 6e 65 64 20 78 31 2c 20 78 32 3b 0a 20 20 63 68  ned x1, x2;.  ch
8440: 61 72 20 7a 4e 75 6d 5b 32 30 30 30 5d 3b 20 20  ar zNum[2000];  
8450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8460: 20 6e 75 6d 62 65 72 20 6e 61 6d 65 20 2a 2f 0a   number name */.
8470: 0a 20 20 6e 20 3d 20 67 2e 73 7a 54 65 73 74 3b  .  n = g.szTest;
8480: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e  .  for(i=1; i<=n
8490: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 78 31 20 3d  ; i++){.    x1 =
84a0: 20 73 77 69 7a 7a 6c 65 28 69 2c 20 6e 29 3b 0a   swizzle(i, n);.
84b0: 20 20 20 20 78 32 20 3d 20 73 77 69 7a 7a 6c 65      x2 = swizzle
84c0: 28 78 31 2c 20 6e 29 3b 0a 20 20 20 20 73 70 65  (x1, n);.    spe
84d0: 65 64 74 65 73 74 31 5f 6e 75 6d 62 65 72 6e 61  edtest1_numberna
84e0: 6d 65 28 78 31 2c 20 7a 4e 75 6d 2c 20 73 69 7a  me(x1, zNum, siz
84f0: 65 6f 66 28 7a 4e 75 6d 29 29 3b 0a 20 20 20 20  eof(zNum));.    
8500: 70 72 69 6e 74 66 28 22 25 35 64 20 25 35 64 20  printf("%5d %5d 
8510: 25 35 64 20 25 73 5c 6e 22 2c 20 69 2c 20 78 31  %5d %s\n", i, x1
8520: 2c 20 78 32 2c 20 7a 4e 75 6d 29 3b 0a 20 20 7d  , x2, zNum);.  }
8530: 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74  .}..int main(int
8540: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
8550: 67 76 29 7b 0a 20 20 69 6e 74 20 64 6f 41 75 74  gv){.  int doAut
8560: 6f 76 61 63 20 3d 20 30 3b 20 20 20 20 20 20 20  ovac = 0;       
8570: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
8580: 20 2d 2d 61 75 74 6f 76 61 63 75 75 6d 20 2a 2f   --autovacuum */
8590: 0a 20 20 69 6e 74 20 63 61 63 68 65 53 69 7a 65  .  int cacheSize
85a0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
85b0: 20 2f 2a 20 44 65 73 69 72 65 64 20 63 61 63 68   /* Desired cach
85c0: 65 20 73 69 7a 65 2e 20 20 30 20 6d 65 61 6e 73  e size.  0 means
85d0: 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 69 6e   default */.  in
85e0: 74 20 64 6f 45 78 63 6c 75 73 69 76 65 20 3d 20  t doExclusive = 
85f0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  0;          /* T
8600: 72 75 65 20 66 6f 72 20 2d 2d 65 78 63 6c 75 73  rue for --exclus
8610: 69 76 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 65  ive */.  int nHe
8620: 61 70 20 3d 20 30 2c 20 6d 6e 48 65 61 70 20 3d  ap = 0, mnHeap =
8630: 20 30 3b 20 20 20 20 2f 2a 20 48 65 61 70 20 73   0;    /* Heap s
8640: 69 7a 65 20 66 72 6f 6d 20 2d 2d 68 65 61 70 20  ize from --heap 
8650: 2a 2f 0a 20 20 69 6e 74 20 64 6f 49 6e 63 72 76  */.  int doIncrv
8660: 61 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ac = 0;         
8670: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 2d     /* True for -
8680: 2d 69 6e 63 72 76 61 63 75 75 6d 20 2a 2f 0a 20  -incrvacuum */. 
8690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 4d   const char *zJM
86a0: 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ode = 0;       /
86b0: 2a 20 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 2a  * Journal mode *
86c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
86d0: 7a 4b 65 79 20 3d 20 30 3b 20 20 20 20 20 20 20  zKey = 0;       
86e0: 20 20 2f 2a 20 45 6e 63 72 79 70 74 69 6f 6e 20    /* Encryption 
86f0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  key */.  int nLo
8700: 6f 6b 20 3d 20 30 2c 20 73 7a 4c 6f 6f 6b 20 3d  ok = 0, szLook =
8710: 20 30 3b 20 20 20 20 2f 2a 20 2d 2d 6c 6f 6f 6b   0;    /* --look
8720: 61 73 69 64 65 20 63 6f 6e 66 69 67 75 72 61 74  aside configurat
8730: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53  ion */.  int noS
8740: 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
8750: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
8760: 6f 72 20 2d 2d 6e 6f 73 79 6e 63 20 2a 2f 0a 20  or --nosync */. 
8770: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 20 3d 20   int pageSize = 
8780: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
8790: 2a 20 44 65 73 69 72 65 64 20 70 61 67 65 20 73  * Desired page s
87a0: 69 7a 65 2e 20 20 30 20 6d 65 61 6e 73 20 64 65  ize.  0 means de
87b0: 66 61 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  fault */.  int n
87c0: 50 43 61 63 68 65 20 3d 20 30 2c 20 73 7a 50 43  PCache = 0, szPC
87d0: 61 63 68 65 20 3d 20 30 3b 2f 2a 20 2d 2d 70 63  ache = 0;/* --pc
87e0: 61 63 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69  ache configurati
87f0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 63 72  on */.  int nScr
8800: 61 74 63 68 20 3d 20 30 2c 20 73 7a 53 63 72 61  atch = 0, szScra
8810: 74 63 68 3d 30 3b 2f 2a 20 2d 2d 73 63 72 61 74  tch=0;/* --scrat
8820: 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ch configuration
8830: 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 53 74   */.  int showSt
8840: 61 74 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ats = 0;        
8850: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
8860: 2d 2d 73 74 61 74 73 20 2a 2f 0a 20 20 69 6e 74  --stats */.  int
8870: 20 6e 54 68 72 65 61 64 20 3d 20 30 3b 20 20 20   nThread = 0;   
8880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d             /* --
8890: 74 68 72 65 61 64 73 20 76 61 6c 75 65 20 2a 2f  threads value */
88a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
88b0: 54 53 65 74 20 3d 20 22 6d 61 69 6e 22 3b 20 20  TSet = "main";  
88c0: 20 2f 2a 20 57 68 69 63 68 20 2d 2d 74 65 73 74   /* Which --test
88d0: 73 65 74 20 74 6f 72 75 6e 20 2a 2f 0a 20 20 69  set torun */.  i
88e0: 6e 74 20 64 6f 54 72 61 63 65 20 3d 20 30 3b 20  nt doTrace = 0; 
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8900: 54 72 75 65 20 66 6f 72 20 2d 2d 74 72 61 63 65  True for --trace
8910: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8920: 20 2a 7a 45 6e 63 6f 64 69 6e 67 20 3d 20 30 3b   *zEncoding = 0;
8930: 20 20 20 20 2f 2a 20 2d 2d 75 74 66 31 36 62 65      /* --utf16be
8940: 20 6f 72 20 2d 2d 75 74 66 31 36 6c 65 20 2a 2f   or --utf16le */
8950: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8960: 44 62 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  DbName = 0;     
8970: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
8980: 74 65 73 74 20 64 61 74 61 62 61 73 65 20 2a 2f  test database */
8990: 0a 0a 20 20 76 6f 69 64 20 2a 70 48 65 61 70 20  ..  void *pHeap 
89a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
89b0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 68    /* Allocated h
89c0: 65 61 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 76  eap space */.  v
89d0: 6f 69 64 20 2a 70 4c 6f 6f 6b 20 3d 20 30 3b 20  oid *pLook = 0; 
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89f0: 41 6c 6c 6f 63 61 74 65 64 20 6c 6f 6f 6b 61 73  Allocated lookas
8a00: 69 64 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 76  ide space */.  v
8a10: 6f 69 64 20 2a 70 50 43 61 63 68 65 20 3d 20 30  oid *pPCache = 0
8a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8a30: 41 6c 6c 6f 63 61 74 65 64 20 73 74 6f 72 61 67  Allocated storag
8a40: 65 20 66 6f 72 20 70 63 61 63 68 65 20 2a 2f 0a  e for pcache */.
8a50: 20 20 76 6f 69 64 20 2a 70 53 63 72 61 74 63 68    void *pScratch
8a60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
8a70: 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 74 6f  /* Allocated sto
8a80: 72 61 67 65 20 66 6f 72 20 73 63 72 61 74 63 68  rage for scratch
8a90: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20   */.  int iCur, 
8aa0: 69 48 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  iHi;            
8ab0: 20 20 20 20 2f 2a 20 53 74 61 74 73 20 76 61 6c      /* Stats val
8ac0: 75 65 73 2c 20 63 75 72 72 65 6e 74 20 61 6e 64  ues, current and
8ad0: 20 22 68 69 67 68 77 61 74 65 72 22 20 2a 2f 0a   "highwater" */.
8ae0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8b10: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 2f 2a 20 41 50 49 20 72 65 74 75 72 6e     /* API return
8b40: 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 50   code */..  /* P
8b50: 72 6f 63 65 73 73 20 63 6f 6d 6d 61 6e 64 2d 6c  rocess command-l
8b60: 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ine arguments */
8b70: 0a 20 20 67 2e 7a 57 52 20 3d 20 22 22 3b 0a 20  .  g.zWR = "";. 
8b80: 20 67 2e 7a 4e 4e 20 3d 20 22 22 3b 0a 20 20 67   g.zNN = "";.  g
8b90: 2e 7a 50 4b 20 3d 20 22 55 4e 49 51 55 45 22 3b  .zPK = "UNIQUE";
8ba0: 0a 20 20 67 2e 73 7a 54 65 73 74 20 3d 20 31 30  .  g.szTest = 10
8bb0: 30 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  0;.  for(i=1; i<
8bc0: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
8bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
8be0: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
8bf0: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
8c00: 20 20 20 20 64 6f 7b 20 7a 2b 2b 3b 20 7d 77 68      do{ z++; }wh
8c10: 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29  ile( z[0]=='-' )
8c20: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
8c30: 6d 70 28 7a 2c 22 61 75 74 6f 76 61 63 75 75 6d  mp(z,"autovacuum
8c40: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
8c50: 20 64 6f 41 75 74 6f 76 61 63 20 3d 20 31 3b 0a   doAutovac = 1;.
8c60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8c70: 73 74 72 63 6d 70 28 7a 2c 22 63 61 63 68 65 73  strcmp(z,"caches
8c80: 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
8c90: 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d      if( i>=argc-
8ca0: 31 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28  1 ) fatal_error(
8cb0: 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  "missing argumen
8cc0: 74 20 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76  t on %s\n", argv
8cd0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 2b  [i]);.        i+
8ce0: 2b 3b 0a 20 20 20 20 20 20 20 20 63 61 63 68 65  +;.        cache
8cf0: 53 69 7a 65 20 3d 20 69 6e 74 65 67 65 72 56 61  Size = integerVa
8d00: 6c 75 65 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  lue(argv[i]);.  
8d10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
8d20: 72 63 6d 70 28 7a 2c 22 65 78 63 6c 75 73 69 76  rcmp(z,"exclusiv
8d30: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
8d40: 20 20 64 6f 45 78 63 6c 75 73 69 76 65 20 3d 20    doExclusive = 
8d50: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
8d60: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 65 78 70  f( strcmp(z,"exp
8d70: 6c 61 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lain")==0 ){.   
8d80: 20 20 20 20 20 67 2e 62 53 71 6c 4f 6e 6c 79 20       g.bSqlOnly 
8d90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 2e 62  = 1;.        g.b
8da0: 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20  Explain = 1;.   
8db0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8dc0: 63 6d 70 28 7a 2c 22 68 65 61 70 22 29 3d 3d 30  cmp(z,"heap")==0
8dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
8de0: 69 3e 3d 61 72 67 63 2d 32 20 29 20 66 61 74 61  i>=argc-2 ) fata
8df0: 6c 5f 65 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  l_error("missing
8e00: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73   arguments on %s
8e10: 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  \n", argv[i]);. 
8e20: 20 20 20 20 20 20 20 6e 48 65 61 70 20 3d 20 69         nHeap = i
8e30: 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76  ntegerValue(argv
8e40: 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  [i+1]);.        
8e50: 6d 6e 48 65 61 70 20 3d 20 69 6e 74 65 67 65 72  mnHeap = integer
8e60: 56 61 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d 29  Value(argv[i+2])
8e70: 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  ;.        i += 2
8e80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8e90: 28 20 73 74 72 63 6d 70 28 7a 2c 22 69 6e 63 72  ( strcmp(z,"incr
8ea0: 76 61 63 75 75 6d 22 29 3d 3d 30 20 29 7b 0a 20  vacuum")==0 ){. 
8eb0: 20 20 20 20 20 20 20 64 6f 49 6e 63 72 76 61 63         doIncrvac
8ec0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
8ed0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
8ee0: 6a 6f 75 72 6e 61 6c 22 29 3d 3d 30 20 29 7b 0a  journal")==0 ){.
8ef0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61          if( i>=a
8f00: 72 67 63 2d 31 20 29 20 66 61 74 61 6c 5f 65 72  rgc-1 ) fatal_er
8f10: 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67  ror("missing arg
8f20: 75 6d 65 6e 74 20 6f 6e 20 25 73 5c 6e 22 2c 20  ument on %s\n", 
8f30: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
8f40: 20 20 7a 4a 4d 6f 64 65 20 3d 20 61 72 67 76 5b    zJMode = argv[
8f50: 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ++i];.      }els
8f60: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
8f70: 6b 65 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  key")==0 ){.    
8f80: 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d      if( i>=argc-
8f90: 31 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28  1 ) fatal_error(
8fa0: 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  "missing argumen
8fb0: 74 20 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67 76  t on %s\n", argv
8fc0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 4b  [i]);.        zK
8fd0: 65 79 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a  ey = argv[++i];.
8fe0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8ff0: 73 74 72 63 6d 70 28 7a 2c 22 6c 6f 6f 6b 61 73  strcmp(z,"lookas
9000: 69 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ide")==0 ){.    
9010: 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d      if( i>=argc-
9020: 32 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28  2 ) fatal_error(
9030: 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  "missing argumen
9040: 74 73 20 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67  ts on %s\n", arg
9050: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  v[i]);.        n
9060: 4c 6f 6f 6b 20 3d 20 69 6e 74 65 67 65 72 56 61  Look = integerVa
9070: 6c 75 65 28 61 72 67 76 5b 69 2b 31 5d 29 3b 0a  lue(argv[i+1]);.
9080: 20 20 20 20 20 20 20 20 73 7a 4c 6f 6f 6b 20 3d          szLook =
9090: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72   integerValue(ar
90a0: 67 76 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  gv[i+2]);.      
90b0: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
90c0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
90d0: 28 7a 2c 22 6e 6f 73 79 6e 63 22 29 3d 3d 30 20  (z,"nosync")==0 
90e0: 29 7b 0a 20 20 20 20 20 20 20 20 6e 6f 53 79 6e  ){.        noSyn
90f0: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 1;.      }el
9100: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
9110: 22 6e 6f 74 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b  "notnull")==0 ){
9120: 0a 20 20 20 20 20 20 20 20 67 2e 7a 4e 4e 20 3d  .        g.zNN =
9130: 20 22 4e 4f 54 20 4e 55 4c 4c 22 3b 0a 20 20 20   "NOT NULL";.   
9140: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
9150: 63 6d 70 28 7a 2c 22 70 61 67 65 73 69 7a 65 22  cmp(z,"pagesize"
9160: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9170: 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20 29 20  if( i>=argc-1 ) 
9180: 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 6d 69 73  fatal_error("mis
9190: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e  sing argument on
91a0: 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29   %s\n", argv[i])
91b0: 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 53 69  ;.        pageSi
91c0: 7a 65 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75  ze = integerValu
91d0: 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20  e(argv[++i]);.  
91e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
91f0: 72 63 6d 70 28 7a 2c 22 70 63 61 63 68 65 22 29  rcmp(z,"pcache")
9200: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
9210: 66 28 20 69 3e 3d 61 72 67 63 2d 32 20 29 20 66  f( i>=argc-2 ) f
9220: 61 74 61 6c 5f 65 72 72 6f 72 28 22 6d 69 73 73  atal_error("miss
9230: 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e  ing arguments on
9240: 20 25 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29   %s\n", argv[i])
9250: 3b 0a 20 20 20 20 20 20 20 20 6e 50 43 61 63 68  ;.        nPCach
9260: 65 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65  e = integerValue
9270: 28 61 72 67 76 5b 69 2b 31 5d 29 3b 0a 20 20 20  (argv[i+1]);.   
9280: 20 20 20 20 20 73 7a 50 43 61 63 68 65 20 3d 20       szPCache = 
9290: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
92a0: 76 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  v[i+2]);.       
92b0: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d   i += 2;.      }
92c0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
92d0: 7a 2c 22 70 72 69 6d 61 72 79 6b 65 79 22 29 3d  z,"primarykey")=
92e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 67 2e  =0 ){.        g.
92f0: 7a 50 4b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b  zPK = "PRIMARY K
9300: 45 59 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  EY";.      }else
9310: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 72   if( strcmp(z,"r
9320: 65 70 72 65 70 61 72 65 22 29 3d 3d 30 20 29 7b  eprepare")==0 ){
9330: 0a 20 20 20 20 20 20 20 20 67 2e 62 52 65 70 72  .        g.bRepr
9340: 65 70 61 72 65 20 3d 20 31 3b 0a 20 20 20 20 20  epare = 1;.     
9350: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
9360: 70 28 7a 2c 22 73 63 72 61 74 63 68 22 29 3d 3d  p(z,"scratch")==
9370: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
9380: 20 69 3e 3d 61 72 67 63 2d 32 20 29 20 66 61 74   i>=argc-2 ) fat
9390: 61 6c 5f 65 72 72 6f 72 28 22 6d 69 73 73 69 6e  al_error("missin
93a0: 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25  g arguments on %
93b0: 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\n", argv[i]);.
93c0: 20 20 20 20 20 20 20 20 6e 53 63 72 61 74 63 68          nScratch
93d0: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
93e0: 61 72 67 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20  argv[i+1]);.    
93f0: 20 20 20 20 73 7a 53 63 72 61 74 63 68 20 3d 20      szScratch = 
9400: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
9410: 76 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  v[i+2]);.       
9420: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d   i += 2;.      }
9430: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
9440: 7a 2c 22 73 71 6c 6f 6e 6c 79 22 29 3d 3d 30 20  z,"sqlonly")==0 
9450: 29 7b 0a 20 20 20 20 20 20 20 20 67 2e 62 53 71  ){.        g.bSq
9460: 6c 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  lOnly = 1;.     
9470: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
9480: 70 28 7a 2c 22 73 69 7a 65 22 29 3d 3d 30 20 29  p(z,"size")==0 )
9490: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
94a0: 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c 5f  =argc-1 ) fatal_
94b0: 65 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  error("missing a
94c0: 72 67 75 6d 65 6e 74 20 6f 6e 20 25 73 5c 6e 22  rgument on %s\n"
94d0: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
94e0: 20 20 20 20 67 2e 73 7a 54 65 73 74 20 3d 20 69      g.szTest = i
94f0: 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76  ntegerValue(argv
9500: 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65  [++i]);.      }e
9510: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
9520: 2c 22 73 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a  ,"stats")==0 ){.
9530: 20 20 20 20 20 20 20 20 73 68 6f 77 53 74 61 74          showStat
9540: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  s = 1;.      }el
9550: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c  se if( strcmp(z,
9560: 22 74 65 73 74 73 65 74 22 29 3d 3d 30 20 29 7b  "testset")==0 ){
9570: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
9580: 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c 5f 65  argc-1 ) fatal_e
9590: 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72  rror("missing ar
95a0: 67 75 6d 65 6e 74 20 6f 6e 20 25 73 5c 6e 22 2c  gument on %s\n",
95b0: 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20   argv[i]);.     
95c0: 20 20 20 7a 54 53 65 74 20 3d 20 61 72 67 76 5b     zTSet = argv[
95d0: 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ++i];.      }els
95e0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
95f0: 74 72 61 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  trace")==0 ){.  
9600: 20 20 20 20 20 20 64 6f 54 72 61 63 65 20 3d 20        doTrace = 
9610: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
9620: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 74 68 72  f( strcmp(z,"thr
9630: 65 61 64 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  eads")==0 ){.   
9640: 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63       if( i>=argc
9650: 2d 31 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72  -1 ) fatal_error
9660: 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  ("missing argume
9670: 6e 74 20 6f 6e 20 25 73 5c 6e 22 2c 20 61 72 67  nt on %s\n", arg
9680: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e  v[i]);.        n
9690: 54 68 72 65 61 64 20 3d 20 69 6e 74 65 67 65 72  Thread = integer
96a0: 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29  Value(argv[++i])
96b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
96c0: 28 20 73 74 72 63 6d 70 28 7a 2c 22 75 74 66 31  ( strcmp(z,"utf1
96d0: 36 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  6le")==0 ){.    
96e0: 20 20 20 20 7a 45 6e 63 6f 64 69 6e 67 20 3d 20      zEncoding = 
96f0: 22 75 74 66 31 36 6c 65 22 3b 0a 20 20 20 20 20  "utf16le";.     
9700: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
9710: 70 28 7a 2c 22 75 74 66 31 36 62 65 22 29 3d 3d  p(z,"utf16be")==
9720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e  0 ){.        zEn
9730: 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 31 36 62  coding = "utf16b
9740: 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  e";.      }else 
9750: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 76 65  if( strcmp(z,"ve
9760: 72 69 66 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rify")==0 ){.   
9770: 20 20 20 20 20 67 2e 62 56 65 72 69 66 79 20 3d       g.bVerify =
9780: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
9790: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 77 69  if( strcmp(z,"wi
97a0: 74 68 6f 75 74 2d 72 6f 77 69 64 22 29 3d 3d 30  thout-rowid")==0
97b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 2e 7a 57   ){.        g.zW
97c0: 52 20 3d 20 22 57 49 54 48 4f 55 54 20 52 4f 57  R = "WITHOUT ROW
97d0: 49 44 22 3b 0a 20 20 20 20 20 20 20 20 67 2e 7a  ID";.        g.z
97e0: 50 4b 20 3d 20 22 50 52 49 4d 41 52 59 20 4b 45  PK = "PRIMARY KE
97f0: 59 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  Y";.      }else 
9800: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 20 22 68  if( strcmp(z, "h
9810: 65 6c 70 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  elp")==0 || strc
9820: 6d 70 28 7a 2c 22 3f 22 29 3d 3d 30 20 29 7b 0a  mp(z,"?")==0 ){.
9830: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 7a          printf(z
9840: 48 65 6c 70 2c 20 61 72 67 76 5b 30 5d 29 3b 0a  Help, argv[0]);.
9850: 20 20 20 20 20 20 20 20 65 78 69 74 28 30 29 3b          exit(0);
9860: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9870: 20 20 20 20 20 20 66 61 74 61 6c 5f 65 72 72 6f        fatal_erro
9880: 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  r("unknown optio
9890: 6e 3a 20 25 73 5c 6e 55 73 65 20 5c 22 25 73 20  n: %s\nUse \"%s 
98a0: 2d 3f 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22  -?\" for help\n"
98b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
98c0: 20 20 20 20 20 20 61 72 67 76 5b 69 5d 2c 20 61        argv[i], a
98d0: 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  rgv[0]);.      }
98e0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
98f0: 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  DbName==0 ){.   
9900: 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 61 72 67     zDbName = arg
9910: 76 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  v[i];.    }else{
9920: 0a 20 20 20 20 20 20 66 61 74 61 6c 5f 65 72 72  .      fatal_err
9930: 6f 72 28 22 73 75 72 70 6c 75 73 20 61 72 67 75  or("surplus argu
9940: 6d 65 6e 74 3a 20 25 73 5c 6e 55 73 65 20 5c 22  ment: %s\nUse \"
9950: 25 73 20 2d 3f 5c 22 20 66 6f 72 20 68 65 6c 70  %s -?\" for help
9960: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
9970: 20 20 20 20 20 20 20 61 72 67 76 5b 69 5d 2c 20         argv[i], 
9980: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  argv[0]);.    }.
9990: 20 20 7d 0a 23 69 66 20 30 0a 20 20 69 66 28 20    }.#if 0.  if( 
99a0: 7a 44 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  zDbName==0 ){.  
99b0: 20 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 7a 48    fatal_error(zH
99c0: 65 6c 70 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20  elp, argv[0]);. 
99d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
99e0: 6e 48 65 61 70 3e 30 20 29 7b 0a 20 20 20 20 70  nHeap>0 ){.    p
99f0: 48 65 61 70 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  Heap = malloc( n
9a00: 48 65 61 70 20 29 3b 0a 20 20 20 20 69 66 28 20  Heap );.    if( 
9a10: 70 48 65 61 70 3d 3d 30 20 29 20 66 61 74 61 6c  pHeap==0 ) fatal
9a20: 5f 65 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 61  _error("cannot a
9a30: 6c 6c 6f 63 61 74 65 20 25 64 2d 62 79 74 65 20  llocate %d-byte 
9a40: 68 65 61 70 5c 6e 22 2c 20 6e 48 65 61 70 29 3b  heap\n", nHeap);
9a50: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9a60: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
9a70: 43 4f 4e 46 49 47 5f 48 45 41 50 2c 20 70 48 65  CONFIG_HEAP, pHe
9a80: 61 70 2c 20 6e 48 65 61 70 2c 20 6d 6e 48 65 61  ap, nHeap, mnHea
9a90: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  p);.    if( rc )
9aa0: 20 66 61 74 61 6c 5f 65 72 72 6f 72 28 22 68 65   fatal_error("he
9ab0: 61 70 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ap configuration
9ac0: 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20   failed: %d\n", 
9ad0: 72 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  rc);.  }.  if( n
9ae0: 50 43 61 63 68 65 3e 30 20 26 26 20 73 7a 50 43  PCache>0 && szPC
9af0: 61 63 68 65 3e 30 20 29 7b 0a 20 20 20 20 70 50  ache>0 ){.    pP
9b00: 43 61 63 68 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  Cache = malloc( 
9b10: 6e 50 43 61 63 68 65 2a 28 73 71 6c 69 74 65 33  nPCache*(sqlite3
9b20: 5f 69 6e 74 36 34 29 73 7a 50 43 61 63 68 65 20  _int64)szPCache 
9b30: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 43 61 63  );.    if( pPCac
9b40: 68 65 3d 3d 30 20 29 20 66 61 74 61 6c 5f 65 72  he==0 ) fatal_er
9b50: 72 6f 72 28 22 63 61 6e 6e 6f 74 20 61 6c 6c 6f  ror("cannot allo
9b60: 63 61 74 65 20 25 6c 6c 64 2d 62 79 74 65 20 70  cate %lld-byte p
9b70: 63 61 63 68 65 5c 6e 22 2c 0a 20 20 20 20 20 20  cache\n",.      
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 20 20 20 20 20 20 20 20 20 6e 50 43 61 63             nPCac
9ba0: 68 65 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  he*(sqlite3_int6
9bb0: 34 29 73 7a 50 43 61 63 68 65 29 3b 0a 20 20 20  4)szPCache);.   
9bc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   rc = sqlite3_co
9bd0: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
9be0: 49 47 5f 50 41 47 45 43 41 43 48 45 2c 20 70 50  IG_PAGECACHE, pP
9bf0: 43 61 63 68 65 2c 20 73 7a 50 43 61 63 68 65 2c  Cache, szPCache,
9c00: 20 6e 50 43 61 63 68 65 29 3b 0a 20 20 20 20 69   nPCache);.    i
9c10: 66 28 20 72 63 20 29 20 66 61 74 61 6c 5f 65 72  f( rc ) fatal_er
9c20: 72 6f 72 28 22 70 63 61 63 68 65 20 63 6f 6e 66  ror("pcache conf
9c30: 69 67 75 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  iguration failed
9c40: 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  : %d\n", rc);.  
9c50: 7d 0a 20 20 69 66 28 20 6e 53 63 72 61 74 63 68  }.  if( nScratch
9c60: 3e 30 20 26 26 20 73 7a 53 63 72 61 74 63 68 3e  >0 && szScratch>
9c70: 30 20 29 7b 0a 20 20 20 20 70 53 63 72 61 74 63  0 ){.    pScratc
9c80: 68 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 63 72  h = malloc( nScr
9c90: 61 74 63 68 2a 28 73 71 6c 69 74 65 33 5f 69 6e  atch*(sqlite3_in
9ca0: 74 36 34 29 73 7a 53 63 72 61 74 63 68 20 29 3b  t64)szScratch );
9cb0: 0a 20 20 20 20 69 66 28 20 70 53 63 72 61 74 63  .    if( pScratc
9cc0: 68 3d 3d 30 20 29 20 66 61 74 61 6c 5f 65 72 72  h==0 ) fatal_err
9cd0: 6f 72 28 22 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63  or("cannot alloc
9ce0: 61 74 65 20 25 6c 6c 64 2d 62 79 74 65 20 73 63  ate %lld-byte sc
9cf0: 72 61 74 63 68 5c 6e 22 2c 0a 20 20 20 20 20 20  ratch\n",.      
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 20 20 20 20 20 6e 53 63 72 61             nScra
9d20: 74 63 68 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  tch*(sqlite3_int
9d30: 36 34 29 73 7a 53 63 72 61 74 63 68 29 3b 0a 20  64)szScratch);. 
9d40: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
9d50: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
9d60: 4e 46 49 47 5f 53 43 52 41 54 43 48 2c 20 70 53  NFIG_SCRATCH, pS
9d70: 63 72 61 74 63 68 2c 20 73 7a 53 63 72 61 74 63  cratch, szScratc
9d80: 68 2c 20 6e 53 63 72 61 74 63 68 29 3b 0a 20 20  h, nScratch);.  
9d90: 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c    if( rc ) fatal
9da0: 5f 65 72 72 6f 72 28 22 73 63 72 61 74 63 68 20  _error("scratch 
9db0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 61  configuration fa
9dc0: 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29  iled: %d\n", rc)
9dd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f  ;.  }.  if( nLoo
9de0: 6b 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  k>0 ){.    sqlit
9df0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
9e00: 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  _CONFIG_LOOKASID
9e10: 45 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 0a  E, 0, 0);.  }. .
9e20: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 64 61    /* Open the da
9e30: 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 69  tabase and the i
9e40: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69  nput file */.  i
9e50: 66 28 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  f( sqlite3_open(
9e60: 7a 44 62 4e 61 6d 65 2c 20 26 67 2e 64 62 29 20  zDbName, &g.db) 
9e70: 29 7b 0a 20 20 20 20 66 61 74 61 6c 5f 65 72 72  ){.    fatal_err
9e80: 6f 72 28 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20  or("Cannot open 
9e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 3a 20 25  database file: %
9ea0: 73 5c 6e 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  s\n", zDbName);.
9eb0: 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 6f 6b 3e    }.  if( nLook>
9ec0: 30 20 26 26 20 73 7a 4c 6f 6f 6b 3e 30 20 29 7b  0 && szLook>0 ){
9ed0: 0a 20 20 20 20 70 4c 6f 6f 6b 20 3d 20 6d 61 6c  .    pLook = mal
9ee0: 6c 6f 63 28 20 6e 4c 6f 6f 6b 2a 73 7a 4c 6f 6f  loc( nLook*szLoo
9ef0: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  k );.    rc = sq
9f00: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
9f10: 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g.db, SQLITE_DBC
9f20: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 2c  ONFIG_LOOKASIDE,
9f30: 20 70 4c 6f 6f 6b 2c 20 73 7a 4c 6f 6f 6b 2c 6e   pLook, szLook,n
9f40: 4c 6f 6f 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  Look);.    if( r
9f50: 63 20 29 20 66 61 74 61 6c 5f 65 72 72 6f 72 28  c ) fatal_error(
9f60: 22 6c 6f 6f 6b 61 73 69 64 65 20 63 6f 6e 66 69  "lookaside confi
9f70: 67 75 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a  guration failed:
9f80: 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 7d   %d\n", rc);.  }
9f90: 0a 0a 20 20 2f 2a 20 53 65 74 20 64 61 74 61 62  ..  /* Set datab
9fa0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  ase connection o
9fb0: 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  ptions */.  sqli
9fc0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
9fd0: 69 6f 6e 28 67 2e 64 62 2c 20 22 72 61 6e 64 6f  ion(g.db, "rando
9fe0: 6d 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54  m", 0, SQLITE_UT
9ff0: 46 38 2c 20 30 2c 20 72 61 6e 64 6f 6d 46 75 6e  F8, 0, randomFun
a000: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
a010: 64 6f 54 72 61 63 65 20 29 20 73 71 6c 69 74 65  doTrace ) sqlite
a020: 33 5f 74 72 61 63 65 28 67 2e 64 62 2c 20 74 72  3_trace(g.db, tr
a030: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b  aceCallback, 0);
a040: 0a 20 20 73 70 65 65 64 74 65 73 74 31 5f 65 78  .  speedtest1_ex
a050: 65 63 28 22 50 52 41 47 4d 41 20 74 68 72 65 61  ec("PRAGMA threa
a060: 64 73 3d 25 64 22 2c 20 6e 54 68 72 65 61 64 29  ds=%d", nThread)
a070: 3b 0a 20 20 69 66 28 20 7a 4b 65 79 20 29 7b 0a  ;.  if( zKey ){.
a080: 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f 65      speedtest1_e
a090: 78 65 63 28 22 50 52 41 47 4d 41 20 6b 65 79 28  xec("PRAGMA key(
a0a0: 27 25 73 27 29 22 2c 20 7a 4b 65 79 29 3b 0a 20  '%s')", zKey);. 
a0b0: 20 7d 0a 20 20 69 66 28 20 7a 45 6e 63 6f 64 69   }.  if( zEncodi
a0c0: 6e 67 20 29 7b 0a 20 20 20 20 73 70 65 65 64 74  ng ){.    speedt
a0d0: 65 73 74 31 5f 65 78 65 63 28 22 50 52 41 47 4d  est1_exec("PRAGM
a0e0: 41 20 65 6e 63 6f 64 69 6e 67 3d 25 73 22 2c 20  A encoding=%s", 
a0f0: 7a 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 7d 0a  zEncoding);.  }.
a100: 20 20 69 66 28 20 64 6f 41 75 74 6f 76 61 63 20    if( doAutovac 
a110: 29 7b 0a 20 20 20 20 73 70 65 65 64 74 65 73 74  ){.    speedtest
a120: 31 5f 65 78 65 63 28 22 50 52 41 47 4d 41 20 61  1_exec("PRAGMA a
a130: 75 74 6f 5f 76 61 63 75 75 6d 3d 46 55 4c 4c 22  uto_vacuum=FULL"
a140: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  );.  }else if( d
a150: 6f 49 6e 63 72 76 61 63 20 29 7b 0a 20 20 20 20  oIncrvac ){.    
a160: 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28  speedtest1_exec(
a170: 22 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63  "PRAGMA auto_vac
a180: 75 75 6d 3d 49 4e 43 52 45 4d 45 4e 54 41 4c 22  uum=INCREMENTAL"
a190: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61 67  );.  }.  if( pag
a1a0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 73 70 65  eSize ){.    spe
a1b0: 65 64 74 65 73 74 31 5f 65 78 65 63 28 22 50 52  edtest1_exec("PR
a1c0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 3d 25  AGMA page_size=%
a1d0: 64 22 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  d", pageSize);. 
a1e0: 20 7d 0a 20 20 69 66 28 20 63 61 63 68 65 53 69   }.  if( cacheSi
a1f0: 7a 65 20 29 7b 0a 20 20 20 20 73 70 65 65 64 74  ze ){.    speedt
a200: 65 73 74 31 5f 65 78 65 63 28 22 50 52 41 47 4d  est1_exec("PRAGM
a210: 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 25 64 22  A cache_size=%d"
a220: 2c 20 63 61 63 68 65 53 69 7a 65 29 3b 0a 20 20  , cacheSize);.  
a230: 7d 0a 20 20 69 66 28 20 6e 6f 53 79 6e 63 20 29  }.  if( noSync )
a240: 20 73 70 65 65 64 74 65 73 74 31 5f 65 78 65 63   speedtest1_exec
a250: 28 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  ("PRAGMA synchro
a260: 6e 6f 75 73 3d 4f 46 46 22 29 3b 0a 20 20 69 66  nous=OFF");.  if
a270: 28 20 64 6f 45 78 63 6c 75 73 69 76 65 20 29 7b  ( doExclusive ){
a280: 0a 20 20 20 20 73 70 65 65 64 74 65 73 74 31 5f  .    speedtest1_
a290: 65 78 65 63 28 22 50 52 41 47 4d 41 20 6c 6f 63  exec("PRAGMA loc
a2a0: 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
a2b0: 49 56 45 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  IVE");.  }.  if(
a2c0: 20 7a 4a 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73   zJMode ){.    s
a2d0: 70 65 65 64 74 65 73 74 31 5f 65 78 65 63 28 22  peedtest1_exec("
a2e0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
a2f0: 6f 64 65 3d 25 73 22 2c 20 7a 4a 4d 6f 64 65 29  ode=%s", zJMode)
a300: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 2e 62  ;.  }..  if( g.b
a310: 45 78 70 6c 61 69 6e 20 29 20 70 72 69 6e 74 66  Explain ) printf
a320: 28 22 2e 65 78 70 6c 61 69 6e 5c 6e 2e 65 63 68  (".explain\n.ech
a330: 6f 20 6f 6e 5c 6e 22 29 3b 0a 20 20 69 66 28 20  o on\n");.  if( 
a340: 73 74 72 63 6d 70 28 7a 54 53 65 74 2c 22 6d 61  strcmp(zTSet,"ma
a350: 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74  in")==0 ){.    t
a360: 65 73 74 73 65 74 5f 6d 61 69 6e 28 29 3b 0a 20  estset_main();. 
a370: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
a380: 70 28 7a 54 53 65 74 2c 22 64 65 62 75 67 31 22  p(zTSet,"debug1"
a390: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73 74  )==0 ){.    test
a3a0: 73 65 74 5f 64 65 62 75 67 31 28 29 3b 0a 20 20  set_debug1();.  
a3b0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
a3c0: 28 7a 54 53 65 74 2c 22 63 74 65 22 29 3d 3d 30  (zTSet,"cte")==0
a3d0: 20 29 7b 0a 20 20 20 20 74 65 73 74 73 65 74 5f   ){.    testset_
a3e0: 63 74 65 28 29 3b 0a 20 20 7d 65 6c 73 65 20 69  cte();.  }else i
a3f0: 66 28 20 73 74 72 63 6d 70 28 7a 54 53 65 74 2c  f( strcmp(zTSet,
a400: 22 72 74 72 65 65 22 29 3d 3d 30 20 29 7b 0a 20  "rtree")==0 ){. 
a410: 20 20 20 74 65 73 74 73 65 74 5f 72 74 72 65 65     testset_rtree
a420: 28 36 2c 20 31 34 37 29 3b 0a 20 20 7d 65 6c 73  (6, 147);.  }els
a430: 65 7b 0a 20 20 20 20 66 61 74 61 6c 5f 65 72 72  e{.    fatal_err
a440: 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 74 65 73 74  or("unknown test
a450: 73 65 74 3a 20 5c 22 25 73 5c 22 5c 6e 43 68 6f  set: \"%s\"\nCho
a460: 69 63 65 73 3a 20 6d 61 69 6e 20 64 65 62 75 67  ices: main debug
a470: 31 20 63 74 65 20 72 74 72 65 65 5c 6e 22 2c 0a  1 cte rtree\n",.
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 7a 54 53 65 74 29 3b 0a 20 20 7d 0a 20 20 73   zTSet);.  }.  s
a4a0: 70 65 65 64 74 65 73 74 31 5f 66 69 6e 61 6c 28  peedtest1_final(
a4b0: 29 3b 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73  );..  /* Databas
a4c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61  e connection sta
a4d0: 74 69 73 74 69 63 73 20 70 72 69 6e 74 65 64 20  tistics printed 
a4e0: 61 66 74 65 72 20 62 6f 74 68 20 70 72 65 70 61  after both prepa
a4f0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  red statements. 
a500: 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 66 69   ** have been fi
a510: 6e 61 6c 69 7a 65 64 20 2a 2f 0a 23 69 66 20 53  nalized */.#if S
a520: 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55  QLITE_VERSION_NU
a530: 4d 42 45 52 3e 3d 33 30 30 37 30 30 39 0a 20 20  MBER>=3007009.  
a540: 69 66 28 20 73 68 6f 77 53 74 61 74 73 20 29 7b  if( showStats ){
a550: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
a560: 73 74 61 74 75 73 28 67 2e 64 62 2c 20 53 51 4c  status(g.db, SQL
a570: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
a580: 4b 41 53 49 44 45 5f 55 53 45 44 2c 20 26 69 43  KASIDE_USED, &iC
a590: 75 72 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20 20  ur, &iHi, 0);.  
a5a0: 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 4c 6f 6f    printf("-- Loo
a5b0: 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65  kaside Slots Use
a5c0: 64 3a 20 20 20 20 20 20 20 20 25 64 20 28 6d 61  d:        %d (ma
a5d0: 78 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69  x %d)\n", iCur,i
a5e0: 48 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Hi);.    sqlite3
a5f0: 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c  _db_status(g.db,
a600: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
a610: 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 20  _LOOKASIDE_HIT, 
a620: 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30 29 3b  &iCur, &iHi, 0);
a630: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20  .    printf("-- 
a640: 53 75 63 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61  Successful looka
a650: 73 69 64 65 73 3a 20 20 20 20 20 20 20 25 64 5c  sides:       %d\
a660: 6e 22 2c 20 69 48 69 29 3b 0a 20 20 20 20 73 71  n", iHi);.    sq
a670: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
a680: 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  g.db, SQLITE_DBS
a690: 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
a6a0: 4d 49 53 53 5f 53 49 5a 45 2c 20 26 69 43 75 72  MISS_SIZE, &iCur
a6b0: 2c 26 69 48 69 2c 30 29 3b 0a 20 20 20 20 70 72  ,&iHi,0);.    pr
a6c0: 69 6e 74 66 28 22 2d 2d 20 4c 6f 6f 6b 61 73 69  intf("-- Lookasi
a6d0: 64 65 20 73 69 7a 65 20 66 61 75 6c 74 73 3a 20  de size faults: 
a6e0: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 48 69        %d\n", iHi
a6f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  );.    sqlite3_d
a700: 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20 53  b_status(g.db, S
a710: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c  QLITE_DBSTATUS_L
a720: 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55  OOKASIDE_MISS_FU
a730: 4c 4c 2c 20 26 69 43 75 72 2c 26 69 48 69 2c 30  LL, &iCur,&iHi,0
a740: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d  );.    printf("-
a750: 2d 20 4c 6f 6f 6b 61 73 69 64 65 20 4f 4f 4d 20  - Lookaside OOM 
a760: 66 61 75 6c 74 73 3a 20 20 20 20 20 20 20 20 25  faults:        %
a770: 64 5c 6e 22 2c 20 69 48 69 29 3b 0a 20 20 20 20  d\n", iHi);.    
a780: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
a790: 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44  s(g.db, SQLITE_D
a7a0: 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
a7b0: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 2c  ED, &iCur, &iHi,
a7c0: 20 30 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   0);.    printf(
a7d0: 22 2d 2d 20 50 61 67 65 72 20 48 65 61 70 20 55  "-- Pager Heap U
a7e0: 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20  sage:           
a7f0: 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 43   %d bytes\n", iC
a800: 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
a810: 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c  _db_status(g.db,
a820: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
a830: 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
a840: 72 2c 20 26 69 48 69 2c 20 31 29 3b 0a 20 20 20  r, &iHi, 1);.   
a850: 20 70 72 69 6e 74 66 28 22 2d 2d 20 50 61 67 65   printf("-- Page
a860: 20 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20   cache hits:    
a870: 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
a880: 69 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iCur);.    sqlit
a890: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67 2e 64  e3_db_status(g.d
a8a0: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
a8b0: 55 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26  US_CACHE_MISS, &
a8c0: 69 43 75 72 2c 20 26 69 48 69 2c 20 31 29 3b 0a  iCur, &iHi, 1);.
a8d0: 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 20 50      printf("-- P
a8e0: 61 67 65 20 63 61 63 68 65 20 6d 69 73 73 65 73  age cache misses
a8f0: 3a 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e  :           %d\n
a900: 22 2c 20 69 43 75 72 29 3b 0a 23 69 66 20 53 51  ", iCur);.#if SQ
a910: 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  LITE_VERSION_NUM
a920: 42 45 52 3e 3d 33 30 30 37 30 31 32 0a 20 20 20  BER>=3007012.   
a930: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
a940: 75 73 28 67 2e 64 62 2c 20 53 51 4c 49 54 45 5f  us(g.db, SQLITE_
a950: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 57  DBSTATUS_CACHE_W
a960: 52 49 54 45 2c 20 26 69 43 75 72 2c 20 26 69 48  RITE, &iCur, &iH
a970: 69 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74  i, 1);.    print
a980: 66 28 22 2d 2d 20 50 61 67 65 20 63 61 63 68 65  f("-- Page cache
a990: 20 77 72 69 74 65 73 3a 20 20 20 20 20 20 20 20   writes:        
a9a0: 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
a9b0: 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c   .#endif.    sql
a9c0: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 67  ite3_db_status(g
a9d0: 2e 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54  .db, SQLITE_DBST
a9e0: 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44  ATUS_SCHEMA_USED
a9f0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 2c 20 30  , &iCur, &iHi, 0
aa00: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2d  );.    printf("-
aa10: 2d 20 53 63 68 65 6d 61 20 48 65 61 70 20 55 73  - Schema Heap Us
aa20: 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 25  age:           %
aa30: 64 20 62 79 74 65 73 5c 6e 22 2c 20 69 43 75 72  d bytes\n", iCur
aa40: 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ); .    sqlite3_
aa50: 64 62 5f 73 74 61 74 75 73 28 67 2e 64 62 2c 20  db_status(g.db, 
aa60: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
aa70: 53 54 4d 54 5f 55 53 45 44 2c 20 26 69 43 75 72  STMT_USED, &iCur
aa80: 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20  , &iHi, 0);.    
aa90: 70 72 69 6e 74 66 28 22 2d 2d 20 53 74 61 74 65  printf("-- State
aaa0: 6d 65 6e 74 20 48 65 61 70 20 55 73 61 67 65 3a  ment Heap Usage:
aab0: 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
aac0: 5c 6e 22 2c 20 69 43 75 72 29 3b 20 0a 20 20 7d  \n", iCur); .  }
aad0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
aae0: 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a  e3_close(g.db);.
aaf0: 0a 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 6d 65 6d  .  /* Global mem
ab00: 6f 72 79 20 75 73 61 67 65 20 73 74 61 74 69 73  ory usage statis
ab10: 74 69 63 73 20 70 72 69 6e 74 65 64 20 61 66 74  tics printed aft
ab20: 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
ab30: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 2a 2a 20  connection.  ** 
ab40: 68 61 73 20 63 6c 6f 73 65 64 2e 20 20 4d 65 6d  has closed.  Mem
ab50: 6f 72 79 20 75 73 61 67 65 20 73 68 6f 75 6c 64  ory usage should
ab60: 20 62 65 20 7a 65 72 6f 20 61 74 20 74 68 69 73   be zero at this
ab70: 20 70 6f 69 6e 74 2e 20 2a 2f 0a 20 20 69 66 28   point. */.  if(
ab80: 20 73 68 6f 77 53 74 61 74 73 20 29 7b 0a 20 20   showStats ){.  
ab90: 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
aba0: 28 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d  (SQLITE_STATUS_M
abb0: 45 4d 4f 52 59 5f 55 53 45 44 2c 20 26 69 43 75  EMORY_USED, &iCu
abc0: 72 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20  r, &iHi, 0);.   
abd0: 20 70 72 69 6e 74 66 28 22 2d 2d 20 4d 65 6d 6f   printf("-- Memo
abe0: 72 79 20 55 73 65 64 20 28 62 79 74 65 73 29 3a  ry Used (bytes):
abf0: 20 20 20 20 20 20 20 20 20 25 64 20 28 6d 61 78           %d (max
ac00: 20 25 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48   %d)\n", iCur,iH
ac10: 69 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 56  i);.#if SQLITE_V
ac20: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3e 3d 33  ERSION_NUMBER>=3
ac30: 30 30 37 30 30 30 0a 20 20 20 20 73 71 6c 69 74  007000.    sqlit
ac40: 65 33 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45  e3_status(SQLITE
ac50: 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43  _STATUS_MALLOC_C
ac60: 4f 55 4e 54 2c 20 26 69 43 75 72 2c 20 26 69 48  OUNT, &iCur, &iH
ac70: 69 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e 74  i, 0);.    print
ac80: 66 28 22 2d 2d 20 4f 75 74 73 74 61 6e 64 69 6e  f("-- Outstandin
ac90: 67 20 41 6c 6c 6f 63 61 74 69 6f 6e 73 3a 20 20  g Allocations:  
aca0: 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
acb0: 22 2c 20 69 43 75 72 2c 69 48 69 29 3b 0a 23 65  ", iCur,iHi);.#e
acc0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
acd0: 5f 73 74 61 74 75 73 28 53 51 4c 49 54 45 5f 53  _status(SQLITE_S
ace0: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
acf0: 4f 56 45 52 46 4c 4f 57 2c 20 26 69 43 75 72 2c  OVERFLOW, &iCur,
ad00: 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70   &iHi, 0);.    p
ad10: 72 69 6e 74 66 28 22 2d 2d 20 50 63 61 63 68 65  rintf("-- Pcache
ad20: 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a   Overflow Bytes:
ad30: 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25         %d (max %
ad40: 64 29 5c 6e 22 2c 20 69 43 75 72 2c 69 48 69 29  d)\n", iCur,iHi)
ad50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
ad60: 61 74 75 73 28 53 51 4c 49 54 45 5f 53 54 41 54  atus(SQLITE_STAT
ad70: 55 53 5f 53 43 52 41 54 43 48 5f 4f 56 45 52 46  US_SCRATCH_OVERF
ad80: 4c 4f 57 2c 20 26 69 43 75 72 2c 20 26 69 48 69  LOW, &iCur, &iHi
ad90: 2c 20 30 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  , 0);.    printf
ada0: 28 22 2d 2d 20 53 63 72 61 74 63 68 20 4f 76 65  ("-- Scratch Ove
adb0: 72 66 6c 6f 77 20 42 79 74 65 73 3a 20 20 20 20  rflow Bytes:    
adc0: 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22    %d (max %d)\n"
add0: 2c 20 69 43 75 72 2c 69 48 69 29 3b 0a 20 20 20  , iCur,iHi);.   
ade0: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 28   sqlite3_status(
adf0: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
ae00: 4c 4c 4f 43 5f 53 49 5a 45 2c 20 26 69 43 75 72  LLOC_SIZE, &iCur
ae10: 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20  , &iHi, 0);.    
ae20: 70 72 69 6e 74 66 28 22 2d 2d 20 4c 61 72 67 65  printf("-- Large
ae30: 73 74 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 20 20  st Allocation:  
ae40: 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73          %d bytes
ae50: 5c 6e 22 2c 69 48 69 29 3b 0a 20 20 20 20 73 71  \n",iHi);.    sq
ae60: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
ae70: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
ae80: 41 43 48 45 5f 53 49 5a 45 2c 20 26 69 43 75 72  ACHE_SIZE, &iCur
ae90: 2c 20 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20  , &iHi, 0);.    
aea0: 70 72 69 6e 74 66 28 22 2d 2d 20 4c 61 72 67 65  printf("-- Large
aeb0: 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61  st Pcache Alloca
aec0: 74 69 6f 6e 3a 20 20 20 25 64 20 62 79 74 65 73  tion:   %d bytes
aed0: 5c 6e 22 2c 69 48 69 29 3b 0a 20 20 20 20 73 71  \n",iHi);.    sq
aee0: 6c 69 74 65 33 5f 73 74 61 74 75 73 28 53 51 4c  lite3_status(SQL
aef0: 49 54 45 5f 53 54 41 54 55 53 5f 53 43 52 41 54  ITE_STATUS_SCRAT
af00: 43 48 5f 53 49 5a 45 2c 20 26 69 43 75 72 2c 20  CH_SIZE, &iCur, 
af10: 26 69 48 69 2c 20 30 29 3b 0a 20 20 20 20 70 72  &iHi, 0);.    pr
af20: 69 6e 74 66 28 22 2d 2d 20 4c 61 72 67 65 73 74  intf("-- Largest
af30: 20 53 63 72 61 74 63 68 20 41 6c 6c 6f 63 61 74   Scratch Allocat
af40: 69 6f 6e 3a 20 20 25 64 20 62 79 74 65 73 5c 6e  ion:  %d bytes\n
af50: 22 2c 20 69 48 69 29 3b 0a 20 20 7d 0a 0a 20 20  ", iHi);.  }..  
af60: 2f 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72  /* Release memor
af70: 79 20 2a 2f 0a 20 20 66 72 65 65 28 20 70 4c 6f  y */.  free( pLo
af80: 6f 6b 20 29 3b 0a 20 20 66 72 65 65 28 20 70 50  ok );.  free( pP
af90: 43 61 63 68 65 20 29 3b 0a 20 20 66 72 65 65 28  Cache );.  free(
afa0: 20 70 53 63 72 61 74 63 68 20 29 3b 0a 20 20 66   pScratch );.  f
afb0: 72 65 65 28 20 70 48 65 61 70 20 29 3b 0a 20 20  ree( pHeap );.  
afc0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a              return 0;.}.