/ Hex Artifact Content
Login

Artifact 94019b185caceffc9f7c7b678a6489e42bc2aefa:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 34 2d 31 37  /*.** 2015-04-17
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
0180: 75 74 69 6c 69 74 79 20 70 72 6f 67 72 61 6d 20  utility program 
0190: 64 65 73 69 67 6e 65 64 20 74 6f 20 61 69 64 20  designed to aid 
01a0: 72 75 6e 6e 69 6e 67 20 74 68 65 20 53 51 4c 69  running the SQLi
01b0: 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 67  te library.** ag
01c0: 61 69 6e 73 74 20 61 6e 20 65 78 74 65 72 6e 61  ainst an externa
01d0: 6c 20 66 75 7a 7a 65 72 2c 20 73 75 63 68 20 61  l fuzzer, such a
01e0: 73 20 41 6d 65 72 69 63 61 6e 20 46 75 7a 7a 79  s American Fuzzy
01f0: 20 4c 6f 70 20 28 41 46 4c 29 0a 2a 2a 20 28 68   Lop (AFL).** (h
0200: 74 74 70 3a 2f 2f 6c 63 61 6d 74 75 66 2e 63 6f  ttp://lcamtuf.co
0210: 72 65 64 75 6d 70 2e 63 78 2f 61 66 6c 2f 29 2e  redump.cx/afl/).
0220: 20 20 42 61 73 69 63 61 6c 6c 79 2c 20 74 68 69    Basically, thi
0230: 73 20 70 72 6f 67 72 61 6d 20 72 65 61 64 73 0a  s program reads.
0240: 2a 2a 20 53 51 4c 20 74 65 78 74 20 66 72 6f 6d  ** SQL text from
0250: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20   standard input 
0260: 61 6e 64 20 70 61 73 73 65 73 20 69 74 20 74 68  and passes it th
0270: 72 6f 75 67 68 20 74 6f 20 53 51 4c 69 74 65 20  rough to SQLite 
0280: 66 6f 72 20 65 76 61 6c 75 61 74 69 6f 6e 2c 0a  for evaluation,.
0290: 2a 2a 20 6a 75 73 74 20 6c 69 6b 65 20 74 68 65  ** just like the
02a0: 20 22 73 71 6c 69 74 65 33 22 20 63 6f 6d 6d 61   "sqlite3" comma
02b0: 6e 64 2d 6c 69 6e 65 20 73 68 65 6c 6c 2e 20 20  nd-line shell.  
02c0: 44 69 66 66 65 72 65 6e 63 65 73 20 66 72 6f 6d  Differences from
02d0: 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d   the.** command-
02e0: 6c 69 6e 65 20 73 68 65 6c 6c 3a 0a 2a 2a 0a 2a  line shell:.**.*
02f0: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 63 6f  *    (1)  The co
0300: 6d 70 6c 65 78 20 22 64 6f 74 2d 63 6f 6d 6d 61  mplex "dot-comma
0310: 6e 64 22 20 65 78 74 65 6e 73 69 6f 6e 73 20 61  nd" extensions a
0320: 72 65 20 6f 6d 69 74 74 65 64 2e 20 20 54 68 69  re omitted.  Thi
0330: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 72 65  s.**         pre
0340: 76 65 6e 74 73 20 74 68 65 20 66 75 7a 7a 65 72  vents the fuzzer
0350: 20 66 72 6f 6d 20 64 69 73 63 6f 76 65 72 69 6e   from discoverin
0360: 67 20 74 68 61 74 20 69 74 20 63 61 6e 20 72 75  g that it can ru
0370: 6e 20 74 68 69 6e 67 73 0a 2a 2a 20 20 20 20 20  n things.**     
0380: 20 20 20 20 6c 69 6b 65 20 22 2e 73 68 65 6c 6c      like ".shell
0390: 20 72 6d 20 2d 72 66 20 7e 22 0a 2a 2a 0a 2a 2a   rm -rf ~".**.**
03a0: 20 20 20 20 28 32 29 20 20 54 68 65 20 64 61 74      (2)  The dat
03b0: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
03c0: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
03d0: 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 66 6c 61 67  OPEN_MEMORY flag
03e0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 20 20   so that.**     
03f0: 20 20 20 20 6e 6f 20 64 69 73 6b 20 49 2f 4f 20      no disk I/O 
0400: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
0410: 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  e is permitted. 
0420: 20 54 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   The ATTACH comm
0430: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 77  and.**         w
0440: 69 74 68 20 61 20 66 69 6c 65 6e 61 6d 65 20 73  ith a filename s
0450: 74 69 6c 6c 20 75 73 65 73 20 61 6e 20 69 6e 2d  till uses an in-
0460: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
0470: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 54  .**.**    (3)  T
0480: 68 65 20 6d 61 69 6e 20 69 6e 2d 6d 65 6d 6f 72  he main in-memor
0490: 79 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  y database can b
04a0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66 72  e initialized fr
04b0: 6f 6d 20 61 20 74 65 6d 70 6c 61 74 65 0a 2a 2a  om a template.**
04c0: 20 20 20 20 20 20 20 20 20 64 69 73 6b 20 64 61           disk da
04d0: 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
04e0: 68 65 20 66 75 7a 7a 65 72 20 73 74 61 72 74 73  he fuzzer starts
04f0: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
0500: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 20   containing.**  
0510: 20 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 2e 0a         content..
0520: 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 54 68  **.**    (4)  Th
0530: 65 20 65 76 61 6c 28 29 20 53 51 4c 20 66 75 6e  e eval() SQL fun
0540: 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64 2c 20  ction is added, 
0550: 61 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 75 7a  allowing the fuz
0560: 7a 65 72 20 74 6f 20 64 6f 20 0a 2a 2a 20 20 20  zer to do .**   
0570: 20 20 20 20 20 20 69 6e 74 65 72 65 73 74 69 6e        interestin
0580: 67 20 72 65 63 75 72 73 69 76 65 20 6f 70 65 72  g recursive oper
0590: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ations..**.**   
05a0: 20 28 35 29 20 20 41 6e 20 65 72 72 6f 72 20 69   (5)  An error i
05b0: 73 20 72 61 69 73 65 64 20 69 66 20 74 68 65 72  s raised if ther
05c0: 65 20 69 73 20 61 20 6d 65 6d 6f 72 79 20 6c 65  e is a memory le
05d0: 61 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ak..**.** The in
05e0: 70 75 74 20 74 65 78 74 20 63 61 6e 20 62 65 20  put text can be 
05f0: 64 69 76 69 64 65 64 20 69 6e 74 6f 20 73 65 70  divided into sep
0600: 61 72 61 74 65 20 74 65 73 74 20 63 61 73 65 73  arate test cases
0610: 20 75 73 69 6e 67 20 63 6f 6d 6d 65 6e 74 73 0a   using comments.
0620: 2a 2a 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ** of the form:.
0630: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 7c 2a 2a 2a  **.**       |***
0640: 2a 3c 2e 2e 2e 3e 2a 2a 2a 2a 7c 0a 2a 2a 0a 2a  *<...>****|.**.*
0650: 2a 20 77 68 65 72 65 20 74 68 65 20 22 2e 2e 2e  * where the "...
0660: 22 20 69 73 20 61 72 62 69 74 72 61 72 79 20 74  " is arbitrary t
0670: 65 78 74 2e 20 28 45 78 63 65 70 74 20 74 68 65  ext. (Except the
0680: 20 22 7c 22 20 73 68 6f 75 6c 64 20 72 65 61 6c   "|" should real
0690: 6c 79 20 62 65 20 22 2f 22 2e 0a 2a 2a 20 22 7c  ly be "/"..** "|
06a0: 22 20 69 73 20 75 73 65 64 20 68 65 72 65 20 74  " is used here t
06b0: 6f 20 61 76 6f 69 64 20 63 6f 6d 70 69 6c 65 72  o avoid compiler
06c0: 20 65 72 72 6f 72 73 20 61 62 6f 75 74 20 6e 65   errors about ne
06d0: 73 74 65 64 20 63 6f 6d 6d 65 6e 74 73 2e 29 0a  sted comments.).
06e0: 2a 2a 20 41 20 73 65 70 61 72 61 74 65 20 69 6e  ** A separate in
06f0: 2d 6d 65 6d 6f 72 79 20 53 51 4c 69 74 65 20 64  -memory SQLite d
0700: 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
0710: 65 64 20 74 6f 20 72 75 6e 20 65 61 63 68 20 74  ed to run each t
0720: 65 73 74 20 63 61 73 65 2e 0a 2a 2a 20 54 68 69  est case..** Thi
0730: 73 20 66 65 61 74 75 72 65 20 61 6c 6c 6f 77 73  s feature allows
0740: 20 74 68 65 20 22 71 75 65 75 65 22 20 6f 66 20   the "queue" of 
0750: 41 46 4c 20 74 6f 20 62 65 20 63 61 70 74 75 72  AFL to be captur
0760: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0770: 20 62 69 67 0a 2a 2a 20 66 69 6c 65 20 75 73 69   big.** file usi
0780: 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6b  ng a command lik
0790: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
07a0: 20 28 66 6f 72 20 69 20 69 6e 20 69 64 3a 2a 3b   (for i in id:*;
07b0: 20 64 6f 20 65 63 68 6f 20 27 7c 2a 2a 2a 2a 3c   do echo '|****<
07c0: 27 24 69 27 3e 2a 2a 2a 2a 7c 27 3b 20 63 61 74  '$i'>****|'; cat
07d0: 20 24 69 3b 20 64 6f 6e 65 29 20 3e 7e 2f 61 6c   $i; done) >~/al
07e0: 6c 2d 71 75 65 75 65 2e 74 78 74 0a 2a 2a 0a 2a  l-queue.txt.**.*
07f0: 2a 20 28 4f 6e 63 65 20 61 67 61 69 6e 2c 20 63  * (Once again, c
0800: 68 61 6e 67 65 20 74 68 65 20 22 7c 22 20 74 6f  hange the "|" to
0810: 20 22 2f 22 29 20 54 68 65 6e 20 61 6c 6c 20 65   "/") Then all e
0820: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 41  lements of the A
0830: 46 4c 20 71 75 65 75 65 0a 2a 2a 20 63 61 6e 20  FL queue.** can 
0840: 62 65 20 72 75 6e 20 69 6e 20 61 20 73 69 6e 67  be run in a sing
0850: 6c 65 20 67 6f 20 28 66 6f 72 20 72 65 67 72 65  le go (for regre
0860: 73 73 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 66  ssion testing, f
0870: 6f 72 20 65 78 61 6d 70 6c 65 29 20 62 79 20 74  or example) by t
0880: 79 70 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  yping:.**.**    
0890: 66 75 7a 7a 65 72 73 68 65 6c 6c 20 2d 66 20 7e  fuzzershell -f ~
08a0: 2f 61 6c 6c 2d 71 75 65 75 65 2e 74 78 74 0a 2a  /all-queue.txt.*
08b0: 2a 0a 2a 2a 20 41 66 74 65 72 20 72 75 6e 6e 69  *.** After runni
08c0: 6e 67 20 65 61 63 68 20 63 68 75 6e 6b 20 6f 66  ng each chunk of
08d0: 20 53 51 4c 2c 20 74 68 65 20 64 61 74 61 62 61   SQL, the databa
08e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
08f0: 20 63 6c 6f 73 65 64 2e 20 20 54 68 65 0a 2a 2a   closed.  The.**
0900: 20 70 72 6f 67 72 61 6d 20 61 62 6f 72 74 73 20   program aborts 
0910: 69 66 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69  if the close fai
0920: 6c 73 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  ls or if there i
0930: 73 20 61 6e 79 20 75 6e 66 72 65 65 64 20 6d 65  s any unfreed me
0940: 6d 6f 72 79 20 61 66 74 65 72 0a 2a 2a 20 74 68  mory after.** th
0950: 65 20 63 6c 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  e close..**.** N
0960: 65 77 20 74 65 73 74 20 63 61 73 65 73 20 63 61  ew test cases ca
0970: 6e 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  n be appended to
0980: 20 61 6c 6c 2d 71 75 65 75 65 2e 74 78 74 20 61   all-queue.txt a
0990: 74 20 61 6e 79 20 74 69 6d 65 2e 20 20 49 66 20  t any time.  If 
09a0: 72 65 64 75 6e 64 61 6e 74 0a 2a 2a 20 74 65 73  redundant.** tes
09b0: 74 20 63 61 73 65 73 20 61 72 65 20 61 64 64 65  t cases are adde
09c0: 64 2c 20 74 68 65 79 20 63 61 6e 20 62 65 20 65  d, they can be e
09d0: 6c 69 6d 69 6e 61 74 65 64 20 62 79 20 72 75 6e  liminated by run
09e0: 6e 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  ning:.**.**    f
09f0: 75 7a 7a 65 72 73 68 65 6c 6c 20 2d 66 20 7e 2f  uzzershell -f ~/
0a00: 61 6c 6c 2d 71 75 65 75 65 2e 74 78 74 20 2d 2d  all-queue.txt --
0a10: 75 6e 69 71 75 65 2d 63 61 73 65 73 20 7e 2f 75  unique-cases ~/u
0a20: 6e 69 71 75 65 2d 63 61 73 65 73 2e 74 78 74 0a  nique-cases.txt.
0a30: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  */.#include <std
0a40: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0a50: 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75  stdlib.h>.#inclu
0a60: 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69  de <string.h>.#i
0a70: 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68  nclude <stdarg.h
0a80: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79 70  >.#include <ctyp
0a90: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22 73  e.h>.#include "s
0aa0: 71 6c 69 74 65 33 2e 68 22 0a 23 64 65 66 69 6e  qlite3.h".#defin
0ab0: 65 20 49 53 44 49 47 49 54 28 58 29 20 69 73 64  e ISDIGIT(X) isd
0ac0: 69 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63  igit((unsigned c
0ad0: 68 61 72 29 28 58 29 29 0a 0a 2f 2a 0a 2a 2a 20  har)(X))../*.** 
0ae0: 41 6c 6c 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  All global varia
0af0: 62 6c 65 73 20 61 72 65 20 67 61 74 68 65 72 65  bles are gathere
0b00: 64 20 69 6e 74 6f 20 74 68 65 20 22 67 22 20 73  d into the "g" s
0b10: 69 6e 67 6c 65 74 6f 6e 2e 0a 2a 2f 0a 73 74 72  ingleton..*/.str
0b20: 75 63 74 20 47 6c 6f 62 61 6c 56 61 72 73 20 7b  uct GlobalVars {
0b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
0b40: 41 72 67 76 30 3b 20 20 20 20 20 20 20 20 20 20  Argv0;          
0b50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 70      /* Name of p
0b60: 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 73 71 6c 69  rogram */.  sqli
0b70: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
0b80: 73 4f 72 69 67 4d 65 6d 3b 20 20 20 20 2f 2a 20  sOrigMem;    /* 
0b90: 4f 72 69 67 69 6e 61 6c 20 6d 65 6d 6f 72 79 20  Original memory 
0ba0: 6d 65 74 68 6f 64 73 20 2a 2f 0a 20 20 73 71 6c  methods */.  sql
0bb0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
0bc0: 20 73 4f 6f 6d 4d 65 6d 3b 20 20 20 20 20 2f 2a   sOomMem;     /*
0bd0: 20 4d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 20   Memory methods 
0be0: 77 69 74 68 20 4f 4f 4d 20 73 69 6d 75 6c 61 74  with OOM simulat
0bf0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 6f 6d  or */.  int iOom
0c00: 43 6e 74 64 6f 77 6e 3b 20 20 20 20 20 20 20 20  Cntdown;        
0c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
0c20: 72 79 20 66 61 69 6c 73 20 6f 6e 20 31 20 74 6f  ry fails on 1 to
0c30: 20 30 20 74 72 61 6e 73 69 74 69 6f 6e 20 2a 2f   0 transition */
0c40: 0a 20 20 69 6e 74 20 6e 4f 6f 6d 46 61 75 6c 74  .  int nOomFault
0c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0c60: 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
0c70: 73 20 66 6f 72 20 65 61 63 68 20 4f 4f 4d 20 66  s for each OOM f
0c80: 61 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  ault */.  int bO
0c90: 6f 6d 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20  omOnce;         
0ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
0cb0: 69 6c 20 6a 75 73 74 20 6f 6e 63 65 20 69 66 20  il just once if 
0cc0: 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  true */.  int bO
0cd0: 6f 6d 45 6e 61 62 6c 65 3b 20 20 20 20 20 20 20  omEnable;       
0ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
0cf0: 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 4f 4f 4d  ue to enable OOM
0d00: 20 73 69 6d 75 6c 61 74 69 6f 6e 20 2a 2f 0a 20   simulation */. 
0d10: 20 69 6e 74 20 6e 4f 6f 6d 42 72 6b 70 74 3b 20   int nOomBrkpt; 
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
0d40: 61 6c 6c 73 20 74 6f 20 6f 6f 6d 46 61 75 6c 74  alls to oomFault
0d50: 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65  () */.  char zTe
0d60: 73 74 4e 61 6d 65 5b 31 30 30 5d 3b 20 20 20 20  stName[100];    
0d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0d80: 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65 73 74   of current test
0d90: 20 2a 2f 0a 7d 20 67 3b 0a 0a 2f 2a 0a 2a 2a 20   */.} g;../*.** 
0da0: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
0db0: 66 20 69 74 65 72 61 74 69 6f 6e 73 20 66 6f 72  f iterations for
0dc0: 20 61 6e 20 4f 4f 4d 20 74 65 73 74 0a 2a 2f 0a   an OOM test.*/.
0dd0: 23 69 66 6e 64 65 66 20 4f 4f 4d 5f 4d 41 58 0a  #ifndef OOM_MAX.
0de0: 23 20 64 65 66 69 6e 65 20 4f 4f 4d 5f 4d 41 58  # define OOM_MAX
0df0: 20 36 32 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   625.#endif../*.
0e00: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0e10: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
0e20: 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 6f   simulated OOM o
0e30: 63 63 75 72 73 2e 20 20 49 74 20 65 78 69 73 74  ccurs.  It exist
0e40: 73 20 61 73 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e  s as a.** conven
0e50: 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
0e60: 74 20 61 20 64 65 62 75 67 67 65 72 20 62 72 65  t a debugger bre
0e70: 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  akpoint..*/.stat
0e80: 69 63 20 76 6f 69 64 20 6f 6f 6d 46 61 75 6c 74  ic void oomFault
0e90: 28 76 6f 69 64 29 7b 0a 20 20 67 2e 6e 4f 6f 6d  (void){.  g.nOom
0ea0: 42 72 6b 70 74 2b 2b 3b 20 2f 2a 20 50 72 65 76  Brkpt++; /* Prev
0eb0: 65 6e 74 20 6f 6f 6d 46 61 75 6c 74 28 29 20 66  ent oomFault() f
0ec0: 72 6f 6d 20 62 65 69 6e 67 20 6f 70 74 69 6d 69  rom being optimi
0ed0: 7a 65 64 20 6f 75 74 20 2a 2f 0a 7d 0a 0a 0a 2f  zed out */.}.../
0ee0: 2a 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 6d 61  * Versions of ma
0ef0: 6c 6c 6f 63 28 29 20 61 6e 64 20 72 65 61 6c 6c  lloc() and reall
0f00: 6f 63 28 29 20 74 68 61 74 20 73 69 6d 75 6c 61  oc() that simula
0f10: 74 65 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  te OOM condition
0f20: 73 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s */.static void
0f30: 20 2a 6f 6f 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20   *oomMalloc(int 
0f40: 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20 6e 42  nByte){.  if( nB
0f50: 79 74 65 3e 30 20 26 26 20 67 2e 62 4f 6f 6d 45  yte>0 && g.bOomE
0f60: 6e 61 62 6c 65 20 26 26 20 67 2e 69 4f 6f 6d 43  nable && g.iOomC
0f70: 6e 74 64 6f 77 6e 3e 30 20 29 7b 0a 20 20 20 20  ntdown>0 ){.    
0f80: 67 2e 69 4f 6f 6d 43 6e 74 64 6f 77 6e 2d 2d 3b  g.iOomCntdown--;
0f90: 0a 20 20 20 20 69 66 28 20 67 2e 69 4f 6f 6d 43  .    if( g.iOomC
0fa0: 6e 74 64 6f 77 6e 3d 3d 30 20 29 7b 0a 20 20 20  ntdown==0 ){.   
0fb0: 20 20 20 69 66 28 20 67 2e 6e 4f 6f 6d 46 61 75     if( g.nOomFau
0fc0: 6c 74 3d 3d 30 20 29 20 6f 6f 6d 46 61 75 6c 74  lt==0 ) oomFault
0fd0: 28 29 3b 0a 20 20 20 20 20 20 67 2e 6e 4f 6f 6d  ();.      g.nOom
0fe0: 46 61 75 6c 74 2b 2b 3b 0a 20 20 20 20 20 20 69  Fault++;.      i
0ff0: 66 28 20 21 67 2e 62 4f 6f 6d 4f 6e 63 65 20 29  f( !g.bOomOnce )
1000: 20 67 2e 69 4f 6f 6d 43 6e 74 64 6f 77 6e 20 3d   g.iOomCntdown =
1010: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1020: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1030: 72 65 74 75 72 6e 20 67 2e 73 4f 72 69 67 4d 65  return g.sOrigMe
1040: 6d 2e 78 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  m.xMalloc(nByte)
1050: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1060: 2a 6f 6f 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  *oomRealloc(void
1070: 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 6e 42 79 74   *pOld, int nByt
1080: 65 29 7b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  e){.  if( nByte>
1090: 30 20 26 26 20 67 2e 62 4f 6f 6d 45 6e 61 62 6c  0 && g.bOomEnabl
10a0: 65 20 26 26 20 67 2e 69 4f 6f 6d 43 6e 74 64 6f  e && g.iOomCntdo
10b0: 77 6e 3e 30 20 29 7b 0a 20 20 20 20 67 2e 69 4f  wn>0 ){.    g.iO
10c0: 6f 6d 43 6e 74 64 6f 77 6e 2d 2d 3b 0a 20 20 20  omCntdown--;.   
10d0: 20 69 66 28 20 67 2e 69 4f 6f 6d 43 6e 74 64 6f   if( g.iOomCntdo
10e0: 77 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  wn==0 ){.      i
10f0: 66 28 20 67 2e 6e 4f 6f 6d 46 61 75 6c 74 3d 3d  f( g.nOomFault==
1100: 30 20 29 20 6f 6f 6d 46 61 75 6c 74 28 29 3b 0a  0 ) oomFault();.
1110: 20 20 20 20 20 20 67 2e 6e 4f 6f 6d 46 61 75 6c        g.nOomFaul
1120: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21  t++;.      if( !
1130: 67 2e 62 4f 6f 6d 4f 6e 63 65 20 29 20 67 2e 69  g.bOomOnce ) g.i
1140: 4f 6f 6d 43 6e 74 64 6f 77 6e 20 3d 20 31 3b 0a  OomCntdown = 1;.
1150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1170: 72 6e 20 67 2e 73 4f 72 69 67 4d 65 6d 2e 78 52  rn g.sOrigMem.xR
1180: 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 6e 42 79  ealloc(pOld, nBy
1190: 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  te);.}../*.** Pr
11a0: 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
11b0: 73 61 67 65 20 61 6e 64 20 61 62 6f 72 74 20 69  sage and abort i
11c0: 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 6f 20  n such a way to 
11d0: 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 0a  indicate to the.
11e0: 2a 2a 20 66 75 7a 7a 65 72 20 74 68 61 74 20 74  ** fuzzer that t
11f0: 68 69 73 20 63 6f 75 6e 74 73 20 61 73 20 61 20  his counts as a 
1200: 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  crash..*/.static
1210: 20 76 6f 69 64 20 61 62 65 6e 64 45 72 72 6f 72   void abendError
1220: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
1230: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1240: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
1250: 67 2e 7a 54 65 73 74 4e 61 6d 65 5b 30 5d 20 29  g.zTestName[0] )
1260: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
1270: 64 65 72 72 2c 20 22 25 73 20 28 25 73 29 3a 20  derr, "%s (%s): 
1280: 22 2c 20 67 2e 7a 41 72 67 76 30 2c 20 67 2e 7a  ", g.zArgv0, g.z
1290: 54 65 73 74 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  TestName);.  }el
12a0: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
12b0: 73 74 64 65 72 72 2c 20 22 25 73 3a 20 22 2c 20  stderr, "%s: ", 
12c0: 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 7d 0a 20  g.zArgv0);.  }. 
12d0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
12e0: 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e  ormat);.  vfprin
12f0: 74 66 28 73 74 64 65 72 72 2c 20 7a 46 6f 72 6d  tf(stderr, zForm
1300: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1310: 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  d(ap);.  fprintf
1320: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a  (stderr, "\n");.
1330: 20 20 61 62 6f 72 74 28 29 3b 0a 7d 0a 2f 2a 0a    abort();.}./*.
1340: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
1350: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 71 75  r message and qu
1360: 69 74 2c 20 62 75 74 20 6e 6f 74 20 69 6e 20 61  it, but not in a
1370: 20 77 61 79 20 74 68 61 74 20 77 6f 75 6c 64 20   way that would 
1380: 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 61 20 63  look.** like a c
1390: 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rash..*/.static 
13a0: 76 6f 69 64 20 66 61 74 61 6c 45 72 72 6f 72 28  void fatalError(
13b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
13c0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
13d0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 67  list ap;.  if( g
13e0: 2e 7a 54 65 73 74 4e 61 6d 65 5b 30 5d 20 29 7b  .zTestName[0] ){
13f0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1400: 65 72 72 2c 20 22 25 73 20 28 25 73 29 3a 20 22  err, "%s (%s): "
1410: 2c 20 67 2e 7a 41 72 67 76 30 2c 20 67 2e 7a 54  , g.zArgv0, g.zT
1420: 65 73 74 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  estName);.  }els
1430: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  e{.    fprintf(s
1440: 74 64 65 72 72 2c 20 22 25 73 3a 20 22 2c 20 67  tderr, "%s: ", g
1450: 2e 7a 41 72 67 76 30 29 3b 0a 20 20 7d 0a 20 20  .zArgv0);.  }.  
1460: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
1470: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
1480: 66 28 73 74 64 65 72 72 2c 20 7a 46 6f 72 6d 61  f(stderr, zForma
1490: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
14a0: 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  (ap);.  fprintf(
14b0: 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 20  stderr, "\n");. 
14c0: 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a   exit(1);.}../*.
14d0: 2a 2a 20 45 76 61 6c 75 61 74 65 20 73 6f 6d 65  ** Evaluate some
14e0: 20 53 51 4c 2e 20 20 41 62 6f 72 74 20 69 66 20   SQL.  Abort if 
14f0: 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  unable..*/.stati
1500: 63 20 76 6f 69 64 20 73 71 6c 65 78 65 63 28 73  c void sqlexec(s
1510: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1520: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1530: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1540: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
1550: 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  l;.  char *zErrM
1560: 73 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  sg = 0;.  int rc
1570: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1580: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71   zFormat);.  zSq
1590: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  l = sqlite3_vmpr
15a0: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
15b0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
15c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15d0: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30  exec(db, zSql, 0
15e0: 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , 0, &zErrMsg);.
15f0: 20 20 69 66 28 20 72 63 20 29 20 61 62 65 6e 64    if( rc ) abend
1600: 45 72 72 6f 72 28 22 66 61 69 6c 65 64 20 73 71  Error("failed sq
1610: 6c 20 5b 25 73 5d 3a 20 25 73 22 2c 20 7a 53 71  l [%s]: %s", zSq
1620: 6c 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  l, zErrMsg);.  s
1630: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1640: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1650: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
1660: 6f 6b 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  oked by sqlite3_
1670: 6c 6f 67 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  log()..*/.static
1680: 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76   void shellLog(v
1690: 6f 69 64 20 2a 70 4e 6f 74 55 73 65 64 2c 20 69  oid *pNotUsed, i
16a0: 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e  nt iErrCode, con
16b0: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
16c0: 20 20 70 72 69 6e 74 66 28 22 4c 4f 47 3a 20 28    printf("LOG: (
16d0: 25 64 29 20 25 73 5c 6e 22 2c 20 69 45 72 72 43  %d) %s\n", iErrC
16e0: 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66  ode, zMsg);.  ff
16f0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d 0a  lush(stdout);.}.
1700: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
1710: 6c 4c 6f 67 4e 6f 6f 70 28 76 6f 69 64 20 2a 70  lLogNoop(void *p
1720: 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 69 45 72  NotUsed, int iEr
1730: 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61  rCode, const cha
1740: 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 72 65 74 75  r *zMsg){.  retu
1750: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
1760: 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  s callback is in
1770: 76 6f 6b 65 64 20 62 79 20 73 71 6c 69 74 65 33  voked by sqlite3
1780: 5f 65 78 65 63 28 29 20 74 6f 20 72 65 74 75 72  _exec() to retur
1790: 6e 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 2e  n query results.
17a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
17b0: 78 65 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  xecCallback(void
17c0: 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 61   *NotUsed, int a
17d0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
17e0: 2c 20 63 68 61 72 20 2a 2a 63 6f 6c 76 29 7b 0a  , char **colv){.
17f0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
1800: 63 20 75 6e 73 69 67 6e 65 64 20 63 6e 74 20 3d  c unsigned cnt =
1810: 20 30 3b 0a 20 20 70 72 69 6e 74 66 28 22 52 4f   0;.  printf("RO
1820: 57 20 23 25 75 3a 5c 6e 22 2c 20 2b 2b 63 6e 74  W #%u:\n", ++cnt
1830: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1840: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
1850: 70 72 69 6e 74 66 28 22 20 25 73 3d 22 2c 20 63  printf(" %s=", c
1860: 6f 6c 76 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  olv[i]);.    if(
1870: 20 61 72 67 76 5b 69 5d 20 29 7b 0a 20 20 20 20   argv[i] ){.    
1880: 20 20 70 72 69 6e 74 66 28 22 5b 25 73 5d 5c 6e    printf("[%s]\n
1890: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
18a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72   }else{.      pr
18b0: 69 6e 74 66 28 22 4e 55 4c 4c 5c 6e 22 29 3b 0a  intf("NULL\n");.
18c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 66 6c 75      }.  }.  fflu
18d0: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 72 65  sh(stdout);.  re
18e0: 74 75 72 6e 20 30 3b 0a 7d 0a 73 74 61 74 69 63  turn 0;.}.static
18f0: 20 69 6e 74 20 65 78 65 63 4e 6f 6f 70 28 76 6f   int execNoop(vo
1900: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  id *NotUsed, int
1910: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1920: 67 76 2c 20 63 68 61 72 20 2a 2a 63 6f 6c 76 29  gv, char **colv)
1930: 7b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  {.  return 0;.}.
1940: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1950: 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
1960: 20 54 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 69   This callback i
1970: 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 73 71 6c  s invoked by sql
1980: 69 74 65 33 5f 74 72 61 63 65 28 29 20 61 73 20  ite3_trace() as 
1990: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
19a0: 6e 74 0a 2a 2a 20 73 74 61 72 74 73 2e 0a 2a 2f  nt.** starts..*/
19b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
19c0: 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ceCallback(void 
19d0: 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
19e0: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 70  char *zMsg){.  p
19f0: 72 69 6e 74 66 28 22 54 52 41 43 45 3a 20 25 73  rintf("TRACE: %s
1a00: 5c 6e 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66  \n", zMsg);.  ff
1a10: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 7d 0a  lush(stdout);.}.
1a20: 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 63  static void trac
1a30: 65 4e 6f 6f 70 28 76 6f 69 64 20 2a 4e 6f 74 55  eNoop(void *NotU
1a40: 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  sed, const char 
1a50: 2a 7a 4d 73 67 29 7b 0a 20 20 72 65 74 75 72 6e  *zMsg){.  return
1a60: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 2a  ;.}.#endif../***
1a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ab0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 65 76 61 6c  ********.** eval
1ac0: 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  () implementatio
1ad0: 6e 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 2e 2e  n copied from ..
1ae0: 2f 65 78 74 2f 6d 69 73 63 2f 65 76 61 6c 2e 63  /ext/misc/eval.c
1af0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  .*/./*.** Struct
1b00: 75 72 65 20 75 73 65 64 20 74 6f 20 61 63 63 75  ure used to accu
1b10: 6d 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75  mulate the outpu
1b20: 74 0a 2a 2f 0a 73 74 72 75 63 74 20 45 76 61 6c  t.*/.struct Eval
1b30: 52 65 73 75 6c 74 20 7b 0a 20 20 63 68 61 72 20  Result {.  char 
1b40: 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
1b50: 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64    /* Accumulated
1b60: 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 6f 6e   output */.  con
1b70: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20  st char *zSep;  
1b80: 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72      /* Separator
1b90: 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 65 70 3b   */.  int szSep;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 53 69 7a 65 20 6f 66 20 74 68 65 20 73 65 70 61  Size of the sepa
1bc0: 72 61 74 6f 72 20 73 74 72 69 6e 67 20 2a 2f 0a  rator string */.
1bd0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1be0: 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 4e 75 6d 62  nAlloc;  /* Numb
1bf0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
1c00: 63 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f  cated for z[] */
1c10: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1c20: 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 4e 75 6d   nUsed;   /* Num
1c30: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1c40: 7a 5b 5d 20 61 63 74 75 61 6c 6c 79 20 75 73 65  z[] actually use
1c50: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  d */.};../*.** C
1c60: 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c  allback from sql
1c70: 69 74 65 5f 65 78 65 63 28 29 20 66 6f 72 20 74  ite_exec() for t
1c80: 68 65 20 65 76 61 6c 28 29 20 66 75 6e 63 74 69  he eval() functi
1c90: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
1ca0: 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t callback(void 
1cb0: 2a 70 43 74 78 2c 20 69 6e 74 20 61 72 67 63 2c  *pCtx, int argc,
1cc0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
1cd0: 61 72 20 2a 2a 63 6f 6c 6e 61 6d 65 73 29 7b 0a  ar **colnames){.
1ce0: 20 20 73 74 72 75 63 74 20 45 76 61 6c 52 65 73    struct EvalRes
1cf0: 75 6c 74 20 2a 70 20 3d 20 28 73 74 72 75 63 74  ult *p = (struct
1d00: 20 45 76 61 6c 52 65 73 75 6c 74 2a 29 70 43 74   EvalResult*)pCt
1d10: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 66  x;.  int i; .  f
1d20: 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20  or(i=0; i<argc; 
1d30: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
1d40: 63 68 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69  char *z = argv[i
1d50: 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 22  ] ? argv[i] : ""
1d60: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 73 7a 20  ;.    size_t sz 
1d70: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20  = strlen(z);.   
1d80: 20 69 66 28 20 28 73 71 6c 69 74 65 33 5f 69 6e   if( (sqlite3_in
1d90: 74 36 34 29 73 7a 2b 70 2d 3e 6e 55 73 65 64 2b  t64)sz+p->nUsed+
1da0: 70 2d 3e 73 7a 53 65 70 2b 31 20 3e 20 70 2d 3e  p->szSep+1 > p->
1db0: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  nAlloc ){.      
1dc0: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  char *zNew;.    
1dd0: 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d    p->nAlloc = p-
1de0: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 73 7a 20 2b  >nAlloc*2 + sz +
1df0: 20 70 2d 3e 73 7a 53 65 70 20 2b 20 31 3b 0a 20   p->szSep + 1;. 
1e00: 20 20 20 20 20 2f 2a 20 55 73 69 6e 67 20 73 71       /* Using sq
1e10: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
1e20: 29 20 77 6f 75 6c 64 20 62 65 20 62 65 74 74 65  ) would be bette
1e30: 72 2c 20 62 75 74 20 69 74 20 69 73 20 61 20 72  r, but it is a r
1e40: 65 63 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 61  ecent.      ** a
1e50: 64 64 69 74 69 6f 6e 20 61 6e 64 20 77 69 6c 6c  ddition and will
1e60: 20 63 61 75 73 65 20 61 20 73 65 67 66 61 75 6c   cause a segfaul
1e70: 74 20 69 66 20 6c 6f 61 64 65 64 20 62 79 20 61  t if loaded by a
1e80: 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 0a  n older version.
1e90: 20 20 20 20 20 20 2a 2a 20 6f 66 20 53 51 4c 69        ** of SQLi
1ea0: 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  te.  */.      zN
1eb0: 65 77 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 3c 3d  ew = p->nAlloc<=
1ec0: 30 78 37 66 66 66 66 66 66 66 20 3f 20 73 71 6c  0x7fffffff ? sql
1ed0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e  ite3_realloc(p->
1ee0: 7a 2c 20 28 69 6e 74 29 70 2d 3e 6e 41 6c 6c 6f  z, (int)p->nAllo
1ef0: 63 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 69 66  c) : 0;.      if
1f00: 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( zNew==0 ){.   
1f10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1f20: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  e(p->z);.       
1f30: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
1f40: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20  zeof(*p));.     
1f50: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f60: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 7a 20     }.      p->z 
1f70: 3d 20 7a 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20  = zNew;.    }.  
1f80: 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 3e 30    if( p->nUsed>0
1f90: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1fa0: 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d  (&p->z[p->nUsed]
1fb0: 2c 20 70 2d 3e 7a 53 65 70 2c 20 70 2d 3e 73 7a  , p->zSep, p->sz
1fc0: 53 65 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  Sep);.      p->n
1fd0: 55 73 65 64 20 2b 3d 20 70 2d 3e 73 7a 53 65 70  Used += p->szSep
1fe0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
1ff0: 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65  py(&p->z[p->nUse
2000: 64 5d 2c 20 7a 2c 20 73 7a 29 3b 0a 20 20 20 20  d], z, sz);.    
2010: 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 73 7a 3b 0a  p->nUsed += sz;.
2020: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2030: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2040: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ntation of the e
2050: 76 61 6c 28 58 29 20 61 6e 64 20 65 76 61 6c 28  val(X) and eval(
2060: 58 2c 59 29 20 53 51 4c 20 66 75 6e 63 74 69 6f  X,Y) SQL functio
2070: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 61 6c 75 61  ns..**.** Evalua
2080: 74 65 20 74 68 65 20 53 51 4c 20 74 65 78 74 20  te the SQL text 
2090: 69 6e 20 58 2e 20 20 52 65 74 75 72 6e 20 74 68  in X.  Return th
20a0: 65 20 72 65 73 75 6c 74 73 2c 20 75 73 69 6e 67  e results, using
20b0: 20 73 74 72 69 6e 67 0a 2a 2a 20 59 20 61 73 20   string.** Y as 
20c0: 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 20 20  the separator.  
20d0: 49 66 20 59 20 69 73 20 6f 6d 69 74 74 65 64 2c  If Y is omitted,
20e0: 20 75 73 65 20 61 20 73 69 6e 67 6c 65 20 73 70   use a single sp
20f0: 61 63 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  ace character..*
2100: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2110: 6c 45 76 61 6c 46 75 6e 63 28 0a 20 20 73 71 6c  lEvalFunc(.  sql
2120: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
2130: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
2140: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
2150: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
2160: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
2170: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2180: 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
2190: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  ;.  int rc;.  st
21a0: 72 75 63 74 20 45 76 61 6c 52 65 73 75 6c 74 20  ruct EvalResult 
21b0: 78 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c  x;..  memset(&x,
21c0: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
21d0: 20 20 78 2e 7a 53 65 70 20 3d 20 22 20 22 3b 0a    x.zSep = " ";.
21e0: 20 20 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20    zSql = (const 
21f0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
2200: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
2210: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
2220: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
2230: 20 61 72 67 63 3e 31 20 29 7b 0a 20 20 20 20 78   argc>1 ){.    x
2240: 2e 7a 53 65 70 20 3d 20 28 63 6f 6e 73 74 20 63  .zSep = (const c
2250: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
2260: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
2270: 3b 0a 20 20 20 20 69 66 28 20 78 2e 7a 53 65 70  ;.    if( x.zSep
2280: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
2290: 7d 0a 20 20 78 2e 73 7a 53 65 70 20 3d 20 28 69  }.  x.szSep = (i
22a0: 6e 74 29 73 74 72 6c 65 6e 28 78 2e 7a 53 65 70  nt)strlen(x.zSep
22b0: 29 3b 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  );.  db = sqlite
22c0: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
22d0: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
22e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
22f0: 63 28 64 62 2c 20 7a 53 71 6c 2c 20 63 61 6c 6c  c(db, zSql, call
2300: 62 61 63 6b 2c 20 26 78 2c 20 26 7a 45 72 72 29  back, &x, &zErr)
2310: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2320: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2330: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
2340: 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c  r(context, zErr,
2350: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
2360: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2370: 7d 65 6c 73 65 20 69 66 28 20 78 2e 7a 53 65 70  }else if( x.zSep
2380: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2390: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f  e3_result_error_
23a0: 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a  nomem(context);.
23b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23c0: 28 78 2e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (x.z);.  }else{.
23d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
23e0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
23f0: 20 78 2e 7a 2c 20 28 69 6e 74 29 78 2e 6e 55 73   x.z, (int)x.nUs
2400: 65 64 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ed, sqlite3_free
2410: 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 20 45 6e 64 20  );.  }.}./* End 
2420: 6f 66 20 74 68 65 20 65 76 61 6c 28 29 20 69 6d  of the eval() im
2430: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 2a  plementation.***
2440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
2490: 0a 2a 2a 20 50 72 69 6e 74 20 73 6b 65 74 63 68  .** Print sketch
24a0: 79 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  y documentation 
24b0: 66 6f 72 20 74 68 69 73 20 75 74 69 6c 69 74 79  for this utility
24c0: 20 70 72 6f 67 72 61 6d 0a 2a 2f 0a 73 74 61 74   program.*/.stat
24d0: 69 63 20 76 6f 69 64 20 73 68 6f 77 48 65 6c 70  ic void showHelp
24e0: 28 76 6f 69 64 29 7b 0a 20 20 70 72 69 6e 74 66  (void){.  printf
24f0: 28 22 55 73 61 67 65 3a 20 25 73 20 5b 6f 70 74  ("Usage: %s [opt
2500: 69 6f 6e 73 5d 20 3f 46 49 4c 45 2e 2e 2e 3f 5c  ions] ?FILE...?\
2510: 6e 22 2c 20 67 2e 7a 41 72 67 76 30 29 3b 0a 20  n", g.zArgv0);. 
2520: 20 70 72 69 6e 74 66 28 0a 22 52 65 61 64 20 53   printf(."Read S
2530: 51 4c 20 74 65 78 74 20 66 72 6f 6d 20 46 49 4c  QL text from FIL
2540: 45 2e 2e 2e 20 28 6f 72 20 66 72 6f 6d 20 73 74  E... (or from st
2550: 61 6e 64 61 72 64 20 69 6e 70 75 74 20 69 66 20  andard input if 
2560: 46 49 4c 45 2e 2e 2e 20 69 73 20 6f 6d 69 74 74  FILE... is omitt
2570: 65 64 29 5c 6e 22 0a 22 61 6e 64 20 74 68 65 6e  ed)\n"."and then
2580: 20 65 76 61 6c 75 61 74 65 20 65 61 63 68 20 62   evaluate each b
2590: 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 63 6f 6e 74  lock of SQL cont
25a0: 61 69 6e 65 64 20 74 68 65 72 65 69 6e 2e 5c 6e  ained therein.\n
25b0: 22 0a 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22  "."Options:\n"."
25c0: 20 20 2d 2d 61 75 74 6f 76 61 63 75 75 6d 20 20    --autovacuum  
25d0: 20 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 41          Enable A
25e0: 55 54 4f 56 41 43 55 55 4d 20 6d 6f 64 65 5c 6e  UTOVACUUM mode\n
25f0: 22 0a 22 20 20 2d 2d 64 61 74 61 62 61 73 65 20  "."  --database 
2600: 46 49 4c 45 20 20 20 20 20 20 20 55 73 65 20 64  FILE       Use d
2610: 61 74 61 62 61 73 65 20 46 49 4c 45 20 69 6e 73  atabase FILE ins
2620: 74 65 61 64 20 6f 66 20 61 6e 20 69 6e 2d 6d 65  tead of an in-me
2630: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 5c 6e 22  mory database\n"
2640: 0a 22 20 20 2d 2d 64 69 73 61 62 6c 65 2d 6c 6f  ."  --disable-lo
2650: 6f 6b 61 73 69 64 65 20 20 20 54 75 72 6e 20 6f  okaside   Turn o
2660: 66 66 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  ff lookaside mem
2670: 6f 72 79 5c 6e 22 0a 22 20 20 2d 2d 68 65 61 70  ory\n"."  --heap
2680: 20 53 5a 20 4d 49 4e 20 20 20 20 20 20 20 20 20   SZ MIN         
2690: 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  Memory allocator
26a0: 20 75 73 65 73 20 53 5a 20 62 79 74 65 73 20 26   uses SZ bytes &
26b0: 20 6d 69 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   min allocation 
26c0: 4d 49 4e 5c 6e 22 0a 22 20 20 2d 2d 68 65 6c 70  MIN\n"."  --help
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 53 68 6f 77 20 74 68 69 73 20 68 65 6c 70 20 74  Show this help t
26f0: 65 78 74 5c 6e 22 20 20 20 20 0a 22 20 20 2d 2d  ext\n"    ."  --
2700: 6c 6f 6f 6b 61 73 69 64 65 20 4e 20 53 5a 20 20  lookaside N SZ  
2710: 20 20 20 20 43 6f 6e 66 69 67 75 72 65 20 6c 6f      Configure lo
2720: 6f 6b 61 73 69 64 65 20 66 6f 72 20 4e 20 73 6c  okaside for N sl
2730: 6f 74 73 20 6f 66 20 53 5a 20 62 79 74 65 73 20  ots of SZ bytes 
2740: 65 61 63 68 5c 6e 22 0a 22 20 20 2d 2d 6f 6f 6d  each\n"."  --oom
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 52 75 6e 20 65 61 63 68 20 74 65 73 74 20 6d   Run each test m
2770: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 69 6e  ultiple times in
2780: 20 61 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f 4d   a simulated OOM
2790: 20 6c 6f 6f 70 5c 6e 22 0a 22 20 20 2d 2d 70 61   loop\n"."  --pa
27a0: 67 65 73 69 7a 65 20 4e 20 20 20 20 20 20 20 20  gesize N        
27b0: 20 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73    Set the page s
27c0: 69 7a 65 20 74 6f 20 4e 5c 6e 22 0a 22 20 20 2d  ize to N\n"."  -
27d0: 2d 70 63 61 63 68 65 20 4e 20 53 5a 20 20 20 20  -pcache N SZ    
27e0: 20 20 20 20 20 43 6f 6e 66 69 67 75 72 65 20 4e       Configure N
27f0: 20 70 61 67 65 73 20 6f 66 20 70 61 67 65 63 61   pages of pageca
2800: 63 68 65 20 65 61 63 68 20 6f 66 20 73 69 7a 65  che each of size
2810: 20 53 5a 20 62 79 74 65 73 5c 6e 22 0a 22 20 20   SZ bytes\n"."  
2820: 2d 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -q              
2830: 20 20 20 20 20 20 52 65 64 75 63 65 64 20 6f 75        Reduced ou
2840: 74 70 75 74 5c 6e 22 0a 22 20 20 2d 2d 71 75 69  tput\n"."  --qui
2850: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
2860: 20 52 65 64 75 63 65 64 20 6f 75 74 70 75 74 5c   Reduced output\
2870: 6e 22 0a 22 20 20 2d 2d 73 63 72 61 74 63 68 20  n"."  --scratch 
2880: 4e 20 53 5a 20 20 20 20 20 20 20 20 43 6f 6e 66  N SZ        Conf
2890: 69 67 75 72 65 20 73 63 72 61 74 63 68 20 6d 65  igure scratch me
28a0: 6d 6f 72 79 20 66 6f 72 20 4e 20 73 6c 6f 74 73  mory for N slots
28b0: 20 6f 66 20 53 5a 20 62 79 74 65 73 20 65 61 63   of SZ bytes eac
28c0: 68 5c 6e 22 0a 22 20 20 2d 2d 75 6e 69 71 75 65  h\n"."  --unique
28d0: 2d 63 61 73 65 73 20 46 49 4c 45 20 20 20 57 72  -cases FILE   Wr
28e0: 69 74 65 20 61 6c 6c 20 75 6e 69 71 75 65 20 74  ite all unique t
28f0: 65 73 74 20 63 61 73 65 73 20 74 6f 20 46 49 4c  est cases to FIL
2900: 45 5c 6e 22 0a 22 20 20 2d 2d 75 74 66 31 36 62  E\n"."  --utf16b
2910: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65  e             Se
2920: 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20  t text encoding 
2930: 74 6f 20 55 54 46 2d 31 36 42 45 5c 6e 22 0a 22  to UTF-16BE\n"."
2940: 20 20 2d 2d 75 74 66 31 36 6c 65 20 20 20 20 20    --utf16le     
2950: 20 20 20 20 20 20 20 20 53 65 74 20 74 65 78 74          Set text
2960: 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20 55 54 46   encoding to UTF
2970: 2d 31 36 4c 45 5c 6e 22 0a 22 20 20 2d 76 20 20  -16LE\n"."  -v  
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 20 20 49 6e 63 72 65 61 73 65 64 20 6f 75 74 70    Increased outp
29a0: 75 74 5c 6e 22 0a 22 20 20 2d 2d 76 65 72 62 6f  ut\n"."  --verbo
29b0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 49  se             I
29c0: 6e 63 72 65 61 73 65 64 20 6f 75 74 70 75 74 5c  ncreased output\
29d0: 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n".  );.}../*.**
29e0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
29f0: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
2a00: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
2a10: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
2a20: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
2a30: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
2a40: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
2a50: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
2a60: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
2a70: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
2a80: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
2a90: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
2aa0: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
2ab0: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
2ac0: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
2ad0: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
2ae0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
2af0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
2b00: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
2b10: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
2b20: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
2b30: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  xes..*/.static i
2b40: 6e 74 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt integerValue(
2b50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
2b60: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
2b70: 36 34 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74  64 v = 0;.  stat
2b80: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2b90: 7b 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b  { char *zSuffix;
2ba0: 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d   int iMult; } aM
2bb0: 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ult[] = {.    { 
2bc0: 22 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20  "KiB", 1024 },. 
2bd0: 20 20 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34     { "MiB", 1024
2be0: 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22  *1024 },.    { "
2bf0: 47 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a  GiB", 1024*1024*
2c00: 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b  1024 },.    { "K
2c10: 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20  B",  1000 },.   
2c20: 20 7b 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30   { "MB",  100000
2c30: 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c  0 },.    { "GB",
2c40: 20 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a    1000000000 },.
2c50: 20 20 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30      { "K",   100
2c60: 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20  0 },.    { "M", 
2c70: 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20    1000000 },.   
2c80: 20 7b 20 22 47 22 2c 20 20 20 31 30 30 30 30 30   { "G",   100000
2c90: 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  0000 },.  };.  i
2ca0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65  nt i;.  int isNe
2cb0: 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72  g = 0;.  if( zAr
2cc0: 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  g[0]=='-' ){.   
2cd0: 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20   isNeg = 1;.    
2ce0: 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20  zArg++;.  }else 
2cf0: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27  if( zArg[0]=='+'
2d00: 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a   ){.    zArg++;.
2d10: 20 20 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30    }.  if( zArg[0
2d20: 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31  ]=='0' && zArg[1
2d30: 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e  ]=='x' ){.    in
2d40: 74 20 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d  t x;.    zArg +=
2d50: 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   2;.    while( (
2d60: 78 20 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75  x = hexDigitValu
2d70: 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29  e(zArg[0]))>=0 )
2d80: 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c  {.      v = (v<<
2d90: 34 29 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41  4) + x;.      zA
2da0: 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rg++;.    }.  }e
2db0: 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
2dc0: 49 53 44 49 47 49 54 28 7a 41 72 67 5b 30 5d 29  ISDIGIT(zArg[0])
2dd0: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a   ){.      v = v*
2de0: 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27  10 + zArg[0] - '
2df0: 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b  0';.      zArg++
2e00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
2e10: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
2e20: 61 4d 75 6c 74 29 2f 73 69 7a 65 6f 66 28 61 4d  aMult)/sizeof(aM
2e30: 75 6c 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ult[0]); i++){. 
2e40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2e50: 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e  tricmp(aMult[i].
2e60: 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d  zSuffix, zArg)==
2e70: 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20  0 ){.      v *= 
2e80: 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a  aMult[i].iMult;.
2e90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2ea0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 76 3e 30   }.  }.  if( v>0
2eb0: 78 37 66 66 66 66 66 66 66 20 29 20 61 62 65 6e  x7fffffff ) aben
2ec0: 64 45 72 72 6f 72 28 22 70 61 72 61 6d 65 74 65  dError("paramete
2ed0: 72 20 74 6f 6f 20 6c 61 72 67 65 20 2d 20 6d 61  r too large - ma
2ee0: 78 20 32 31 34 37 34 38 33 36 34 38 22 29 3b 0a  x 2147483648");.
2ef0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69    return (int)(i
2f00: 73 4e 65 67 3f 20 2d 76 20 3a 20 76 29 3b 0a 7d  sNeg? -v : v);.}
2f10: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
2f20: 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f  current wall-clo
2f30: 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69  ck time */.stati
2f40: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
2f50: 74 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b  timeOfDay(void){
2f60: 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2f70: 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20  3_vfs *clockVfs 
2f80: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
2f90: 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c  nt64 t;.  if( cl
2fa0: 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63  ockVfs==0 ) cloc
2fb0: 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  kVfs = sqlite3_v
2fc0: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
2fd0: 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72  ( clockVfs->iVer
2fe0: 73 69 6f 6e 3e 3d 31 20 26 26 20 63 6c 6f 63 6b  sion>=1 && clock
2ff0: 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
3000: 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20  eInt64!=0 ){.   
3010: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
3020: 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f  entTimeInt64(clo
3030: 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65  ckVfs, &t);.  }e
3040: 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  lse{.    double 
3050: 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d  r;.    clockVfs-
3060: 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c  >xCurrentTime(cl
3070: 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20  ockVfs, &r);.   
3080: 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e   t = (sqlite3_in
3090: 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e  t64)(r*86400000.
30a0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
30b0: 20 74 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28   t;.}..int main(
30c0: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
30d0: 2a 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a  *argv){.  char *
30e0: 7a 49 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  zIn = 0;        
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
3100: 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e   text */.  int n
3110: 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
3120: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3130: 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c 6c 6f  er of bytes allo
3140: 63 61 74 65 64 20 66 6f 72 20 7a 49 6e 5b 5d 20  cated for zIn[] 
3150: 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 20 3d 20 30  */.  int nIn = 0
3160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3170: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3180: 62 79 74 65 73 20 6f 66 20 7a 49 6e 5b 5d 20 75  bytes of zIn[] u
3190: 73 65 64 20 2a 2f 0a 20 20 73 69 7a 65 5f 74 20  sed */.  size_t 
31a0: 67 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  got;            
31b0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
31c0: 72 65 61 64 20 66 72 6f 6d 20 69 6e 70 75 74 20  read from input 
31d0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
31e0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
31f0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
3200: 65 73 20 66 72 6f 6d 20 41 50 49 20 66 75 6e 63  es from API func
3210: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
3240: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
3250: 74 20 69 4e 65 78 74 3b 20 20 20 20 20 20 20 20  t iNext;        
3260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3270: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c  ext block of SQL
3280: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
3290: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
32a0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 64 61 74 61      /* Open data
32b0: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  base */.  char *
32c0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
32d0: 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
32e0: 20 6d 65 73 73 61 67 65 20 72 65 74 75 72 6e 65   message returne
32f0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  d from sqlite3_e
3300: 78 65 63 28 29 20 2a 2f 0a 20 20 63 6f 6e 73 74  xec() */.  const
3310: 20 63 68 61 72 20 2a 7a 45 6e 63 6f 64 69 6e 67   char *zEncoding
3320: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 2d 2d 75 74   = 0;    /* --ut
3330: 66 31 36 62 65 20 6f 72 20 2d 2d 75 74 66 31 36  f16be or --utf16
3340: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 65 61  le */.  int nHea
3350: 70 20 3d 20 30 2c 20 6d 6e 48 65 61 70 20 3d 20  p = 0, mnHeap = 
3360: 30 3b 20 20 20 20 2f 2a 20 48 65 61 70 20 73 69  0;    /* Heap si
3370: 7a 65 20 66 72 6f 6d 20 2d 2d 68 65 61 70 20 2a  ze from --heap *
3380: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 20 3d 20  /.  int nLook = 
3390: 30 2c 20 73 7a 4c 6f 6f 6b 20 3d 20 30 3b 20 20  0, szLook = 0;  
33a0: 20 20 2f 2a 20 2d 2d 6c 6f 6f 6b 61 73 69 64 65    /* --lookaside
33b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
33c0: 2f 0a 20 20 69 6e 74 20 6e 50 43 61 63 68 65 20  /.  int nPCache 
33d0: 3d 20 30 2c 20 73 7a 50 43 61 63 68 65 20 3d 20  = 0, szPCache = 
33e0: 30 3b 2f 2a 20 2d 2d 70 63 61 63 68 65 20 63 6f  0;/* --pcache co
33f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20  nfiguration */. 
3400: 20 69 6e 74 20 6e 53 63 72 61 74 63 68 20 3d 20   int nScratch = 
3410: 30 2c 20 73 7a 53 63 72 61 74 63 68 3d 30 3b 2f  0, szScratch=0;/
3420: 2a 20 2d 2d 73 63 72 61 74 63 68 20 63 6f 6e 66  * --scratch conf
3430: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  iguration */.  i
3440: 6e 74 20 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  nt pageSize = 0;
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3460: 44 65 73 69 72 65 64 20 70 61 67 65 20 73 69 7a  Desired page siz
3470: 65 2e 20 20 30 20 6d 65 61 6e 73 20 64 65 66 61  e.  0 means defa
3480: 75 6c 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ult */.  void *p
3490: 48 65 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  Heap = 0;       
34a0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
34b0: 74 65 64 20 68 65 61 70 20 73 70 61 63 65 20 2a  ted heap space *
34c0: 2f 0a 20 20 76 6f 69 64 20 2a 70 4c 6f 6f 6b 20  /.  void *pLook 
34d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
34e0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 6c    /* Allocated l
34f0: 6f 6f 6b 61 73 69 64 65 20 73 70 61 63 65 20 2a  ookaside space *
3500: 2f 0a 20 20 76 6f 69 64 20 2a 70 50 43 61 63 68  /.  void *pPCach
3510: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
3520: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
3530: 74 6f 72 61 67 65 20 66 6f 72 20 70 63 61 63 68  torage for pcach
3540: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 53 63  e */.  void *pSc
3550: 72 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20 20  ratch = 0;      
3560: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
3570: 64 20 73 74 6f 72 61 67 65 20 66 6f 72 20 73 63  d storage for sc
3580: 72 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 64  ratch */.  int d
3590: 6f 41 75 74 6f 76 61 63 20 3d 20 30 3b 20 20 20  oAutovac = 0;   
35a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
35b0: 20 66 6f 72 20 2d 2d 61 75 74 6f 76 61 63 75 75   for --autovacuu
35c0: 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71  m */.  char *zSq
35d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
35e0: 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 72       /* SQL to r
35f0: 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  un */.  char *zT
3600: 6f 46 72 65 65 20 3d 20 30 3b 20 20 20 20 20 20  oFree = 0;      
3610: 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73 71        /* Call sq
3620: 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20  lite3_free() on 
3630: 74 68 69 73 20 61 66 74 65 20 72 75 6e 6e 69 6e  this afte runnin
3640: 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e 74 20  g zSql */.  int 
3650: 76 65 72 62 6f 73 65 46 6c 61 67 20 3d 20 30 3b  verboseFlag = 0;
3660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 76            /* --v
3670: 65 72 62 6f 73 65 20 6f 72 20 2d 76 20 66 6c 61  erbose or -v fla
3680: 67 20 2a 2f 0a 20 20 69 6e 74 20 71 75 69 65 74  g */.  int quiet
3690: 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Flag = 0;       
36a0: 20 20 20 20 20 2f 2a 20 2d 2d 71 75 69 65 74 20       /* --quiet 
36b0: 6f 72 20 2d 71 20 66 6c 61 67 20 2a 2f 0a 20 20  or -q flag */.  
36c0: 69 6e 74 20 6e 54 65 73 74 20 3d 20 30 3b 20 20  int nTest = 0;  
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36e0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20   Number of test 
36f0: 63 61 73 65 73 20 72 75 6e 20 2a 2f 0a 20 20 69  cases run */.  i
3700: 6e 74 20 6d 75 6c 74 69 54 65 73 74 20 3d 20 30  nt multiTest = 0
3710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3720: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 77 69  True if there wi
3730: 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 74  ll be multiple t
3740: 65 73 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 69  est cases */.  i
3750: 6e 74 20 6c 61 73 74 50 63 74 20 3d 20 2d 31 3b  nt lastPct = -1;
3760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3770: 50 72 65 76 69 6f 75 73 20 70 65 72 63 65 6e 74  Previous percent
3780: 61 67 65 20 64 6f 6e 65 20 6f 75 74 70 75 74 20  age done output 
3790: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 61  */.  sqlite3 *da
37a0: 74 61 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  taDb = 0;       
37b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
37c0: 6f 6c 64 69 6e 67 20 63 6f 6d 70 61 63 74 65 64  olding compacted
37d0: 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20   input data */. 
37e0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
37f0: 53 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  Stmt = 0;      /
3800: 2a 20 53 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  * Statement to i
3810: 6e 73 65 72 74 20 74 65 73 74 63 61 73 65 20 69  nsert testcase i
3820: 6e 74 6f 20 64 61 74 61 44 62 20 2a 2f 0a 20 20  nto dataDb */.  
3830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
3840: 61 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  aOut = 0;     /*
3850: 20 57 72 69 74 65 20 63 6f 6d 70 61 63 74 65 64   Write compacted
3860: 20 64 61 74 61 20 74 6f 20 74 68 69 73 20 6f 75   data to this ou
3870: 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69  tput file */.  i
3880: 6e 74 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 20  nt nHeader = 0; 
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38a0: 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20  Bytes of header 
38b0: 63 6f 6d 6d 65 6e 74 20 74 65 78 74 20 6f 6e 20  comment text on 
38c0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
38d0: 69 6e 74 20 6f 6f 6d 46 6c 61 67 20 3d 20 30 3b  int oomFlag = 0;
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38f0: 20 2d 2d 6f 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20   --oom */.  int 
3900: 6f 6f 6d 43 6e 74 20 3d 20 30 3b 20 20 20 20 20  oomCnt = 0;     
3910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
3920: 6e 74 65 72 20 66 6f 72 20 74 68 65 20 4f 4f 4d  nter for the OOM
3930: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61 72 20   loop */.  char 
3940: 7a 45 72 72 42 75 66 5b 32 30 30 5d 3b 20 20 20  zErrBuf[200];   
3950: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
3960: 65 20 66 6f 72 20 74 68 65 20 65 72 72 6f 72 20  e for the error 
3970: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 63 6f 6e  message */.  con
3980: 73 74 20 63 68 61 72 20 2a 7a 46 61 69 6c 43 6f  st char *zFailCo
3990: 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61  de;        /* Va
39a0: 6c 75 65 20 6f 66 20 74 68 65 20 54 45 53 54 5f  lue of the TEST_
39b0: 46 41 49 4c 55 52 45 20 65 6e 76 69 72 6f 6e 6d  FAILURE environm
39c0: 65 6e 74 20 76 61 72 20 2a 2f 0a 20 20 63 6f 6e  ent var */.  con
39d0: 73 74 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74  st char *zPrompt
39e0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
39f0: 69 74 69 61 6c 20 70 72 6f 6d 70 74 20 77 68 65  itial prompt whe
3a00: 6e 20 6c 61 72 67 65 2d 66 69 6c 65 20 66 75 7a  n large-file fuz
3a10: 7a 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  zing */.  int nI
3a20: 6e 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20  nFile = 0;      
3a30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3a40: 72 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 73  r of input files
3a50: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 63 68   to read */.  ch
3a60: 61 72 20 2a 2a 61 7a 49 6e 46 69 6c 65 20 3d 20  ar **azInFile = 
3a70: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  0;          /* A
3a80: 72 72 61 79 20 6f 66 20 69 6e 70 75 74 20 66 69  rray of input fi
3a90: 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  le names */.  in
3aa0: 74 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20 20  t jj;           
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3ac0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 66 6f 72 20  oop counter for 
3ad0: 61 7a 49 6e 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20  azInFile[] */.  
3ae0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
3af0: 65 67 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  egin;         /*
3b00: 20 53 74 61 72 74 20 74 69 6d 65 20 66 6f 72 20   Start time for 
3b10: 74 68 65 20 77 68 6f 6c 65 20 70 72 6f 67 72 61  the whole progra
3b20: 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  m */.  sqlite3_i
3b30: 6e 74 36 34 20 69 53 74 61 72 74 2c 20 69 45 6e  nt64 iStart, iEn
3b40: 64 3b 20 20 20 2f 2a 20 53 74 61 72 74 20 61 6e  d;   /* Start an
3b50: 64 20 65 6e 64 2d 74 69 6d 65 73 20 66 6f 72 20  d end-times for 
3b60: 61 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20  a test case */. 
3b70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
3b80: 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  Name = 0;      /
3b90: 2a 20 4e 61 6d 65 20 6f 66 20 61 6e 20 6f 6e 2d  * Name of an on-
3ba0: 64 69 73 6b 20 64 61 74 61 62 61 73 65 20 66 69  disk database fi
3bb0: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 0a 20  le to open */.. 
3bc0: 20 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66   iBegin = timeOf
3bd0: 44 61 79 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  Day();.  sqlite3
3be0: 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 7a  _shutdown();.  z
3bf0: 46 61 69 6c 43 6f 64 65 20 3d 20 67 65 74 65 6e  FailCode = geten
3c00: 76 28 22 54 45 53 54 5f 46 41 49 4c 55 52 45 22  v("TEST_FAILURE"
3c10: 29 3b 0a 20 20 67 2e 7a 41 72 67 76 30 20 3d 20  );.  g.zArgv0 = 
3c20: 61 72 67 76 5b 30 5d 3b 0a 20 20 7a 50 72 6f 6d  argv[0];.  zProm
3c30: 70 74 20 3d 20 22 3c 73 74 64 69 6e 3e 22 3b 0a  pt = "<stdin>";.
3c40: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
3c50: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
3c60: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67  st char *z = arg
3c70: 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b  v[i];.    if( z[
3c80: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
3c90: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
3ca0: 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[0]=='-' ) z++;
3cb0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
3cc0: 70 28 7a 2c 22 61 75 74 6f 76 61 63 75 75 6d 22  p(z,"autovacuum"
3cd0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3ce0: 64 6f 41 75 74 6f 76 61 63 20 3d 20 31 3b 0a 20  doAutovac = 1;. 
3cf0: 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
3d00: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 64   if( strcmp(z,"d
3d10: 61 74 61 62 61 73 65 22 29 3d 3d 30 20 29 7b 0a  atabase")==0 ){.
3d20: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61          if( i>=a
3d30: 72 67 63 2d 31 20 29 20 61 62 65 6e 64 45 72 72  rgc-1 ) abendErr
3d40: 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75  or("missing argu
3d50: 6d 65 6e 74 20 6f 6e 20 25 73 5c 6e 22 2c 20 61  ment on %s\n", a
3d60: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
3d70: 20 7a 44 62 4e 61 6d 65 20 3d 20 61 72 67 76 5b   zDbName = argv[
3d80: 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 20  i+1];.        i 
3d90: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 1;.      }els
3da0: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
3db0: 6d 70 28 7a 2c 22 64 69 73 61 62 6c 65 2d 6c 6f  mp(z,"disable-lo
3dc0: 6f 6b 61 73 69 64 65 22 29 3d 3d 30 20 29 7b 0a  okaside")==0 ){.
3dd0: 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 20 3d 20          nLook = 
3de0: 31 3b 0a 20 20 20 20 20 20 20 20 73 7a 4c 6f 6f  1;.        szLoo
3df0: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  k = 0;.      }el
3e00: 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
3e10: 63 6d 70 28 7a 2c 20 22 66 22 29 3d 3d 30 20 26  cmp(z, "f")==0 &
3e20: 26 20 69 2b 31 3c 61 72 67 63 20 29 7b 0a 20 20  & i+1<argc ){.  
3e30: 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
3e40: 20 20 20 67 6f 74 6f 20 61 64 64 4e 65 77 49 6e     goto addNewIn
3e50: 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  File;.      }els
3e60: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
3e70: 6d 70 28 7a 2c 22 68 65 61 70 22 29 3d 3d 30 20  mp(z,"heap")==0 
3e80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
3e90: 3e 3d 61 72 67 63 2d 32 20 29 20 61 62 65 6e 64  >=argc-2 ) abend
3ea0: 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  Error("missing a
3eb0: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 5c 6e  rguments on %s\n
3ec0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
3ed0: 20 20 20 20 20 6e 48 65 61 70 20 3d 20 69 6e 74       nHeap = int
3ee0: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 69  egerValue(argv[i
3ef0: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 6d 6e  +1]);.        mn
3f00: 48 65 61 70 20 3d 20 69 6e 74 65 67 65 72 56 61  Heap = integerVa
3f10: 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d 29 3b 0a  lue(argv[i+2]);.
3f20: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a          i += 2;.
3f30: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
3f40: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
3f50: 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  help")==0 ){.   
3f60: 20 20 20 20 20 73 68 6f 77 48 65 6c 70 28 29 3b       showHelp();
3f70: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3f80: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  0;.      }else. 
3f90: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
3fa0: 7a 2c 22 6c 6f 6f 6b 61 73 69 64 65 22 29 3d 3d  z,"lookaside")==
3fb0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
3fc0: 20 69 3e 3d 61 72 67 63 2d 32 20 29 20 61 62 65   i>=argc-2 ) abe
3fd0: 6e 64 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  ndError("missing
3fe0: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73   arguments on %s
3ff0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
4000: 20 20 20 20 20 6e 4c 6f 6f 6b 20 3d 20 69 6e 74       nLook = int
4010: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 69  egerValue(argv[i
4020: 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  +1]);.        sz
4030: 4c 6f 6f 6b 20 3d 20 69 6e 74 65 67 65 72 56 61  Look = integerVa
4040: 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d 29 3b 0a  lue(argv[i+2]);.
4050: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a          i += 2;.
4060: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
4070: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
4080: 6f 6f 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  oom")==0 ){.    
4090: 20 20 20 20 6f 6f 6d 46 6c 61 67 20 3d 20 31 3b      oomFlag = 1;
40a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
40b0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
40c0: 22 70 61 67 65 73 69 7a 65 22 29 3d 3d 30 20 29  "pagesize")==0 )
40d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
40e0: 3d 61 72 67 63 2d 31 20 29 20 61 62 65 6e 64 45  =argc-1 ) abendE
40f0: 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72  rror("missing ar
4100: 67 75 6d 65 6e 74 20 6f 6e 20 25 73 22 2c 20 61  gument on %s", a
4110: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
4120: 20 70 61 67 65 53 69 7a 65 20 3d 20 69 6e 74 65   pageSize = inte
4130: 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b  gerValue(argv[++
4140: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  i]);.      }else
4150: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
4160: 70 28 7a 2c 22 70 63 61 63 68 65 22 29 3d 3d 30  p(z,"pcache")==0
4170: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
4180: 69 3e 3d 61 72 67 63 2d 32 20 29 20 61 62 65 6e  i>=argc-2 ) aben
4190: 64 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20  dError("missing 
41a0: 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 22  arguments on %s"
41b0: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
41c0: 20 20 20 20 6e 50 43 61 63 68 65 20 3d 20 69 6e      nPCache = in
41d0: 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b  tegerValue(argv[
41e0: 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  i+1]);.        s
41f0: 7a 50 43 61 63 68 65 20 3d 20 69 6e 74 65 67 65  zPCache = intege
4200: 72 56 61 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d  rValue(argv[i+2]
4210: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
4220: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  2;.      }else. 
4230: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
4240: 7a 2c 22 71 75 69 65 74 22 29 3d 3d 30 20 7c 7c  z,"quiet")==0 ||
4250: 20 73 74 72 63 6d 70 28 7a 2c 22 71 22 29 3d 3d   strcmp(z,"q")==
4260: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 71 75 69  0 ){.        qui
4270: 65 74 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  etFlag = 1;.    
4280: 20 20 20 20 76 65 72 62 6f 73 65 46 6c 61 67 20      verboseFlag 
4290: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
42a0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
42b0: 70 28 7a 2c 22 73 63 72 61 74 63 68 22 29 3d 3d  p(z,"scratch")==
42c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
42d0: 20 69 3e 3d 61 72 67 63 2d 32 20 29 20 61 62 65   i>=argc-2 ) abe
42e0: 6e 64 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  ndError("missing
42f0: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73   arguments on %s
4300: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
4310: 20 20 20 20 20 6e 53 63 72 61 74 63 68 20 3d 20       nScratch = 
4320: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
4330: 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20  v[i+1]);.       
4340: 20 73 7a 53 63 72 61 74 63 68 20 3d 20 69 6e 74   szScratch = int
4350: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 69  egerValue(argv[i
4360: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 20  +2]);.        i 
4370: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
4380: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
4390: 6d 70 28 7a 2c 20 22 75 6e 69 71 75 65 2d 63 61  mp(z, "unique-ca
43a0: 73 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ses")==0 ){.    
43b0: 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d      if( i>=argc-
43c0: 31 20 29 20 61 62 65 6e 64 45 72 72 6f 72 28 22  1 ) abendError("
43d0: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
43e0: 73 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69  s on %s", argv[i
43f0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
4400: 7a 44 61 74 61 4f 75 74 20 29 20 61 62 65 6e 64  zDataOut ) abend
4410: 45 72 72 6f 72 28 22 6f 6e 6c 79 20 6f 6e 65 20  Error("only one 
4420: 2d 2d 6d 69 6e 69 6d 69 7a 65 20 61 6c 6c 6f 77  --minimize allow
4430: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 7a 44  ed");.        zD
4440: 61 74 61 4f 75 74 20 3d 20 61 72 67 76 5b 2b 2b  ataOut = argv[++
4450: 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  i];.      }else.
4460: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
4470: 28 7a 2c 22 75 74 66 31 36 6c 65 22 29 3d 3d 30  (z,"utf16le")==0
4480: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 63   ){.        zEnc
4490: 6f 64 69 6e 67 20 3d 20 22 75 74 66 31 36 6c 65  oding = "utf16le
44a0: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  ";.      }else. 
44b0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
44c0: 7a 2c 22 75 74 66 31 36 62 65 22 29 3d 3d 30 20  z,"utf16be")==0 
44d0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 6e 63 6f  ){.        zEnco
44e0: 64 69 6e 67 20 3d 20 22 75 74 66 31 36 62 65 22  ding = "utf16be"
44f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
4500: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
4510: 2c 22 76 65 72 62 6f 73 65 22 29 3d 3d 30 20 7c  ,"verbose")==0 |
4520: 7c 20 73 74 72 63 6d 70 28 7a 2c 22 76 22 29 3d  | strcmp(z,"v")=
4530: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 71 75  =0 ){.        qu
4540: 69 65 74 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20  ietFlag = 0;.   
4550: 20 20 20 20 20 76 65 72 62 6f 73 65 46 6c 61 67       verboseFlag
4560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
4570: 65 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  e.      {.      
4580: 20 20 61 62 65 6e 64 45 72 72 6f 72 28 22 75 6e    abendError("un
4590: 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
45a0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
45b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
45c0: 20 20 20 20 20 20 61 64 64 4e 65 77 49 6e 46 69        addNewInFi
45d0: 6c 65 3a 0a 20 20 20 20 20 20 6e 49 6e 46 69 6c  le:.      nInFil
45e0: 65 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 49 6e 46  e++;.      azInF
45f0: 69 6c 65 20 3d 20 72 65 61 6c 6c 6f 63 28 61 7a  ile = realloc(az
4600: 49 6e 46 69 6c 65 2c 20 73 69 7a 65 6f 66 28 61  InFile, sizeof(a
4610: 7a 49 6e 46 69 6c 65 5b 30 5d 29 2a 6e 49 6e 46  zInFile[0])*nInF
4620: 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ile);.      if( 
4630: 61 7a 49 6e 46 69 6c 65 3d 3d 30 20 29 20 61 62  azInFile==0 ) ab
4640: 65 6e 64 45 72 72 6f 72 28 22 6f 75 74 20 6f 66  endError("out of
4650: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20   memory");.     
4660: 20 61 7a 49 6e 46 69 6c 65 5b 6e 49 6e 46 69 6c   azInFile[nInFil
4670: 65 2d 31 5d 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  e-1] = argv[i];.
4680: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
4690: 44 6f 20 67 6c 6f 62 61 6c 20 53 51 4c 69 74 65  Do global SQLite
46a0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
46b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  */.  sqlite3_con
46c0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
46d0: 47 5f 4c 4f 47 2c 20 76 65 72 62 6f 73 65 46 6c  G_LOG, verboseFl
46e0: 61 67 20 3f 20 73 68 65 6c 6c 4c 6f 67 20 3a 20  ag ? shellLog : 
46f0: 73 68 65 6c 6c 4c 6f 67 4e 6f 6f 70 2c 20 30 29  shellLogNoop, 0)
4700: 3b 0a 20 20 69 66 28 20 6e 48 65 61 70 3e 30 20  ;.  if( nHeap>0 
4710: 29 7b 0a 20 20 20 20 70 48 65 61 70 20 3d 20 6d  ){.    pHeap = m
4720: 61 6c 6c 6f 63 28 20 6e 48 65 61 70 20 29 3b 0a  alloc( nHeap );.
4730: 20 20 20 20 69 66 28 20 70 48 65 61 70 3d 3d 30      if( pHeap==0
4740: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63   ) fatalError("c
4750: 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 25  annot allocate %
4760: 64 2d 62 79 74 65 20 68 65 61 70 5c 6e 22 2c 20  d-byte heap\n", 
4770: 6e 48 65 61 70 29 3b 0a 20 20 20 20 72 63 20 3d  nHeap);.    rc =
4780: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
4790: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
47a0: 41 50 2c 20 70 48 65 61 70 2c 20 6e 48 65 61 70  AP, pHeap, nHeap
47b0: 2c 20 6d 6e 48 65 61 70 29 3b 0a 20 20 20 20 69  , mnHeap);.    i
47c0: 66 28 20 72 63 20 29 20 61 62 65 6e 64 45 72 72  f( rc ) abendErr
47d0: 6f 72 28 22 68 65 61 70 20 63 6f 6e 66 69 67 75  or("heap configu
47e0: 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a 20 25  ration failed: %
47f0: 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  d\n", rc);.  }. 
4800: 20 69 66 28 20 6f 6f 6d 46 6c 61 67 20 29 7b 0a   if( oomFlag ){.
4810: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66      sqlite3_conf
4820: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
4830: 5f 47 45 54 4d 41 4c 4c 4f 43 2c 20 26 67 2e 73  _GETMALLOC, &g.s
4840: 4f 72 69 67 4d 65 6d 29 3b 0a 20 20 20 20 67 2e  OrigMem);.    g.
4850: 73 4f 6f 6d 4d 65 6d 20 3d 20 67 2e 73 4f 72 69  sOomMem = g.sOri
4860: 67 4d 65 6d 3b 0a 20 20 20 20 67 2e 73 4f 6f 6d  gMem;.    g.sOom
4870: 4d 65 6d 2e 78 4d 61 6c 6c 6f 63 20 3d 20 6f 6f  Mem.xMalloc = oo
4880: 6d 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20 67 2e 73  mMalloc;.    g.s
4890: 4f 6f 6d 4d 65 6d 2e 78 52 65 61 6c 6c 6f 63 20  OomMem.xRealloc 
48a0: 3d 20 6f 6f 6d 52 65 61 6c 6c 6f 63 3b 0a 20 20  = oomRealloc;.  
48b0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
48c0: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
48d0: 41 4c 4c 4f 43 2c 20 26 67 2e 73 4f 6f 6d 4d 65  ALLOC, &g.sOomMe
48e0: 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c  m);.  }.  if( nL
48f0: 6f 6f 6b 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  ook>0 ){.    sql
4900: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
4910: 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  TE_CONFIG_LOOKAS
4920: 49 44 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  IDE, 0, 0);.    
4930: 69 66 28 20 73 7a 4c 6f 6f 6b 3e 30 20 29 7b 0a  if( szLook>0 ){.
4940: 20 20 20 20 20 20 70 4c 6f 6f 6b 20 3d 20 6d 61        pLook = ma
4950: 6c 6c 6f 63 28 20 6e 4c 6f 6f 6b 2a 73 7a 4c 6f  lloc( nLook*szLo
4960: 6f 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ok );.      if( 
4970: 70 4c 6f 6f 6b 3d 3d 30 20 29 20 66 61 74 61 6c  pLook==0 ) fatal
4980: 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d 65  Error("out of me
4990: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 7d 0a 20 20  mory");.    }.  
49a0: 7d 0a 20 20 69 66 28 20 6e 53 63 72 61 74 63 68  }.  if( nScratch
49b0: 3e 30 20 26 26 20 73 7a 53 63 72 61 74 63 68 3e  >0 && szScratch>
49c0: 30 20 29 7b 0a 20 20 20 20 70 53 63 72 61 74 63  0 ){.    pScratc
49d0: 68 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 53 63 72  h = malloc( nScr
49e0: 61 74 63 68 2a 28 73 71 6c 69 74 65 33 5f 69 6e  atch*(sqlite3_in
49f0: 74 36 34 29 73 7a 53 63 72 61 74 63 68 20 29 3b  t64)szScratch );
4a00: 0a 20 20 20 20 69 66 28 20 70 53 63 72 61 74 63  .    if( pScratc
4a10: 68 3d 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f  h==0 ) fatalErro
4a20: 72 28 22 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61  r("cannot alloca
4a30: 74 65 20 25 6c 6c 64 2d 62 79 74 65 20 73 63 72  te %lld-byte scr
4a40: 61 74 63 68 22 2c 0a 20 20 20 20 20 20 20 20 20  atch",.         
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a60: 20 20 20 20 20 20 20 20 6e 53 63 72 61 74 63 68          nScratch
4a70: 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
4a80: 73 7a 53 63 72 61 74 63 68 29 3b 0a 20 20 20 20  szScratch);.    
4a90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  rc = sqlite3_con
4aa0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
4ab0: 47 5f 53 43 52 41 54 43 48 2c 20 70 53 63 72 61  G_SCRATCH, pScra
4ac0: 74 63 68 2c 20 73 7a 53 63 72 61 74 63 68 2c 20  tch, szScratch, 
4ad0: 6e 53 63 72 61 74 63 68 29 3b 0a 20 20 20 20 69  nScratch);.    i
4ae0: 66 28 20 72 63 20 29 20 61 62 65 6e 64 45 72 72  f( rc ) abendErr
4af0: 6f 72 28 22 73 63 72 61 74 63 68 20 63 6f 6e 66  or("scratch conf
4b00: 69 67 75 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  iguration failed
4b10: 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  : %d\n", rc);.  
4b20: 7d 0a 20 20 69 66 28 20 6e 50 43 61 63 68 65 3e  }.  if( nPCache>
4b30: 30 20 26 26 20 73 7a 50 43 61 63 68 65 3e 30 20  0 && szPCache>0 
4b40: 29 7b 0a 20 20 20 20 70 50 43 61 63 68 65 20 3d  ){.    pPCache =
4b50: 20 6d 61 6c 6c 6f 63 28 20 6e 50 43 61 63 68 65   malloc( nPCache
4b60: 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
4b70: 73 7a 50 43 61 63 68 65 20 29 3b 0a 20 20 20 20  szPCache );.    
4b80: 69 66 28 20 70 50 43 61 63 68 65 3d 3d 30 20 29  if( pPCache==0 )
4b90: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e   fatalError("can
4ba0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 25 6c 6c  not allocate %ll
4bb0: 64 2d 62 79 74 65 20 70 63 61 63 68 65 22 2c 0a  d-byte pcache",.
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 6e 50 43 61 63 68 65 2a 28 73 71 6c 69 74 65   nPCache*(sqlite
4bf0: 33 5f 69 6e 74 36 34 29 73 7a 50 43 61 63 68 65  3_int64)szPCache
4c00: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
4c10: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
4c20: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
4c30: 48 45 2c 20 70 50 43 61 63 68 65 2c 20 73 7a 50  HE, pPCache, szP
4c40: 43 61 63 68 65 2c 20 6e 50 43 61 63 68 65 29 3b  Cache, nPCache);
4c50: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 61 62  .    if( rc ) ab
4c60: 65 6e 64 45 72 72 6f 72 28 22 70 63 61 63 68 65  endError("pcache
4c70: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66   configuration f
4c80: 61 69 6c 65 64 3a 20 25 64 22 2c 20 72 63 29 3b  ailed: %d", rc);
4c90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
4ca0: 65 20 2d 2d 75 6e 69 71 75 65 2d 63 61 73 65 73  e --unique-cases
4cb0: 20 6f 70 74 69 6f 6e 20 77 61 73 20 73 75 70 70   option was supp
4cc0: 6c 69 65 64 2c 20 6f 70 65 6e 20 74 68 65 20 64  lied, open the d
4cd0: 61 74 61 62 61 73 65 20 74 68 61 74 20 77 69 6c  atabase that wil
4ce0: 6c 0a 20 20 2a 2a 20 62 65 20 75 73 65 64 20 74  l.  ** be used t
4cf0: 6f 20 67 61 74 68 65 72 20 75 6e 69 71 75 65 20  o gather unique 
4d00: 74 65 73 74 20 63 61 73 65 73 2e 0a 20 20 2a 2f  test cases..  */
4d10: 0a 20 20 69 66 28 20 7a 44 61 74 61 4f 75 74 20  .  if( zDataOut 
4d20: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4d30: 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d 6f 72  te3_open(":memor
4d40: 79 3a 22 2c 20 26 64 61 74 61 44 62 29 3b 0a 20  y:", &dataDb);. 
4d50: 20 20 20 69 66 28 20 72 63 20 29 20 61 62 65 6e     if( rc ) aben
4d60: 64 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f  dError("cannot o
4d70: 70 65 6e 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  pen :memory: dat
4d80: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 72 63 20  abase");.    rc 
4d90: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
4da0: 61 74 61 44 62 2c 0a 20 20 20 20 20 20 20 20 20  ataDb,.         
4db0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   "CREATE TABLE t
4dc0: 65 73 74 63 61 73 65 28 73 71 6c 20 42 4c 4f 42  estcase(sql BLOB
4dd0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 6d   PRIMARY KEY, tm
4de0: 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 3b  ) WITHOUT ROWID;
4df0: 22 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 69 66  ",0,0,0);.    if
4e00: 28 20 72 63 20 29 20 61 62 65 6e 64 45 72 72 6f  ( rc ) abendErro
4e10: 72 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  r("%s", sqlite3_
4e20: 65 72 72 6d 73 67 28 64 61 74 61 44 62 29 29 3b  errmsg(dataDb));
4e30: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
4e40: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 61 74  3_prepare_v2(dat
4e50: 61 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  aDb,.          "
4e60: 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45  INSERT OR IGNORE
4e70: 20 49 4e 54 4f 20 74 65 73 74 63 61 73 65 28 73   INTO testcase(s
4e80: 71 6c 2c 74 6d 29 56 41 4c 55 45 53 28 3f 31 2c  ql,tm)VALUES(?1,
4e90: 3f 32 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ?2)",.          
4ea0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
4eb0: 20 20 20 20 69 66 28 20 72 63 20 29 20 61 62 65      if( rc ) abe
4ec0: 6e 64 45 72 72 6f 72 28 22 25 73 22 2c 20 73 71  ndError("%s", sq
4ed0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 61 74  lite3_errmsg(dat
4ee0: 61 44 62 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  aDb));.  }..  /*
4ef0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
4f00: 69 6e 70 75 74 20 62 75 66 66 65 72 20 75 73 65  input buffer use
4f10: 64 20 74 6f 20 68 6f 6c 64 20 53 51 4c 20 74 65  d to hold SQL te
4f20: 78 74 20 2a 2f 0a 20 20 69 66 28 20 6e 49 6e 46  xt */.  if( nInF
4f30: 69 6c 65 3d 3d 30 20 29 20 6e 49 6e 46 69 6c 65  ile==0 ) nInFile
4f40: 20 3d 20 31 3b 0a 20 20 6e 41 6c 6c 6f 63 20 3d   = 1;.  nAlloc =
4f50: 20 31 30 30 30 3b 0a 20 20 7a 49 6e 20 3d 20 6d   1000;.  zIn = m
4f60: 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20  alloc(nAlloc);. 
4f70: 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 66 61   if( zIn==0 ) fa
4f80: 74 61 6c 45 72 72 6f 72 28 22 6f 75 74 20 6f 66  talError("out of
4f90: 20 6d 65 6d 6f 72 79 22 29 3b 0a 0a 20 20 2f 2a   memory");..  /*
4fa0: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
4fb0: 6e 70 75 74 20 66 69 6c 65 73 20 2a 2f 0a 20 20  nput files */.  
4fc0: 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 6e 49 6e  for(jj=0; jj<nIn
4fd0: 46 69 6c 65 3b 20 6a 6a 2b 2b 29 7b 0a 0a 20 20  File; jj++){..  
4fe0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 6f    /* Read the co
4ff0: 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
5000: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 70 75 74  f the next input
5010: 20 66 69 6c 65 20 69 6e 74 6f 20 7a 49 6e 5b 5d   file into zIn[]
5020: 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20 2a 69 6e   */.    FILE *in
5030: 3b 0a 20 20 20 20 69 66 28 20 61 7a 49 6e 46 69  ;.    if( azInFi
5040: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  le ){.      int 
5050: 6a 2c 20 6b 3b 0a 20 20 20 20 20 20 69 6e 20 3d  j, k;.      in =
5060: 20 66 6f 70 65 6e 28 61 7a 49 6e 46 69 6c 65 5b   fopen(azInFile[
5070: 6a 6a 5d 2c 22 72 62 22 29 3b 0a 20 20 20 20 20  jj],"rb");.     
5080: 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
5090: 20 20 20 20 20 20 61 62 65 6e 64 45 72 72 6f 72        abendError
50a0: 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 25 73  ("cannot open %s
50b0: 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20 61   for reading", a
50c0: 7a 49 6e 46 69 6c 65 5b 6a 6a 5d 29 3b 0a 20 20  zInFile[jj]);.  
50d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f      }.      zPro
50e0: 6d 70 74 20 3d 20 61 7a 49 6e 46 69 6c 65 5b 6a  mpt = azInFile[j
50f0: 6a 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  j];.      for(j=
5100: 6b 3d 30 3b 20 7a 50 72 6f 6d 70 74 5b 6a 5d 3b  k=0; zPrompt[j];
5110: 20 6a 2b 2b 29 20 69 66 28 20 7a 50 72 6f 6d 70   j++) if( zPromp
5120: 74 5b 6a 5d 3d 3d 27 2f 27 20 29 20 6b 20 3d 20  t[j]=='/' ) k = 
5130: 6a 2b 31 3b 0a 20 20 20 20 20 20 7a 50 72 6f 6d  j+1;.      zProm
5140: 70 74 20 2b 3d 20 6b 3b 0a 20 20 20 20 7d 65 6c  pt += k;.    }el
5150: 73 65 7b 0a 20 20 20 20 20 20 69 6e 20 3d 20 73  se{.      in = s
5160: 74 64 69 6e 3b 0a 20 20 20 20 20 20 7a 50 72 6f  tdin;.      zPro
5170: 6d 70 74 20 3d 20 22 3c 73 74 64 69 6e 3e 22 3b  mpt = "<stdin>";
5180: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
5190: 28 20 21 66 65 6f 66 28 69 6e 29 20 29 7b 0a 20  ( !feof(in) ){. 
51a0: 20 20 20 20 20 67 6f 74 20 3d 20 66 72 65 61 64       got = fread
51b0: 28 7a 49 6e 2b 6e 49 6e 2c 20 31 2c 20 6e 41 6c  (zIn+nIn, 1, nAl
51c0: 6c 6f 63 2d 6e 49 6e 2d 31 2c 20 69 6e 29 3b 20  loc-nIn-1, in); 
51d0: 0a 20 20 20 20 20 20 6e 49 6e 20 2b 3d 20 28 69  .      nIn += (i
51e0: 6e 74 29 67 6f 74 3b 0a 20 20 20 20 20 20 7a 49  nt)got;.      zI
51f0: 6e 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  n[nIn] = 0;.    
5200: 20 20 69 66 28 20 67 6f 74 3d 3d 30 20 29 20 62    if( got==0 ) b
5210: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
5220: 6e 41 6c 6c 6f 63 20 2d 20 6e 49 6e 20 2d 20 31  nAlloc - nIn - 1
5230: 20 3c 20 31 30 30 20 29 7b 0a 20 20 20 20 20 20   < 100 ){.      
5240: 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 6e 41 6c 6c    nAlloc += nAll
5250: 6f 63 2b 31 30 30 30 3b 0a 20 20 20 20 20 20 20  oc+1000;.       
5260: 20 7a 49 6e 20 3d 20 72 65 61 6c 6c 6f 63 28 7a   zIn = realloc(z
5270: 49 6e 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20  In, nAlloc);.   
5280: 20 20 20 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20       if( zIn==0 
5290: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6f 75  ) fatalError("ou
52a0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
52b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
52c0: 20 69 66 28 20 69 6e 21 3d 73 74 64 69 6e 20 29   if( in!=stdin )
52d0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
52e0: 20 6c 61 73 74 50 63 74 20 3d 20 2d 31 3b 0a 0a   lastPct = -1;..
52f0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 69 6e 69 74      /* Skip init
5300: 69 61 6c 20 6c 69 6e 65 73 20 6f 66 20 74 68 65  ial lines of the
5310: 20 69 6e 70 75 74 20 66 69 6c 65 20 74 68 61 74   input file that
5320: 20 62 65 67 69 6e 20 77 69 74 68 20 22 23 22 20   begin with "#" 
5330: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
5340: 69 3c 6e 49 6e 3b 20 69 3d 69 4e 65 78 74 2b 31  i<nIn; i=iNext+1
5350: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e  ){.      if( zIn
5360: 5b 69 5d 21 3d 27 23 27 20 29 20 62 72 65 61 6b  [i]!='#' ) break
5370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4e 65 78  ;.      for(iNex
5380: 74 3d 69 2b 31 3b 20 69 4e 65 78 74 3c 6e 49 6e  t=i+1; iNext<nIn
5390: 20 26 26 20 7a 49 6e 5b 69 4e 65 78 74 5d 21 3d   && zIn[iNext]!=
53a0: 27 5c 6e 27 3b 20 69 4e 65 78 74 2b 2b 29 7b 7d  '\n'; iNext++){}
53b0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 48 65 61 64  .    }.    nHead
53c0: 65 72 20 3d 20 69 3b 0a 0a 20 20 20 20 2f 2a 20  er = i;..    /* 
53d0: 50 72 6f 63 65 73 73 20 61 6c 6c 20 74 65 73 74  Process all test
53e0: 20 63 61 73 65 73 20 63 6f 6e 74 61 69 6e 65 64   cases contained
53f0: 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e 70 75   within the inpu
5400: 74 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  t file..    */. 
5410: 20 20 20 66 6f 72 28 3b 20 69 3c 6e 49 6e 3b 20     for(; i<nIn; 
5420: 69 3d 69 4e 65 78 74 2c 20 6e 54 65 73 74 2b 2b  i=iNext, nTest++
5430: 2c 20 67 2e 7a 54 65 73 74 4e 61 6d 65 5b 30 5d  , g.zTestName[0]
5440: 3d 30 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  =0){.      char 
5450: 63 53 61 76 65 64 3b 0a 20 20 20 20 20 20 69 66  cSaved;.      if
5460: 28 20 73 74 72 6e 63 6d 70 28 26 7a 49 6e 5b 69  ( strncmp(&zIn[i
5470: 5d 2c 20 22 2f 2a 2a 2a 2a 3c 22 2c 36 29 3d 3d  ], "/****<",6)==
5480: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
5490: 72 20 2a 7a 20 3d 20 73 74 72 73 74 72 28 26 7a  r *z = strstr(&z
54a0: 49 6e 5b 69 5d 2c 20 22 3e 2a 2a 2a 2a 2f 22 29  In[i], ">****/")
54b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 20  ;.        if( z 
54c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 20 2b  ){.          z +
54d0: 3d 20 36 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 6;.          s
54e0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
54f0: 73 69 7a 65 6f 66 28 67 2e 7a 54 65 73 74 4e 61  sizeof(g.zTestNa
5500: 6d 65 29 2c 20 67 2e 7a 54 65 73 74 4e 61 6d 65  me), g.zTestName
5510: 2c 20 22 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20  , "%.*s", .     
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 20 28 69 6e 74 29 28 7a 2d 26 7a        (int)(z-&z
5540: 49 6e 5b 69 5d 29 20 2d 20 31 32 2c 20 26 7a 49  In[i]) - 12, &zI
5550: 6e 5b 69 2b 36 5d 29 3b 0a 20 20 20 20 20 20 20  n[i+6]);.       
5560: 20 20 20 69 66 28 20 76 65 72 62 6f 73 65 46 6c     if( verboseFl
5570: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
5580: 20 20 70 72 69 6e 74 66 28 22 25 2e 2a 73 5c 6e    printf("%.*s\n
5590: 22 2c 20 28 69 6e 74 29 28 7a 2d 26 7a 49 6e 5b  ", (int)(z-&zIn[
55a0: 69 5d 29 2c 20 26 7a 49 6e 5b 69 5d 29 3b 0a 20  i]), &zIn[i]);. 
55b0: 20 20 20 20 20 20 20 20 20 20 20 66 66 6c 75 73             fflus
55c0: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
55d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
55e0: 20 69 20 2b 3d 20 28 69 6e 74 29 28 7a 2d 26 7a   i += (int)(z-&z
55f0: 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  In[i]);.        
5600: 20 20 6d 75 6c 74 69 54 65 73 74 20 3d 20 31 3b    multiTest = 1;
5610: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5620: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 4e 65   }.      for(iNe
5630: 78 74 3d 69 3b 20 69 4e 65 78 74 3c 6e 49 6e 20  xt=i; iNext<nIn 
5640: 26 26 20 73 74 72 6e 63 6d 70 28 26 7a 49 6e 5b  && strncmp(&zIn[
5650: 69 4e 65 78 74 5d 2c 22 2f 2a 2a 2a 2a 3c 22 2c  iNext],"/****<",
5660: 36 29 21 3d 30 3b 20 69 4e 65 78 74 2b 2b 29 7b  6)!=0; iNext++){
5670: 7d 0a 20 20 20 20 20 20 63 53 61 76 65 64 20 3d  }.      cSaved =
5680: 20 7a 49 6e 5b 69 4e 65 78 74 5d 3b 0a 20 20 20   zIn[iNext];.   
5690: 20 20 20 7a 49 6e 5b 69 4e 65 78 74 5d 20 3d 20     zIn[iNext] = 
56a0: 30 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 50 72  0;...      /* Pr
56b0: 69 6e 74 20 6f 75 74 20 74 68 65 20 53 51 4c 20  int out the SQL 
56c0: 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65 73 74  of the next test
56d0: 20 63 61 73 65 20 69 73 20 2d 2d 76 65 72 62 6f   case is --verbo
56e0: 73 65 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 20  se is enabled.  
56f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 7a 53 71      */.      zSq
5700: 6c 20 3d 20 26 7a 49 6e 5b 69 5d 3b 0a 20 20 20  l = &zIn[i];.   
5710: 20 20 20 69 66 28 20 76 65 72 62 6f 73 65 46 6c     if( verboseFl
5720: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  ag ){.        pr
5730: 69 6e 74 66 28 22 49 4e 50 55 54 20 28 6f 66 66  intf("INPUT (off
5740: 73 65 74 3a 20 25 64 2c 20 73 69 7a 65 3a 20 25  set: %d, size: %
5750: 64 29 3a 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20  d): [%s]\n",.   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2c 20               i, 
5770: 28 69 6e 74 29 73 74 72 6c 65 6e 28 26 7a 49 6e  (int)strlen(&zIn
5780: 5b 69 5d 29 2c 20 26 7a 49 6e 5b 69 5d 29 3b 0a  [i]), &zIn[i]);.
5790: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
57a0: 6d 75 6c 74 69 54 65 73 74 20 26 26 20 21 71 75  multiTest && !qu
57b0: 69 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  ietFlag ){.     
57c0: 20 20 20 69 66 28 20 6f 6f 6d 46 6c 61 67 20 29     if( oomFlag )
57d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e  {.          prin
57e0: 74 66 28 22 25 73 5c 6e 22 2c 20 67 2e 7a 54 65  tf("%s\n", g.zTe
57f0: 73 74 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  stName);.       
5800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5810: 20 20 69 6e 74 20 70 63 74 20 3d 20 28 31 30 2a    int pct = (10*
5820: 69 4e 65 78 74 29 2f 6e 49 6e 3b 0a 20 20 20 20  iNext)/nIn;.    
5830: 20 20 20 20 20 20 69 66 28 20 70 63 74 21 3d 6c        if( pct!=l
5840: 61 73 74 50 63 74 20 29 7b 0a 20 20 20 20 20 20  astPct ){.      
5850: 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 50 63        if( lastPc
5860: 74 3c 30 20 29 20 70 72 69 6e 74 66 28 22 25 73  t<0 ) printf("%s
5870: 3a 22 2c 20 7a 50 72 6f 6d 70 74 29 3b 0a 20 20  :", zPrompt);.  
5880: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
5890: 28 22 20 25 64 25 25 22 2c 20 70 63 74 2a 31 30  (" %d%%", pct*10
58a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  );.            l
58b0: 61 73 74 50 63 74 20 3d 20 70 63 74 3b 0a 20 20  astPct = pct;.  
58c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
58d0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
58e0: 69 66 28 20 6e 49 6e 46 69 6c 65 3e 31 20 29 7b  if( nInFile>1 ){
58f0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
5900: 22 25 73 5c 6e 22 2c 20 7a 50 72 6f 6d 70 74 29  "%s\n", zPrompt)
5910: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5920: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
5930: 0a 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 74 68  .      /* Run th
5940: 65 20 6e 65 78 74 20 74 65 73 74 20 63 61 73 65  e next test case
5950: 2e 20 20 52 75 6e 20 69 74 20 6d 75 6c 74 69 70  .  Run it multip
5960: 6c 65 20 74 69 6d 65 73 20 69 6e 20 2d 2d 6f 6f  le times in --oo
5970: 6d 20 6d 6f 64 65 0a 20 20 20 20 20 20 2a 2f 0a  m mode.      */.
5980: 20 20 20 20 20 20 69 66 28 20 6f 6f 6d 46 6c 61        if( oomFla
5990: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6f 6d  g ){.        oom
59a0: 43 6e 74 20 3d 20 67 2e 69 4f 6f 6d 43 6e 74 64  Cnt = g.iOomCntd
59b0: 6f 77 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  own = 1;.       
59c0: 20 67 2e 6e 4f 6f 6d 46 61 75 6c 74 20 3d 20 30   g.nOomFault = 0
59d0: 3b 0a 20 20 20 20 20 20 20 20 67 2e 62 4f 6f 6d  ;.        g.bOom
59e0: 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Once = 1;.      
59f0: 20 20 69 66 28 20 76 65 72 62 6f 73 65 46 6c 61    if( verboseFla
5a00: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
5a10: 72 69 6e 74 66 28 22 4f 6e 63 65 2e 25 64 5c 6e  rintf("Once.%d\n
5a20: 22 2c 20 6f 6f 6d 43 6e 74 29 3b 0a 20 20 20 20  ", oomCnt);.    
5a30: 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64        fflush(std
5a40: 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  out);.        }.
5a50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5a60: 20 20 20 20 20 6f 6f 6d 43 6e 74 20 3d 20 30 3b       oomCnt = 0;
5a70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
5a80: 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  o{.        if( z
5a90: 44 62 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  DbName ){.      
5aa0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5ab0: 5f 6f 70 65 6e 5f 76 32 28 7a 44 62 4e 61 6d 65  _open_v2(zDbName
5ac0: 2c 20 26 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50  , &db, SQLITE_OP
5ad0: 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 30 29  EN_READWRITE, 0)
5ae0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5af0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 62 65  .            abe
5b10: 6e 64 45 72 72 6f 72 28 22 43 61 6e 6e 6f 74 20  ndError("Cannot 
5b20: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
5b30: 6c 65 20 25 73 22 2c 20 7a 44 62 4e 61 6d 65 29  le %s", zDbName)
5b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5b50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5b60: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
5b70: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 20  te3_open_v2(.   
5b80: 20 20 20 20 20 20 20 20 20 22 6d 61 69 6e 2e 64           "main.d
5b90: 62 22 2c 20 26 64 62 2c 0a 20 20 20 20 20 20 20  b", &db,.       
5ba0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
5bb0: 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
5bc0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
5bd0: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  | SQLITE_OPEN_ME
5be0: 4d 4f 52 59 2c 0a 20 20 20 20 20 20 20 20 20 20  MORY,.          
5bf0: 20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20    0);.          
5c00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5c10: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
5c20: 20 61 62 65 6e 64 45 72 72 6f 72 28 22 55 6e 61   abendError("Una
5c30: 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
5c40: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5c50: 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  se");.          
5c60: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
5c70: 20 20 20 20 69 66 28 20 70 4c 6f 6f 6b 20 29 7b      if( pLook ){
5c80: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
5c90: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
5ca0: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
5cb0: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 2c  ONFIG_LOOKASIDE,
5cc0: 70 4c 6f 6f 6b 2c 73 7a 4c 6f 6f 6b 2c 6e 4c 6f  pLook,szLook,nLo
5cd0: 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ok);.          i
5ce0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5cf0: 20 29 20 61 62 65 6e 64 45 72 72 6f 72 28 22 6c   ) abendError("l
5d00: 6f 6f 6b 61 73 69 64 65 20 63 6f 6e 66 69 67 75  ookaside configu
5d10: 72 61 74 69 6f 6e 20 66 69 6c 65 64 3a 20 25 64  ration filed: %d
5d20: 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  ", rc);.        
5d30: 7d 0a 20 20 20 20 23 69 66 6e 64 65 66 20 53 51  }.    #ifndef SQ
5d40: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
5d50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5d60: 74 72 61 63 65 28 64 62 2c 20 76 65 72 62 6f 73  trace(db, verbos
5d70: 65 46 6c 61 67 20 3f 20 74 72 61 63 65 43 61 6c  eFlag ? traceCal
5d80: 6c 62 61 63 6b 20 3a 20 74 72 61 63 65 4e 6f 6f  lback : traceNoo
5d90: 70 2c 20 30 29 3b 0a 20 20 20 20 23 65 6e 64 69  p, 0);.    #endi
5da0: 66 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  f.        sqlite
5db0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
5dc0: 6e 28 64 62 2c 20 22 65 76 61 6c 22 2c 20 31 2c  n(db, "eval", 1,
5dd0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
5de0: 20 73 71 6c 45 76 61 6c 46 75 6e 63 2c 20 30 2c   sqlEvalFunc, 0,
5df0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
5e00: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
5e10: 74 69 6f 6e 28 64 62 2c 20 22 65 76 61 6c 22 2c  tion(db, "eval",
5e20: 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
5e30: 20 30 2c 20 73 71 6c 45 76 61 6c 46 75 6e 63 2c   0, sqlEvalFunc,
5e40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
5e50: 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62  sqlite3_limit(db
5e60: 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  , SQLITE_LIMIT_L
5e70: 45 4e 47 54 48 2c 20 31 30 30 30 30 30 30 29 3b  ENGTH, 1000000);
5e80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 45 6e  .        if( zEn
5e90: 63 6f 64 69 6e 67 20 29 20 73 71 6c 65 78 65 63  coding ) sqlexec
5ea0: 28 64 62 2c 20 22 50 52 41 47 4d 41 20 65 6e 63  (db, "PRAGMA enc
5eb0: 6f 64 69 6e 67 3d 25 73 22 2c 20 7a 45 6e 63 6f  oding=%s", zEnco
5ec0: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 69  ding);.        i
5ed0: 66 28 20 70 61 67 65 53 69 7a 65 20 29 20 73 71  f( pageSize ) sq
5ee0: 6c 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d  lexec(db, "PRAGM
5ef0: 41 20 70 61 67 65 73 69 7a 65 3d 25 64 22 2c 20  A pagesize=%d", 
5f00: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
5f10: 20 20 20 69 66 28 20 64 6f 41 75 74 6f 76 61 63     if( doAutovac
5f20: 20 29 20 73 71 6c 65 78 65 63 28 64 62 2c 20 22   ) sqlexec(db, "
5f30: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
5f40: 75 6d 3d 46 55 4c 4c 22 29 3b 0a 20 20 20 20 20  um=FULL");.     
5f50: 20 20 20 69 53 74 61 72 74 20 3d 20 74 69 6d 65     iStart = time
5f60: 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 20 20 20  OfDay();.       
5f70: 20 67 2e 62 4f 6f 6d 45 6e 61 62 6c 65 20 3d 20   g.bOomEnable = 
5f80: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  1;.        if( v
5f90: 65 72 62 6f 73 65 46 6c 61 67 20 29 7b 0a 20 20  erboseFlag ){.  
5fa0: 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20          zErrMsg 
5fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
5fc0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
5fd0: 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 43  (db, zSql, execC
5fe0: 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 26 7a 45 72  allback, 0, &zEr
5ff0: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
6000: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
6010: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6020: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
6030: 65 6f 66 28 7a 45 72 72 42 75 66 29 2c 7a 45 72  eof(zErrBuf),zEr
6040: 72 42 75 66 2c 22 25 7a 22 2c 20 7a 45 72 72 4d  rBuf,"%z", zErrM
6050: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
6060: 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
6070: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6080: 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20    }else {.      
6090: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
60a0: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
60b0: 65 78 65 63 4e 6f 6f 70 2c 20 30 2c 20 30 29 3b  execNoop, 0, 0);
60c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
60d0: 20 20 20 67 2e 62 4f 6f 6d 45 6e 61 62 6c 65 20     g.bOomEnable 
60e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 45 6e  = 0;.        iEn
60f0: 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b  d = timeOfDay();
6100: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
6110: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
6120: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
6130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 62 65  ){.          abe
6140: 6e 64 45 72 72 6f 72 28 22 73 71 6c 69 74 65 33  ndError("sqlite3
6150: 5f 63 6c 6f 73 65 28 29 20 66 61 69 6c 65 64 20  _close() failed 
6160: 77 69 74 68 20 72 63 3d 25 64 22 2c 20 72 63 29  with rc=%d", rc)
6170: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6180: 20 20 20 20 69 66 28 20 21 7a 44 61 74 61 4f 75      if( !zDataOu
6190: 74 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65 6d  t && sqlite3_mem
61a0: 6f 72 79 5f 75 73 65 64 28 29 3e 30 20 29 7b 0a  ory_used()>0 ){.
61b0: 20 20 20 20 20 20 20 20 20 20 61 62 65 6e 64 45            abendE
61c0: 72 72 6f 72 28 22 6d 65 6d 6f 72 79 20 69 6e 20  rror("memory in 
61d0: 75 73 65 20 61 66 74 65 72 20 63 6c 6f 73 65 3a  use after close:
61e0: 20 25 6c 6c 64 20 62 79 74 65 73 22 2c 73 71 6c   %lld bytes",sql
61f0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
6200: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ());.        }. 
6210: 20 20 20 20 20 20 20 69 66 28 20 6f 6f 6d 46 6c         if( oomFl
6220: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
6230: 2f 2a 20 4c 69 6d 69 74 20 74 68 65 20 6e 75 6d  /* Limit the num
6240: 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f 6e  ber of iteration
6250: 73 20 6f 66 20 74 68 65 20 4f 4f 4d 20 6c 6f 6f  s of the OOM loo
6260: 70 20 74 6f 20 4f 4f 4d 5f 4d 41 58 2e 20 20 49  p to OOM_MAX.  I
6270: 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  f the.          
6280: 2a 2a 20 66 69 72 73 74 20 70 61 73 73 20 28 73  ** first pass (s
6290: 69 6e 67 6c 65 20 66 61 69 6c 75 72 65 29 20 65  ingle failure) e
62a0: 78 63 65 65 64 73 20 32 2f 33 72 64 73 20 6f 66  xceeds 2/3rds of
62b0: 20 4f 4f 4d 5f 4d 41 58 20 74 68 69 73 20 73 6b   OOM_MAX this sk
62c0: 69 70 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ip the.         
62d0: 20 2a 2a 20 73 65 63 6f 6e 64 20 70 61 73 73 20   ** second pass 
62e0: 28 63 6f 6e 74 69 6e 75 6f 75 73 20 66 61 69 6c  (continuous fail
62f0: 75 72 65 20 61 66 74 65 72 20 66 69 72 73 74 29  ure after first)
6300: 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 20 2a 2f 0a   completely. */.
6310: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 67 2e            if( g.
6320: 6e 4f 6f 6d 46 61 75 6c 74 3d 3d 30 20 7c 7c 20  nOomFault==0 || 
6330: 6f 6f 6d 43 6e 74 3e 4f 4f 4d 5f 4d 41 58 20 29  oomCnt>OOM_MAX )
6340: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
6350: 28 20 67 2e 62 4f 6f 6d 4f 6e 63 65 20 26 26 20  ( g.bOomOnce && 
6360: 6f 6f 6d 43 6e 74 3c 3d 28 4f 4f 4d 5f 4d 41 58  oomCnt<=(OOM_MAX
6370: 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 20  *2/3) ){.       
6380: 20 20 20 20 20 20 20 6f 6f 6d 43 6e 74 20 3d 20         oomCnt = 
6390: 67 2e 69 4f 6f 6d 43 6e 74 64 6f 77 6e 20 3d 20  g.iOomCntdown = 
63a0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
63b0: 20 67 2e 62 4f 6f 6d 4f 6e 63 65 20 3d 20 30 3b   g.bOomOnce = 0;
63c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
63d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
63e0: 20 20 6f 6f 6d 43 6e 74 20 3d 20 30 3b 0a 20 20    oomCnt = 0;.  
63f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6400: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6410: 20 20 20 20 20 20 20 20 20 67 2e 69 4f 6f 6d 43           g.iOomC
6420: 6e 74 64 6f 77 6e 20 3d 20 2b 2b 6f 6f 6d 43 6e  ntdown = ++oomCn
6430: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  t;.            g
6440: 2e 6e 4f 6f 6d 46 61 75 6c 74 20 3d 20 30 3b 0a  .nOomFault = 0;.
6450: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6460: 20 20 20 20 20 20 69 66 28 20 6f 6f 6d 43 6e 74        if( oomCnt
6470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6480: 69 66 28 20 76 65 72 62 6f 73 65 46 6c 61 67 20  if( verboseFlag 
6490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
64a0: 20 70 72 69 6e 74 66 28 22 25 73 2e 25 64 5c 6e   printf("%s.%d\n
64b0: 22 2c 20 67 2e 62 4f 6f 6d 4f 6e 63 65 20 3f 20  ", g.bOomOnce ? 
64c0: 22 4f 6e 63 65 22 20 3a 20 22 4d 75 6c 74 69 22  "Once" : "Multi"
64d0: 2c 20 6f 6f 6d 43 6e 74 29 3b 0a 20 20 20 20 20  , oomCnt);.     
64e0: 20 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28           fflush(
64f0: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  stdout);.       
6500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6510: 20 20 20 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20     nTest++;.    
6520: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6530: 7d 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  }.      }while( 
6540: 6f 6f 6d 43 6e 74 3e 30 20 29 3b 0a 0a 20 20 20  oomCnt>0 );..   
6550: 20 20 20 2f 2a 20 53 74 6f 72 65 20 75 6e 69 71     /* Store uniq
6560: 75 65 20 74 65 73 74 20 63 61 73 65 73 20 69 6e  ue test cases in
6570: 20 74 68 65 20 69 6e 20 74 68 65 20 64 61 74 61   the in the data
6580: 44 62 20 64 61 74 61 62 61 73 65 20 69 66 20 74  Db database if t
6590: 68 65 0a 20 20 20 20 20 20 2a 2a 20 2d 2d 75 6e  he.      ** --un
65a0: 69 71 75 65 2d 63 61 73 65 73 20 66 6c 61 67 20  ique-cases flag 
65b0: 69 73 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20  is present.     
65c0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 44   */.      if( zD
65d0: 61 74 61 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ataOut ){.      
65e0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
65f0: 6c 6f 62 28 70 53 74 6d 74 2c 20 31 2c 20 26 7a  lob(pStmt, 1, &z
6600: 49 6e 5b 69 5d 2c 20 69 4e 65 78 74 2d 69 2c 20  In[i], iNext-i, 
6610: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6630: 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74  bind_int64(pStmt
6640: 2c 20 32 2c 20 69 45 6e 64 20 2d 20 69 53 74 61  , 2, iEnd - iSta
6650: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rt);.        rc 
6660: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
6670: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Stmt);.        i
6680: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
6690: 4e 45 20 29 20 61 62 65 6e 64 45 72 72 6f 72 28  NE ) abendError(
66a0: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
66b0: 72 6d 73 67 28 64 61 74 61 44 62 29 29 3b 0a 20  rmsg(dataDb));. 
66c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
66d0: 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  eset(pStmt);.   
66e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
66f0: 72 65 65 20 74 68 65 20 53 51 4c 20 66 72 6f 6d  ree the SQL from
6700: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 73   the current tes
6710: 74 20 63 61 73 65 0a 20 20 20 20 20 20 2a 2f 0a  t case.      */.
6720: 20 20 20 20 20 20 69 66 28 20 7a 54 6f 46 72 65        if( zToFre
6730: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
6740: 69 74 65 33 5f 66 72 65 65 28 7a 54 6f 46 72 65  ite3_free(zToFre
6750: 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 54 6f 46  e);.        zToF
6760: 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ree = 0;.      }
6770: 0a 20 20 20 20 20 20 7a 49 6e 5b 69 4e 65 78 74  .      zIn[iNext
6780: 5d 20 3d 20 63 53 61 76 65 64 3b 0a 0a 20 20 20  ] = cSaved;..   
6790: 20 20 20 2f 2a 20 53 68 6f 77 20 74 65 73 74 2d     /* Show test-
67a0: 63 61 73 65 20 72 65 73 75 6c 74 73 20 69 6e 20  case results in 
67b0: 2d 2d 76 65 72 62 6f 73 65 20 6d 6f 64 65 0a 20  --verbose mode. 
67c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
67d0: 28 20 76 65 72 62 6f 73 65 46 6c 61 67 20 29 7b  ( verboseFlag ){
67e0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
67f0: 22 52 45 53 55 4c 54 2d 43 4f 44 45 3a 20 25 64  "RESULT-CODE: %d
6800: 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
6810: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
6820: 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
6830: 66 28 22 45 52 52 4f 52 2d 4d 53 47 3a 20 5b 25  f("ERROR-MSG: [%
6840: 73 5d 5c 6e 22 2c 20 7a 45 72 72 42 75 66 29 3b  s]\n", zErrBuf);
6850: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6860: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
6870: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
6880: 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 20 61 6e    /* Simulate an
6890: 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 54 45   error if the TE
68a0: 53 54 5f 46 41 49 4c 55 52 45 20 65 6e 76 69 72  ST_FAILURE envir
68b0: 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20  onment variable 
68c0: 69 73 20 22 35 22 2e 0a 20 20 20 20 20 20 2a 2a  is "5"..      **
68d0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
68e0: 20 76 65 72 69 66 79 20 74 68 61 74 20 61 75 74   verify that aut
68f0: 6f 6d 61 74 65 64 20 74 65 73 74 20 73 63 72 69  omated test scri
6900: 70 74 20 72 65 61 6c 6c 79 20 64 6f 20 73 70 6f  pt really do spo
6910: 74 0a 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72  t.      ** error
6920: 73 20 74 68 61 74 20 6f 63 63 75 72 20 69 6e 20  s that occur in 
6930: 74 68 69 73 20 74 65 73 74 20 70 72 6f 67 72 61  this test progra
6940: 6d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  m..      */.    
6950: 20 20 69 66 28 20 7a 46 61 69 6c 43 6f 64 65 20    if( zFailCode 
6960: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
6970: 46 61 69 6c 43 6f 64 65 5b 30 5d 3d 3d 27 35 27  FailCode[0]=='5'
6980: 20 26 26 20 7a 46 61 69 6c 43 6f 64 65 5b 31 5d   && zFailCode[1]
6990: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
69a0: 20 61 62 65 6e 64 45 72 72 6f 72 28 22 73 69 6d   abendError("sim
69b0: 75 6c 61 74 65 64 20 66 61 69 6c 75 72 65 22 29  ulated failure")
69c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
69d0: 69 66 28 20 7a 46 61 69 6c 43 6f 64 65 5b 30 5d  if( zFailCode[0]
69e0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
69f0: 20 2f 2a 20 49 66 20 54 45 53 54 5f 46 41 49 4c   /* If TEST_FAIL
6a00: 55 52 45 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  URE is something
6a10: 20 6f 74 68 65 72 20 74 68 61 6e 20 35 2c 20 6a   other than 5, j
6a20: 75 73 74 20 65 78 69 74 20 74 68 65 20 74 65 73  ust exit the tes
6a30: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  t.          ** e
6a40: 61 72 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  arly */.        
6a50: 20 20 70 72 69 6e 74 66 28 22 5c 6e 45 78 69 74    printf("\nExit
6a60: 20 65 61 72 6c 79 20 64 75 65 20 74 6f 20 54 45   early due to TE
6a70: 53 54 5f 46 41 49 4c 55 52 45 20 62 65 69 6e 67  ST_FAILURE being
6a80: 20 73 65 74 22 29 3b 0a 20 20 20 20 20 20 20 20   set");.        
6a90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6aa0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6ab0: 0a 20 20 20 20 69 66 28 20 21 76 65 72 62 6f 73  .    if( !verbos
6ac0: 65 46 6c 61 67 20 26 26 20 6d 75 6c 74 69 54 65  eFlag && multiTe
6ad0: 73 74 20 26 26 20 21 71 75 69 65 74 46 6c 61 67  st && !quietFlag
6ae0: 20 26 26 20 21 6f 6f 6d 46 6c 61 67 20 29 20 70   && !oomFlag ) p
6af0: 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
6b00: 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 6f  ..  /* Report to
6b10: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  tal number of te
6b20: 73 74 73 20 72 75 6e 0a 20 20 2a 2f 0a 20 20 69  sts run.  */.  i
6b30: 66 28 20 6e 54 65 73 74 3e 31 20 26 26 20 21 71  f( nTest>1 && !q
6b40: 75 69 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  uietFlag ){.    
6b50: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
6b60: 6c 61 70 73 65 20 3d 20 74 69 6d 65 4f 66 44 61  lapse = timeOfDa
6b70: 79 28 29 20 2d 20 69 42 65 67 69 6e 3b 0a 20 20  y() - iBegin;.  
6b80: 20 20 70 72 69 6e 74 66 28 22 25 73 3a 20 30 20    printf("%s: 0 
6b90: 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25 64  errors out of %d
6ba0: 20 74 65 73 74 73 20 69 6e 20 25 64 2e 25 30 33   tests in %d.%03
6bb0: 64 20 73 65 63 6f 6e 64 73 5c 6e 53 51 4c 69 74  d seconds\nSQLit
6bc0: 65 20 25 73 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e %s %s\n",.    
6bd0: 20 20 20 20 20 20 20 67 2e 7a 41 72 67 76 30 2c         g.zArgv0,
6be0: 20 6e 54 65 73 74 2c 20 28 69 6e 74 29 28 69 45   nTest, (int)(iE
6bf0: 6c 61 70 73 65 2f 31 30 30 30 29 2c 20 28 69 6e  lapse/1000), (in
6c00: 74 29 28 69 45 6c 61 70 73 65 25 31 30 30 30 29  t)(iElapse%1000)
6c10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,.           sql
6c20: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28  ite3_libversion(
6c30: 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  ), sqlite3_sourc
6c40: 65 69 64 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eid());.  }..  /
6c50: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 69 71  * Write the uniq
6c60: 75 65 20 74 65 73 74 20 63 61 73 65 73 20 69 66  ue test cases if
6c70: 20 74 68 65 20 2d 2d 75 6e 69 71 75 65 2d 63 61   the --unique-ca
6c80: 73 65 73 20 66 6c 61 67 20 77 61 73 20 75 73 65  ses flag was use
6c90: 64 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44 61  d.  */.  if( zDa
6ca0: 74 61 4f 75 74 20 29 7b 0a 20 20 20 20 69 6e 74  taOut ){.    int
6cb0: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 46 49 4c 45   n = 0;.    FILE
6cc0: 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 7a 44   *out = fopen(zD
6cd0: 61 74 61 4f 75 74 2c 20 22 77 62 22 29 3b 0a 20  ataOut, "wb");. 
6ce0: 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 20     if( out==0 ) 
6cf0: 61 62 65 6e 64 45 72 72 6f 72 28 22 63 61 6e 6e  abendError("cann
6d00: 6f 74 20 6f 70 65 6e 20 25 73 20 66 6f 72 20 77  ot open %s for w
6d10: 72 69 74 69 6e 67 22 2c 20 7a 44 61 74 61 4f 75  riting", zDataOu
6d20: 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 48 65 61  t);.    if( nHea
6d30: 64 65 72 3e 30 20 29 20 66 77 72 69 74 65 28 7a  der>0 ) fwrite(z
6d40: 49 6e 2c 20 6e 48 65 61 64 65 72 2c 20 31 2c 20  In, nHeader, 1, 
6d50: 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  out);.    sqlite
6d60: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
6d70: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
6d80: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
6d90: 61 74 61 44 62 2c 20 22 53 45 4c 45 43 54 20 73  ataDb, "SELECT s
6da0: 71 6c 2c 20 74 6d 20 46 52 4f 4d 20 74 65 73 74  ql, tm FROM test
6db0: 63 61 73 65 20 4f 52 44 45 52 20 42 59 20 74 6d  case ORDER BY tm
6dc0: 2c 20 73 71 6c 22 2c 0a 20 20 20 20 20 20 20 20  , sql",.        
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
6df0: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
6e00: 20 61 62 65 6e 64 45 72 72 6f 72 28 22 25 73 22   abendError("%s"
6e10: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
6e20: 28 64 61 74 61 44 62 29 29 3b 0a 20 20 20 20 77  (dataDb));.    w
6e30: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
6e40: 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
6e50: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66  E_ROW ){.      f
6e60: 70 72 69 6e 74 66 28 6f 75 74 2c 22 2f 2a 2a 2a  printf(out,"/***
6e70: 2a 3c 25 64 3a 25 64 6d 73 3e 2a 2a 2a 2a 2f 22  *<%d:%dms>****/"
6e80: 2c 20 2b 2b 6e 2c 20 73 71 6c 69 74 65 33 5f 63  , ++n, sqlite3_c
6e90: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
6ea0: 31 29 29 3b 0a 20 20 20 20 20 20 66 77 72 69 74  1));.      fwrit
6eb0: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  e(sqlite3_column
6ec0: 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 73  _blob(pStmt,0),s
6ed0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
6ee0: 74 65 73 28 70 53 74 6d 74 2c 30 29 2c 31 2c 6f  tes(pStmt,0),1,o
6ef0: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ut);.    }.    f
6f00: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
6f10: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6f20: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c  (pStmt);.    sql
6f30: 69 74 65 33 5f 63 6c 6f 73 65 28 64 61 74 61 44  ite3_close(dataD
6f40: 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  b);.  }..  /* Cl
6f50: 65 61 6e 20 75 70 20 61 6e 64 20 65 78 69 74 2e  ean up and exit.
6f60: 0a 20 20 2a 2f 0a 20 20 66 72 65 65 28 61 7a 49  .  */.  free(azI
6f70: 6e 46 69 6c 65 29 3b 0a 20 20 66 72 65 65 28 7a  nFile);.  free(z
6f80: 49 6e 29 3b 0a 20 20 66 72 65 65 28 70 48 65 61  In);.  free(pHea
6f90: 70 29 3b 0a 20 20 66 72 65 65 28 70 4c 6f 6f 6b  p);.  free(pLook
6fa0: 29 3b 0a 20 20 66 72 65 65 28 70 53 63 72 61 74  );.  free(pScrat
6fb0: 63 68 29 3b 0a 20 20 66 72 65 65 28 70 50 43 61  ch);.  free(pPCa
6fc0: 63 68 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  che);.  return 0
6fd0: 3b 0a 7d 0a                                      ;.}.