/ Hex Artifact Content
Login

Artifact f294ca67a10e87db76af130d75b2c94be36359c6:


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: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
24e0: 20 54 68 65 20 67 65 6e 65 72 61 74 65 5f 73 65   The generate_se
24f0: 72 69 65 73 28 53 54 41 52 54 2c 45 4e 44 2c 53  ries(START,END,S
2500: 54 45 50 29 20 65 70 6f 6e 79 6d 6f 75 73 20 74  TEP) eponymous t
2510: 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
2520: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
2530: 20 63 6f 64 65 20 69 73 20 63 6f 70 79 2f 70 61   code is copy/pa
2540: 73 74 65 64 20 66 72 6f 6d 20 65 78 74 2f 6d 69  sted from ext/mi
2550: 73 63 2f 73 65 72 69 65 73 2e 63 20 69 6e 20 74  sc/series.c in t
2560: 68 65 20 53 51 4c 69 74 65 20 73 6f 75 72 63 65  he SQLite source
2570: 20 74 72 65 65 2e 0a 2a 2f 0a 2f 2a 20 73 65 72   tree..*/./* ser
2580: 69 65 73 5f 63 75 72 73 6f 72 20 69 73 20 61 20  ies_cursor is a 
2590: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
25a0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
25b0: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 73 65  which will.** se
25c0: 72 76 65 20 61 73 20 74 68 65 20 75 6e 64 65 72  rve as the under
25d0: 6c 79 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  lying representa
25e0: 74 69 6f 6e 20 6f 66 20 61 20 63 75 72 73 6f 72  tion of a cursor
25f0: 20 74 68 61 74 20 73 63 61 6e 73 0a 2a 2a 20 6f   that scans.** o
2600: 76 65 72 20 72 6f 77 73 20 6f 66 20 74 68 65 20  ver rows of the 
2610: 72 65 73 75 6c 74 0a 2a 2f 0a 74 79 70 65 64 65  result.*/.typede
2620: 66 20 73 74 72 75 63 74 20 73 65 72 69 65 73 5f  f struct series_
2630: 63 75 72 73 6f 72 20 73 65 72 69 65 73 5f 63 75  cursor series_cu
2640: 72 73 6f 72 3b 0a 73 74 72 75 63 74 20 73 65 72  rsor;.struct ser
2650: 69 65 73 5f 63 75 72 73 6f 72 20 7b 0a 20 20 73  ies_cursor {.  s
2660: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
2670: 6f 72 20 62 61 73 65 3b 20 20 2f 2a 20 42 61 73  or base;  /* Bas
2680: 65 20 63 6c 61 73 73 20 2d 20 6d 75 73 74 20 62  e class - must b
2690: 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 69 6e 74  e first */.  int
26a0: 20 69 73 44 65 73 63 3b 20 20 20 20 20 20 20 20   isDesc;        
26b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26c0: 74 6f 20 63 6f 75 6e 74 20 64 6f 77 6e 20 72 61  to count down ra
26d0: 74 68 65 72 20 74 68 61 6e 20 75 70 20 2a 2f 0a  ther than up */.
26e0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
26f0: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 2f 2a 20  iRowid;      /* 
2700: 54 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 73  The rowid */.  s
2710: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 56 61  qlite3_int64 iVa
2720: 6c 75 65 3b 20 20 20 20 20 20 2f 2a 20 43 75 72  lue;      /* Cur
2730: 72 65 6e 74 20 76 61 6c 75 65 20 28 22 76 61 6c  rent value ("val
2740: 75 65 22 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ue") */.  sqlite
2750: 33 5f 69 6e 74 36 34 20 6d 6e 56 61 6c 75 65 3b  3_int64 mnValue;
2760: 20 20 20 20 20 2f 2a 20 4d 69 6d 69 6d 75 6d 20       /* Mimimum 
2770: 76 61 6c 75 65 20 28 22 73 74 61 72 74 22 29 20  value ("start") 
2780: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
2790: 36 34 20 6d 78 56 61 6c 75 65 3b 20 20 20 20 20  64 mxValue;     
27a0: 2f 2a 20 4d 61 78 69 6d 75 6d 20 76 61 6c 75 65  /* Maximum value
27b0: 20 28 22 73 74 6f 70 22 29 20 2a 2f 0a 20 20 73   ("stop") */.  s
27c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 74  qlite3_int64 iSt
27d0: 65 70 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 63  ep;       /* Inc
27e0: 72 65 6d 65 6e 74 20 28 22 73 74 65 70 22 29 20  rement ("step") 
27f0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
2800: 20 73 65 72 69 65 73 43 6f 6e 6e 65 63 74 28 29   seriesConnect()
2810: 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b   method is invok
2820: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
2830: 65 77 0a 2a 2a 20 73 65 72 69 65 73 5f 76 74 61  ew.** series_vta
2840: 62 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  b that describes
2850: 20 74 68 65 20 67 65 6e 65 72 61 74 65 5f 73 65   the generate_se
2860: 72 69 65 73 20 76 69 72 74 75 61 6c 20 74 61 62  ries virtual tab
2870: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 6e 6b 20  le..**.** Think 
2880: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
2890: 61 73 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74  as the construct
28a0: 6f 72 20 66 6f 72 20 73 65 72 69 65 73 5f 76 74  or for series_vt
28b0: 61 62 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a  ab objects..**.*
28c0: 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69  * All this routi
28d0: 6e 65 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 69  ne needs to do i
28e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s:.**.**    (1) 
28f0: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 65 72  Allocate the ser
2900: 69 65 73 5f 76 74 61 62 20 6f 62 6a 65 63 74 20  ies_vtab object 
2910: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2920: 6c 6c 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a  ll fields..**.**
2930: 20 20 20 20 28 32 29 20 54 65 6c 6c 20 53 51 4c      (2) Tell SQL
2940: 69 74 65 20 28 76 69 61 20 74 68 65 20 73 71 6c  ite (via the sql
2950: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
2960: 62 28 29 20 69 6e 74 65 72 66 61 63 65 29 20 77  b() interface) w
2970: 68 61 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  hat the.**      
2980: 20 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20    result set of 
2990: 71 75 65 72 69 65 73 20 61 67 61 69 6e 73 74 20  queries against 
29a0: 67 65 6e 65 72 61 74 65 5f 73 65 72 69 65 73 20  generate_series 
29b0: 77 69 6c 6c 20 6c 6f 6f 6b 20 6c 69 6b 65 2e 0a  will look like..
29c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
29d0: 72 69 65 73 43 6f 6e 6e 65 63 74 28 0a 20 20 73  riesConnect(.  s
29e0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
29f0: 69 64 20 2a 70 41 75 78 2c 0a 20 20 69 6e 74 20  id *pAux,.  int 
2a00: 61 72 67 63 2c 20 63 6f 6e 73 74 20 63 68 61 72  argc, const char
2a10: 20 2a 63 6f 6e 73 74 2a 61 72 67 76 2c 0a 20 20   *const*argv,.  
2a20: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 2a 70  sqlite3_vtab **p
2a30: 70 56 74 61 62 2c 0a 20 20 63 68 61 72 20 2a 2a  pVtab,.  char **
2a40: 70 7a 45 72 72 0a 29 7b 0a 20 20 73 71 6c 69 74  pzErr.){.  sqlit
2a50: 65 33 5f 76 74 61 62 20 2a 70 4e 65 77 3b 0a 20  e3_vtab *pNew;. 
2a60: 20 69 6e 74 20 72 63 3b 0a 0a 2f 2a 20 43 6f 6c   int rc;../* Col
2a70: 75 6d 6e 20 6e 75 6d 62 65 72 73 20 2a 2f 0a 23  umn numbers */.#
2a80: 64 65 66 69 6e 65 20 53 45 52 49 45 53 5f 43 4f  define SERIES_CO
2a90: 4c 55 4d 4e 5f 56 41 4c 55 45 20 30 0a 23 64 65  LUMN_VALUE 0.#de
2aa0: 66 69 6e 65 20 53 45 52 49 45 53 5f 43 4f 4c 55  fine SERIES_COLU
2ab0: 4d 4e 5f 53 54 41 52 54 20 31 0a 23 64 65 66 69  MN_START 1.#defi
2ac0: 6e 65 20 53 45 52 49 45 53 5f 43 4f 4c 55 4d 4e  ne SERIES_COLUMN
2ad0: 5f 53 54 4f 50 20 20 32 0a 23 64 65 66 69 6e 65  _STOP  2.#define
2ae0: 20 53 45 52 49 45 53 5f 43 4f 4c 55 4d 4e 5f 53   SERIES_COLUMN_S
2af0: 54 45 50 20 20 33 0a 0a 20 20 72 63 20 3d 20 73  TEP  3..  rc = s
2b00: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
2b10: 74 61 62 28 64 62 2c 0a 20 20 20 20 20 22 43 52  tab(db,.     "CR
2b20: 45 41 54 45 20 54 41 42 4c 45 20 78 28 76 61 6c  EATE TABLE x(val
2b30: 75 65 2c 73 74 61 72 74 20 68 69 64 64 65 6e 2c  ue,start hidden,
2b40: 73 74 6f 70 20 68 69 64 64 65 6e 2c 73 74 65 70  stop hidden,step
2b50: 20 68 69 64 64 65 6e 29 22 29 3b 0a 20 20 69 66   hidden)");.  if
2b60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b70: 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 2a 70  ){.    pNew = *p
2b80: 70 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  pVtab = sqlite3_
2b90: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
2ba0: 70 4e 65 77 29 20 29 3b 0a 20 20 20 20 69 66 28  pNew) );.    if(
2bb0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
2bc0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2bd0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c      memset(pNew,
2be0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77   0, sizeof(*pNew
2bf0: 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
2c00: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
2c10: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 74 68 65  is method is the
2c20: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
2c30: 73 65 72 69 65 73 5f 63 75 72 73 6f 72 20 6f 62  series_cursor ob
2c40: 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  jects..*/.static
2c50: 20 69 6e 74 20 73 65 72 69 65 73 44 69 73 63 6f   int seriesDisco
2c60: 6e 6e 65 63 74 28 73 71 6c 69 74 65 33 5f 76 74  nnect(sqlite3_vt
2c70: 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71  ab *pVtab){.  sq
2c80: 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62  lite3_free(pVtab
2c90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2ca0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2cb0: 43 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20  Constructor for 
2cc0: 61 20 6e 65 77 20 73 65 72 69 65 73 5f 63 75 72  a new series_cur
2cd0: 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  sor object..*/.s
2ce0: 74 61 74 69 63 20 69 6e 74 20 73 65 72 69 65 73  tatic int series
2cf0: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 74 61  Open(sqlite3_vta
2d00: 62 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  b *p, sqlite3_vt
2d10: 61 62 5f 63 75 72 73 6f 72 20 2a 2a 70 70 43 75  ab_cursor **ppCu
2d20: 72 73 6f 72 29 7b 0a 20 20 73 65 72 69 65 73 5f  rsor){.  series_
2d30: 63 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  cursor *pCur;.  
2d40: 70 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCur = sqlite3_m
2d50: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
2d60: 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
2d70: 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ur==0 ) return S
2d80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
2d90: 65 6d 73 65 74 28 70 43 75 72 2c 20 30 2c 20 73  emset(pCur, 0, s
2da0: 69 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20  izeof(*pCur));. 
2db0: 20 2a 70 70 43 75 72 73 6f 72 20 3d 20 26 70 43   *ppCursor = &pC
2dc0: 75 72 2d 3e 62 61 73 65 3b 0a 20 20 72 65 74 75  ur->base;.  retu
2dd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2de0: 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f  ./*.** Destructo
2df0: 72 20 66 6f 72 20 61 20 73 65 72 69 65 73 5f 63  r for a series_c
2e00: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
2e10: 20 69 6e 74 20 73 65 72 69 65 73 43 6c 6f 73 65   int seriesClose
2e20: 28 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75  (sqlite3_vtab_cu
2e30: 72 73 6f 72 20 2a 63 75 72 29 7b 0a 20 20 73 71  rsor *cur){.  sq
2e40: 6c 69 74 65 33 5f 66 72 65 65 28 63 75 72 29 3b  lite3_free(cur);
2e50: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2e60: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  _OK;.}.../*.** A
2e70: 64 76 61 6e 63 65 20 61 20 73 65 72 69 65 73 5f  dvance a series_
2e80: 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 6e 65  cursor to its ne
2e90: 78 74 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74  xt row of output
2ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2eb0: 73 65 72 69 65 73 4e 65 78 74 28 73 71 6c 69 74  seriesNext(sqlit
2ec0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
2ed0: 63 75 72 29 7b 0a 20 20 73 65 72 69 65 73 5f 63  cur){.  series_c
2ee0: 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73  ursor *pCur = (s
2ef0: 65 72 69 65 73 5f 63 75 72 73 6f 72 2a 29 63 75  eries_cursor*)cu
2f00: 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  r;.  if( pCur->i
2f10: 73 44 65 73 63 20 29 7b 0a 20 20 20 20 70 43 75  sDesc ){.    pCu
2f20: 72 2d 3e 69 56 61 6c 75 65 20 2d 3d 20 70 43 75  r->iValue -= pCu
2f30: 72 2d 3e 69 53 74 65 70 3b 0a 20 20 7d 65 6c 73  r->iStep;.  }els
2f40: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 56 61  e{.    pCur->iVa
2f50: 6c 75 65 20 2b 3d 20 70 43 75 72 2d 3e 69 53 74  lue += pCur->iSt
2f60: 65 70 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  ep;.  }.  pCur->
2f70: 69 52 6f 77 69 64 2b 2b 3b 0a 20 20 72 65 74 75  iRowid++;.  retu
2f80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2f90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61  ./*.** Return va
2fa0: 6c 75 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  lues of columns 
2fb0: 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77  for the row at w
2fc0: 68 69 63 68 20 74 68 65 20 73 65 72 69 65 73 5f  hich the series_
2fd0: 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
2fe0: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
2ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3000: 65 72 69 65 73 43 6f 6c 75 6d 6e 28 0a 20 20 73  eriesColumn(.  s
3010: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
3020: 6f 72 20 2a 63 75 72 2c 20 20 20 2f 2a 20 54 68  or *cur,   /* Th
3030: 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 73 71  e cursor */.  sq
3040: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3050: 74 78 2c 20 20 20 20 20 20 20 2f 2a 20 46 69 72  tx,       /* Fir
3060: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  st argument to s
3070: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 2e 2e  qlite3_result_..
3080: 2e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 69 20 20  .() */.  int i  
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a0: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 63 6f       /* Which co
30b0: 6c 75 6d 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  lumn to return *
30c0: 2f 0a 29 7b 0a 20 20 73 65 72 69 65 73 5f 63 75  /.){.  series_cu
30d0: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 65  rsor *pCur = (se
30e0: 72 69 65 73 5f 63 75 72 73 6f 72 2a 29 63 75 72  ries_cursor*)cur
30f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
3100: 34 20 78 20 3d 20 30 3b 0a 20 20 73 77 69 74 63  4 x = 0;.  switc
3110: 68 28 20 69 20 29 7b 0a 20 20 20 20 63 61 73 65  h( i ){.    case
3120: 20 53 45 52 49 45 53 5f 43 4f 4c 55 4d 4e 5f 53   SERIES_COLUMN_S
3130: 54 41 52 54 3a 20 20 78 20 3d 20 70 43 75 72 2d  TART:  x = pCur-
3140: 3e 6d 6e 56 61 6c 75 65 3b 20 62 72 65 61 6b 3b  >mnValue; break;
3150: 0a 20 20 20 20 63 61 73 65 20 53 45 52 49 45 53  .    case SERIES
3160: 5f 43 4f 4c 55 4d 4e 5f 53 54 4f 50 3a 20 20 20  _COLUMN_STOP:   
3170: 78 20 3d 20 70 43 75 72 2d 3e 6d 78 56 61 6c 75  x = pCur->mxValu
3180: 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  e; break;.    ca
3190: 73 65 20 53 45 52 49 45 53 5f 43 4f 4c 55 4d 4e  se SERIES_COLUMN
31a0: 5f 53 54 45 50 3a 20 20 20 78 20 3d 20 70 43 75  _STEP:   x = pCu
31b0: 72 2d 3e 69 53 74 65 70 3b 20 20 20 62 72 65 61  r->iStep;   brea
31c0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e0: 20 20 78 20 3d 20 70 43 75 72 2d 3e 69 56 61 6c    x = pCur->iVal
31f0: 75 65 3b 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ue;  break;.  }.
3200: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3210: 5f 69 6e 74 36 34 28 63 74 78 2c 20 78 29 3b 0a  _int64(ctx, x);.
3220: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3230: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
3240: 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 66 6f  urn the rowid fo
3250: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
3260: 77 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c  w.  In this impl
3270: 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a  ementation, the.
3280: 2a 2a 20 72 6f 77 69 64 20 69 73 20 74 68 65 20  ** rowid is the 
3290: 73 61 6d 65 20 61 73 20 74 68 65 20 6f 75 74 70  same as the outp
32a0: 75 74 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ut value..*/.sta
32b0: 74 69 63 20 69 6e 74 20 73 65 72 69 65 73 52 6f  tic int seriesRo
32c0: 77 69 64 28 73 71 6c 69 74 65 33 5f 76 74 61 62  wid(sqlite3_vtab
32d0: 5f 63 75 72 73 6f 72 20 2a 63 75 72 2c 20 73 71  _cursor *cur, sq
32e0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 52 6f 77  lite_int64 *pRow
32f0: 69 64 29 7b 0a 20 20 73 65 72 69 65 73 5f 63 75  id){.  series_cu
3300: 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28 73 65  rsor *pCur = (se
3310: 72 69 65 73 5f 63 75 72 73 6f 72 2a 29 63 75 72  ries_cursor*)cur
3320: 3b 0a 20 20 2a 70 52 6f 77 69 64 20 3d 20 70 43  ;.  *pRowid = pC
3330: 75 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 72 65  ur->iRowid;.  re
3340: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3350: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3360: 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
3370: 6f 72 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65  or has been move
3380: 64 20 6f 66 66 20 6f 66 20 74 68 65 20 6c 61 73  d off of the las
3390: 74 0a 2a 2a 20 72 6f 77 20 6f 66 20 6f 75 74 70  t.** row of outp
33a0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ut..*/.static in
33b0: 74 20 73 65 72 69 65 73 45 6f 66 28 73 71 6c 69  t seriesEof(sqli
33c0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
33d0: 2a 63 75 72 29 7b 0a 20 20 73 65 72 69 65 73 5f  *cur){.  series_
33e0: 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 28  cursor *pCur = (
33f0: 73 65 72 69 65 73 5f 63 75 72 73 6f 72 2a 29 63  series_cursor*)c
3400: 75 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  ur;.  if( pCur->
3410: 69 73 44 65 73 63 20 29 7b 0a 20 20 20 20 72 65  isDesc ){.    re
3420: 74 75 72 6e 20 70 43 75 72 2d 3e 69 56 61 6c 75  turn pCur->iValu
3430: 65 20 3c 20 70 43 75 72 2d 3e 6d 6e 56 61 6c 75  e < pCur->mnValu
3440: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3450: 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 56 61  return pCur->iVa
3460: 6c 75 65 20 3e 20 70 43 75 72 2d 3e 6d 78 56 61  lue > pCur->mxVa
3470: 6c 75 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54  lue;.  }.}../* T
3480: 72 75 65 20 74 6f 20 63 61 75 73 65 20 72 75 6e  rue to cause run
3490: 2d 74 69 6d 65 20 63 68 65 63 6b 69 6e 67 20 6f  -time checking o
34a0: 66 20 74 68 65 20 73 74 61 72 74 3d 2c 20 73 74  f the start=, st
34b0: 6f 70 3d 2c 20 61 6e 64 2f 6f 72 20 73 74 65 70  op=, and/or step
34c0: 3d 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  = .** parameters
34d0: 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73  .  The only reas
34e0: 6f 6e 20 74 6f 20 64 6f 20 74 68 69 73 20 69 73  on to do this is
34f0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65   for testing the
3500: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  .** constraint c
3510: 68 65 63 6b 69 6e 67 20 6c 6f 67 69 63 20 66 6f  hecking logic fo
3520: 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73  r virtual tables
3530: 20 69 6e 20 74 68 65 20 53 51 4c 69 74 65 20 63   in the SQLite c
3540: 6f 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ore..*/.#ifndef 
3550: 53 51 4c 49 54 45 5f 53 45 52 49 45 53 5f 43 4f  SQLITE_SERIES_CO
3560: 4e 53 54 52 41 49 4e 54 5f 56 45 52 49 46 59 0a  NSTRAINT_VERIFY.
3570: 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
3580: 53 45 52 49 45 53 5f 43 4f 4e 53 54 52 41 49 4e  SERIES_CONSTRAIN
3590: 54 5f 56 45 52 49 46 59 20 30 0a 23 65 6e 64 69  T_VERIFY 0.#endi
35a0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  f../*.** This me
35b0: 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 20 74  thod is called t
35c0: 6f 20 22 72 65 77 69 6e 64 22 20 74 68 65 20 73  o "rewind" the s
35d0: 65 72 69 65 73 5f 63 75 72 73 6f 72 20 6f 62 6a  eries_cursor obj
35e0: 65 63 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  ect back.** to t
35f0: 68 65 20 66 69 72 73 74 20 72 6f 77 20 6f 66 20  he first row of 
3600: 6f 75 74 70 75 74 2e 20 20 54 68 69 73 20 6d 65  output.  This me
3610: 74 68 6f 64 20 69 73 20 61 6c 77 61 79 73 20 63  thod is always c
3620: 61 6c 6c 65 64 20 61 74 20 6c 65 61 73 74 0a 2a  alled at least.*
3630: 2a 20 6f 6e 63 65 20 70 72 69 6f 72 20 74 6f 20  * once prior to 
3640: 61 6e 79 20 63 61 6c 6c 20 74 6f 20 73 65 72 69  any call to seri
3650: 65 73 43 6f 6c 75 6d 6e 28 29 20 6f 72 20 73 65  esColumn() or se
3660: 72 69 65 73 52 6f 77 69 64 28 29 20 6f 72 20 0a  riesRowid() or .
3670: 2a 2a 20 73 65 72 69 65 73 45 6f 66 28 29 2e 0a  ** seriesEof()..
3680: 2a 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20  **.** The query 
3690: 70 6c 61 6e 20 73 65 6c 65 63 74 65 64 20 62 79  plan selected by
36a0: 20 73 65 72 69 65 73 42 65 73 74 49 6e 64 65 78   seriesBestIndex
36b0: 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 74 68   is passed in th
36c0: 65 20 69 64 78 4e 75 6d 0a 2a 2a 20 70 61 72 61  e idxNum.** para
36d0: 6d 65 74 65 72 2e 20 20 28 69 64 78 53 74 72 20  meter.  (idxStr 
36e0: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74  is not used in t
36f0: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
3700: 6f 6e 2e 29 20 20 69 64 78 4e 75 6d 0a 2a 2a 20  on.)  idxNum.** 
3710: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 73 68 6f  is a bitmask sho
3720: 77 69 6e 67 20 77 68 69 63 68 20 63 6f 6e 73 74  wing which const
3730: 72 61 69 6e 74 73 20 61 72 65 20 61 76 61 69 6c  raints are avail
3740: 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 31  able:.**.**    1
3750: 3a 20 20 20 20 73 74 61 72 74 3d 56 41 4c 55 45  :    start=VALUE
3760: 0a 2a 2a 20 20 20 20 32 3a 20 20 20 20 73 74 6f  .**    2:    sto
3770: 70 3d 56 41 4c 55 45 0a 2a 2a 20 20 20 20 34 3a  p=VALUE.**    4:
3780: 20 20 20 20 73 74 65 70 3d 56 41 4c 55 45 0a 2a      step=VALUE.*
3790: 2a 0a 2a 2a 20 41 6c 73 6f 2c 20 69 66 20 62 69  *.** Also, if bi
37a0: 74 20 38 20 69 73 20 73 65 74 2c 20 74 68 61 74  t 8 is set, that
37b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
37c0: 73 65 72 69 65 73 20 73 68 6f 75 6c 64 20 62 65  series should be
37d0: 20 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 64 65   output.** in de
37e0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 72  scending order r
37f0: 61 74 68 65 72 20 74 68 61 6e 20 69 6e 20 61 73  ather than in as
3800: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
3810: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3820: 65 20 73 68 6f 75 6c 64 20 69 6e 69 74 69 61 6c  e should initial
3830: 69 7a 65 20 74 68 65 20 63 75 72 73 6f 72 20 61  ize the cursor a
3840: 6e 64 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 73  nd position it s
3850: 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 69 73 20  o that it.** is 
3860: 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
3870: 66 69 72 73 74 20 72 6f 77 2c 20 6f 72 20 70 6f  first row, or po
3880: 69 6e 74 69 6e 67 20 6f 66 66 20 74 68 65 20 65  inting off the e
3890: 6e 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  nd of the table.
38a0: 2a 2a 20 28 73 6f 20 74 68 61 74 20 73 65 72 69  ** (so that seri
38b0: 65 73 45 6f 66 28 29 20 77 69 6c 6c 20 72 65 74  esEof() will ret
38c0: 75 72 6e 20 74 72 75 65 29 20 69 66 20 74 68 65  urn true) if the
38d0: 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
38e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
38f0: 65 72 69 65 73 46 69 6c 74 65 72 28 0a 20 20 73  eriesFilter(.  s
3900: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
3910: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 2c  or *pVtabCursor,
3920: 20 0a 20 20 69 6e 74 20 69 64 78 4e 75 6d 2c 20   .  int idxNum, 
3930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 64 78 53  const char *idxS
3940: 74 72 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  tr,.  int argc, 
3950: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
3960: 61 72 67 76 0a 29 7b 0a 20 20 73 65 72 69 65 73  argv.){.  series
3970: 5f 63 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  _cursor *pCur = 
3980: 28 73 65 72 69 65 73 5f 63 75 72 73 6f 72 20 2a  (series_cursor *
3990: 29 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  )pVtabCursor;.  
39a0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 66 28  int i = 0;.  if(
39b0: 20 69 64 78 4e 75 6d 20 26 20 31 20 29 7b 0a 20   idxNum & 1 ){. 
39c0: 20 20 20 70 43 75 72 2d 3e 6d 6e 56 61 6c 75 65     pCur->mnValue
39d0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
39e0: 5f 69 6e 74 36 34 28 61 72 67 76 5b 69 2b 2b 5d  _int64(argv[i++]
39f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
3a00: 70 43 75 72 2d 3e 6d 6e 56 61 6c 75 65 20 3d 20  pCur->mnValue = 
3a10: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 64 78  0;.  }.  if( idx
3a20: 4e 75 6d 20 26 20 32 20 29 7b 0a 20 20 20 20 70  Num & 2 ){.    p
3a30: 43 75 72 2d 3e 6d 78 56 61 6c 75 65 20 3d 20 73  Cur->mxValue = s
3a40: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
3a50: 36 34 28 61 72 67 76 5b 69 2b 2b 5d 29 3b 0a 20  64(argv[i++]);. 
3a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
3a70: 2d 3e 6d 78 56 61 6c 75 65 20 3d 20 30 78 66 66  ->mxValue = 0xff
3a80: 66 66 66 66 66 66 3b 0a 20 20 7d 0a 20 20 69 66  ffffff;.  }.  if
3a90: 28 20 69 64 78 4e 75 6d 20 26 20 34 20 29 7b 0a  ( idxNum & 4 ){.
3aa0: 20 20 20 20 70 43 75 72 2d 3e 69 53 74 65 70 20      pCur->iStep 
3ab0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
3ac0: 69 6e 74 36 34 28 61 72 67 76 5b 69 2b 2b 5d 29  int64(argv[i++])
3ad0: 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
3ae0: 69 53 74 65 70 3c 31 20 29 20 70 43 75 72 2d 3e  iStep<1 ) pCur->
3af0: 69 53 74 65 70 20 3d 20 31 3b 0a 20 20 7d 65 6c  iStep = 1;.  }el
3b00: 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 53  se{.    pCur->iS
3b10: 74 65 70 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  tep = 1;.  }.  i
3b20: 66 28 20 69 64 78 4e 75 6d 20 26 20 38 20 29 7b  f( idxNum & 8 ){
3b30: 0a 20 20 20 20 70 43 75 72 2d 3e 69 73 44 65 73  .    pCur->isDes
3b40: 63 20 3d 20 31 3b 0a 20 20 20 20 70 43 75 72 2d  c = 1;.    pCur-
3b50: 3e 69 56 61 6c 75 65 20 3d 20 70 43 75 72 2d 3e  >iValue = pCur->
3b60: 6d 78 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28  mxValue;.    if(
3b70: 20 70 43 75 72 2d 3e 69 53 74 65 70 3e 30 20 29   pCur->iStep>0 )
3b80: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 56  {.      pCur->iV
3b90: 61 6c 75 65 20 2d 3d 20 28 70 43 75 72 2d 3e 6d  alue -= (pCur->m
3ba0: 78 56 61 6c 75 65 20 2d 20 70 43 75 72 2d 3e 6d  xValue - pCur->m
3bb0: 6e 56 61 6c 75 65 29 25 70 43 75 72 2d 3e 69 53  nValue)%pCur->iS
3bc0: 74 65 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  tep;.    }.  }el
3bd0: 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 73  se{.    pCur->is
3be0: 44 65 73 63 20 3d 20 30 3b 0a 20 20 20 20 70 43  Desc = 0;.    pC
3bf0: 75 72 2d 3e 69 56 61 6c 75 65 20 3d 20 70 43 75  ur->iValue = pCu
3c00: 72 2d 3e 6d 6e 56 61 6c 75 65 3b 0a 20 20 7d 0a  r->mnValue;.  }.
3c10: 20 20 70 43 75 72 2d 3e 69 52 6f 77 69 64 20 3d    pCur->iRowid =
3c20: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
3c30: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3c40: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 69 6e 76   SQLite will inv
3c50: 6f 6b 65 20 74 68 69 73 20 6d 65 74 68 6f 64 20  oke this method 
3c60: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 69 6d 65  one or more time
3c70: 73 20 77 68 69 6c 65 20 70 6c 61 6e 6e 69 6e 67  s while planning
3c80: 20 61 20 71 75 65 72 79 0a 2a 2a 20 74 68 61 74   a query.** that
3c90: 20 75 73 65 73 20 74 68 65 20 67 65 6e 65 72 61   uses the genera
3ca0: 74 65 5f 73 65 72 69 65 73 20 76 69 72 74 75 61  te_series virtua
3cb0: 6c 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  l table.  This r
3cc0: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
3cd0: 63 72 65 61 74 65 0a 2a 2a 20 61 20 71 75 65 72  create.** a quer
3ce0: 79 20 70 6c 61 6e 20 66 6f 72 20 65 61 63 68 20  y plan for each 
3cf0: 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 63  invocation and c
3d00: 6f 6d 70 75 74 65 20 61 6e 20 65 73 74 69 6d 61  ompute an estima
3d10: 74 65 64 20 63 6f 73 74 20 66 6f 72 20 74 68 61  ted cost for tha
3d20: 74 0a 2a 2a 20 70 6c 61 6e 2e 0a 2a 2a 0a 2a 2a  t.** plan..**.**
3d30: 20 49 6e 20 74 68 69 73 20 69 6d 70 6c 65 6d 65   In this impleme
3d40: 6e 74 61 74 69 6f 6e 20 69 64 78 4e 75 6d 20 69  ntation idxNum i
3d50: 73 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  s used to repres
3d60: 65 6e 74 20 74 68 65 0a 2a 2a 20 71 75 65 72 79  ent the.** query
3d70: 20 70 6c 61 6e 2e 20 20 69 64 78 53 74 72 20 69   plan.  idxStr i
3d80: 73 20 75 6e 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s unused..**.** 
3d90: 54 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69  The query plan i
3da0: 73 20 72 65 70 72 65 73 65 6e 74 65 64 20 62 79  s represented by
3db0: 20 62 69 74 73 20 69 6e 20 69 64 78 4e 75 6d 3a   bits in idxNum:
3dc0: 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 73 74 61  .**.**  (1)  sta
3dd0: 72 74 20 3d 20 24 76 61 6c 75 65 20 20 2d 2d 20  rt = $value  -- 
3de0: 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74  constraint exist
3df0: 73 0a 2a 2a 20 20 28 32 29 20 20 73 74 6f 70 20  s.**  (2)  stop 
3e00: 3d 20 24 76 61 6c 75 65 20 20 20 2d 2d 20 63 6f  = $value   -- co
3e10: 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 0a  nstraint exists.
3e20: 2a 2a 20 20 28 34 29 20 20 73 74 65 70 20 3d 20  **  (4)  step = 
3e30: 24 76 61 6c 75 65 20 20 20 2d 2d 20 63 6f 6e 73  $value   -- cons
3e40: 74 72 61 69 6e 74 20 65 78 69 73 74 73 0a 2a 2a  traint exists.**
3e50: 20 20 28 38 29 20 20 6f 75 74 70 75 74 20 69 6e    (8)  output in
3e60: 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65   descending orde
3e70: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
3e80: 73 65 72 69 65 73 42 65 73 74 49 6e 64 65 78 28  seriesBestIndex(
3e90: 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  .  sqlite3_vtab 
3ea0: 2a 74 61 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f  *tab,.  sqlite3_
3eb0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
3ec0: 49 6e 66 6f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Info.){.  int i;
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 63 6f   /* Loop over co
3ef0: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69  nstraints */.  i
3f00: 6e 74 20 69 64 78 4e 75 6d 20 3d 20 30 3b 20 20  nt idxNum = 0;  
3f10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 71 75 65        /* The que
3f20: 72 79 20 70 6c 61 6e 20 62 69 74 6d 61 73 6b 20  ry plan bitmask 
3f30: 2a 2f 0a 20 20 69 6e 74 20 73 74 61 72 74 49 64  */.  int startId
3f40: 78 20 3d 20 2d 31 3b 20 20 20 20 20 2f 2a 20 49  x = -1;     /* I
3f50: 6e 64 65 78 20 6f 66 20 74 68 65 20 73 74 61 72  ndex of the star
3f60: 74 3d 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6f  t= constraint, o
3f70: 72 20 2d 31 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a  r -1 if none */.
3f80: 20 20 69 6e 74 20 73 74 6f 70 49 64 78 20 3d 20    int stopIdx = 
3f90: 2d 31 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  -1;      /* Inde
3fa0: 78 20 6f 66 20 74 68 65 20 73 74 6f 70 3d 20 63  x of the stop= c
3fb0: 6f 6e 73 74 72 61 69 6e 74 2c 20 6f 72 20 2d 31  onstraint, or -1
3fc0: 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 20 20 69 6e   if none */.  in
3fd0: 74 20 73 74 65 70 49 64 78 20 3d 20 2d 31 3b 20  t stepIdx = -1; 
3fe0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
3ff0: 20 74 68 65 20 73 74 65 70 3d 20 63 6f 6e 73 74   the step= const
4000: 72 61 69 6e 74 2c 20 6f 72 20 2d 31 20 69 66 20  raint, or -1 if 
4010: 6e 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  none */.  int nA
4020: 72 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rg = 0;         
4030: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4040: 67 75 6d 65 6e 74 73 20 74 68 61 74 20 73 65 72  guments that ser
4050: 69 65 73 46 69 6c 74 65 72 28 29 20 65 78 70 65  iesFilter() expe
4060: 63 74 73 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20  cts */..  const 
4070: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
4080: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
4090: 2a 70 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  *pConstraint;.  
40a0: 70 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49  pConstraint = pI
40b0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
40c0: 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  int;.  for(i=0; 
40d0: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
40e0: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 43  straint; i++, pC
40f0: 6f 6e 73 74 72 61 69 6e 74 2b 2b 29 7b 0a 20 20  onstraint++){.  
4100: 20 20 69 66 28 20 70 43 6f 6e 73 74 72 61 69 6e    if( pConstrain
4110: 74 2d 3e 75 73 61 62 6c 65 3d 3d 30 20 29 20 63  t->usable==0 ) c
4120: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
4130: 20 70 43 6f 6e 73 74 72 61 69 6e 74 2d 3e 6f 70   pConstraint->op
4140: 21 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  !=SQLITE_INDEX_C
4150: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 20 63  ONSTRAINT_EQ ) c
4160: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 77 69  ontinue;.    swi
4170: 74 63 68 28 20 70 43 6f 6e 73 74 72 61 69 6e 74  tch( pConstraint
4180: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
4190: 20 20 20 63 61 73 65 20 53 45 52 49 45 53 5f 43     case SERIES_C
41a0: 4f 4c 55 4d 4e 5f 53 54 41 52 54 3a 0a 20 20 20  OLUMN_START:.   
41b0: 20 20 20 20 20 73 74 61 72 74 49 64 78 20 3d 20       startIdx = 
41c0: 69 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 75  i;.        idxNu
41d0: 6d 20 7c 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  m |= 1;.        
41e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
41f0: 65 20 53 45 52 49 45 53 5f 43 4f 4c 55 4d 4e 5f  e SERIES_COLUMN_
4200: 53 54 4f 50 3a 0a 20 20 20 20 20 20 20 20 73 74  STOP:.        st
4210: 6f 70 49 64 78 20 3d 20 69 3b 0a 20 20 20 20 20  opIdx = i;.     
4220: 20 20 20 69 64 78 4e 75 6d 20 7c 3d 20 32 3b 0a     idxNum |= 2;.
4230: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4240: 20 20 20 20 20 63 61 73 65 20 53 45 52 49 45 53       case SERIES
4250: 5f 43 4f 4c 55 4d 4e 5f 53 54 45 50 3a 0a 20 20  _COLUMN_STEP:.  
4260: 20 20 20 20 20 20 73 74 65 70 49 64 78 20 3d 20        stepIdx = 
4270: 69 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e 75  i;.        idxNu
4280: 6d 20 7c 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  m |= 4;.        
4290: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
42a0: 0a 20 20 69 66 28 20 73 74 61 72 74 49 64 78 3e  .  if( startIdx>
42b0: 3d 30 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e  =0 ){.    pIdxIn
42c0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
42d0: 73 61 67 65 5b 73 74 61 72 74 49 64 78 5d 2e 61  sage[startIdx].a
42e0: 72 67 76 49 6e 64 65 78 20 3d 20 2b 2b 6e 41 72  rgvIndex = ++nAr
42f0: 67 3b 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  g;.    pIdxInfo-
4300: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
4310: 65 5b 73 74 61 72 74 49 64 78 5d 2e 6f 6d 69 74  e[startIdx].omit
4320: 3d 20 21 53 51 4c 49 54 45 5f 53 45 52 49 45 53  = !SQLITE_SERIES
4330: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 45 52 49  _CONSTRAINT_VERI
4340: 46 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  FY;.  }.  if( st
4350: 6f 70 49 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20  opIdx>=0 ){.    
4360: 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
4370: 72 61 69 6e 74 55 73 61 67 65 5b 73 74 6f 70 49  raintUsage[stopI
4380: 64 78 5d 2e 61 72 67 76 49 6e 64 65 78 20 3d 20  dx].argvIndex = 
4390: 2b 2b 6e 41 72 67 3b 0a 20 20 20 20 70 49 64 78  ++nArg;.    pIdx
43a0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
43b0: 74 55 73 61 67 65 5b 73 74 6f 70 49 64 78 5d 2e  tUsage[stopIdx].
43c0: 6f 6d 69 74 20 3d 20 21 53 51 4c 49 54 45 5f 53  omit = !SQLITE_S
43d0: 45 52 49 45 53 5f 43 4f 4e 53 54 52 41 49 4e 54  ERIES_CONSTRAINT
43e0: 5f 56 45 52 49 46 59 3b 0a 20 20 7d 0a 20 20 69  _VERIFY;.  }.  i
43f0: 66 28 20 73 74 65 70 49 64 78 3e 3d 30 20 29 7b  f( stepIdx>=0 ){
4400: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61  .    pIdxInfo->a
4410: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
4420: 73 74 65 70 49 64 78 5d 2e 61 72 67 76 49 6e 64  stepIdx].argvInd
4430: 65 78 20 3d 20 2b 2b 6e 41 72 67 3b 0a 20 20 20  ex = ++nArg;.   
4440: 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73   pIdxInfo->aCons
4450: 74 72 61 69 6e 74 55 73 61 67 65 5b 73 74 65 70  traintUsage[step
4460: 49 64 78 5d 2e 6f 6d 69 74 20 3d 20 21 53 51 4c  Idx].omit = !SQL
4470: 49 54 45 5f 53 45 52 49 45 53 5f 43 4f 4e 53 54  ITE_SERIES_CONST
4480: 52 41 49 4e 54 5f 56 45 52 49 46 59 3b 0a 20 20  RAINT_VERIFY;.  
4490: 7d 0a 20 20 69 66 28 20 28 69 64 78 4e 75 6d 20  }.  if( (idxNum 
44a0: 26 20 33 29 3d 3d 33 20 29 7b 0a 20 20 20 20 2f  & 3)==3 ){.    /
44b0: 2a 20 42 6f 74 68 20 73 74 61 72 74 3d 20 61 6e  * Both start= an
44c0: 64 20 73 74 6f 70 3d 20 62 6f 75 6e 64 61 72 69  d stop= boundari
44d0: 65 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  es are available
44e0: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 0a  .  This is the .
44f0: 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 66 65      ** the prefe
4500: 72 72 65 64 20 63 61 73 65 20 2a 2f 0a 20 20 20  rred case */.   
4510: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
4520: 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f 75 62  atedCost = (doub
4530: 6c 65 29 28 32 20 2d 20 28 28 69 64 78 4e 75 6d  le)(2 - ((idxNum
4540: 26 34 29 21 3d 30 29 29 3b 0a 20 20 20 20 70 49  &4)!=0));.    pI
4550: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
4560: 64 52 6f 77 73 20 3d 20 31 30 30 30 3b 0a 20 20  dRows = 1000;.  
4570: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
4580: 6e 4f 72 64 65 72 42 79 3d 3d 31 20 29 7b 0a 20  nOrderBy==1 ){. 
4590: 20 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66       if( pIdxInf
45a0: 6f 2d 3e 61 4f 72 64 65 72 42 79 5b 30 5d 2e 64  o->aOrderBy[0].d
45b0: 65 73 63 20 29 20 69 64 78 4e 75 6d 20 7c 3d 20  esc ) idxNum |= 
45c0: 38 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66  8;.      pIdxInf
45d0: 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
45e0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
45f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4600: 20 65 69 74 68 65 72 20 62 6f 75 6e 64 61 72 79   either boundary
4610: 20 69 73 20 6d 69 73 73 69 6e 67 2c 20 77 65 20   is missing, we 
4620: 68 61 76 65 20 74 6f 20 67 65 6e 65 72 61 74 65  have to generate
4630: 20 61 20 68 75 67 65 20 73 70 61 6e 0a 20 20 20   a huge span.   
4640: 20 2a 2a 20 6f 66 20 6e 75 6d 62 65 72 73 2e 20   ** of numbers. 
4650: 20 4d 61 6b 65 20 74 68 69 73 20 63 61 73 65 20   Make this case 
4660: 76 65 72 79 20 65 78 70 65 6e 73 69 76 65 20 73  very expensive s
4670: 6f 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79  o that the query
4680: 0a 20 20 20 20 2a 2a 20 70 6c 61 6e 6e 65 72 20  .    ** planner 
4690: 77 69 6c 6c 20 77 6f 72 6b 20 68 61 72 64 20 74  will work hard t
46a0: 6f 20 61 76 6f 69 64 20 69 74 2e 20 2a 2f 0a 20  o avoid it. */. 
46b0: 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74     pIdxInfo->est
46c0: 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 28 64 6f  imatedCost = (do
46d0: 75 62 6c 65 29 32 31 34 37 34 38 33 36 34 37 3b  uble)2147483647;
46e0: 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  .    pIdxInfo->e
46f0: 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32  stimatedRows = 2
4700: 31 34 37 34 38 33 36 34 37 3b 0a 20 20 7d 0a 20  147483647;.  }. 
4710: 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
4720: 6d 20 3d 20 69 64 78 4e 75 6d 3b 0a 20 20 72 65  m = idxNum;.  re
4730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4740: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 6f  }../*.** This fo
4750: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
4760: 65 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68  e defines all th
4770: 65 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 74 68  e methods for th
4780: 65 20 0a 2a 2a 20 67 65 6e 65 72 61 74 65 5f 73  e .** generate_s
4790: 65 72 69 65 73 20 76 69 72 74 75 61 6c 20 74 61  eries virtual ta
47a0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ble..*/.static s
47b0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 73 65  qlite3_module se
47c0: 72 69 65 73 4d 6f 64 75 6c 65 20 3d 20 7b 0a 20  riesModule = {. 
47d0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
47f0: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 30 2c 20  Version */.  0, 
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 72 65 61          /* xCrea
4820: 74 65 20 2a 2f 0a 20 20 73 65 72 69 65 73 43 6f  te */.  seriesCo
4830: 6e 6e 65 63 74 2c 20 20 20 20 20 20 20 20 20 20  nnect,          
4840: 20 20 20 2f 2a 20 78 43 6f 6e 6e 65 63 74 20 2a     /* xConnect *
4850: 2f 0a 20 20 73 65 72 69 65 73 42 65 73 74 49 6e  /.  seriesBestIn
4860: 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f  dex,           /
4870: 2a 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a  * xBestIndex */.
4880: 20 20 73 65 72 69 65 73 44 69 73 63 6f 6e 6e 65    seriesDisconne
4890: 63 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ct,          /* 
48a0: 78 44 69 73 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20  xDisconnect */. 
48b0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
48d0: 44 65 73 74 72 6f 79 20 2a 2f 0a 20 20 73 65 72  Destroy */.  ser
48e0: 69 65 73 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  iesOpen,        
48f0: 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
4900: 20 2d 20 6f 70 65 6e 20 61 20 63 75 72 73 6f 72   - open a cursor
4910: 20 2a 2f 0a 20 20 73 65 72 69 65 73 43 6c 6f 73   */.  seriesClos
4920: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4930: 20 2f 2a 20 78 43 6c 6f 73 65 20 2d 20 63 6c 6f   /* xClose - clo
4940: 73 65 20 61 20 63 75 72 73 6f 72 20 2a 2f 0a 20  se a cursor */. 
4950: 20 73 65 72 69 65 73 46 69 6c 74 65 72 2c 20 20   seriesFilter,  
4960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
4970: 46 69 6c 74 65 72 20 2d 20 63 6f 6e 66 69 67 75  Filter - configu
4980: 72 65 20 73 63 61 6e 20 63 6f 6e 73 74 72 61 69  re scan constrai
4990: 6e 74 73 20 2a 2f 0a 20 20 73 65 72 69 65 73 4e  nts */.  seriesN
49a0: 65 78 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ext,            
49b0: 20 20 20 20 2f 2a 20 78 4e 65 78 74 20 2d 20 61      /* xNext - a
49c0: 64 76 61 6e 63 65 20 61 20 63 75 72 73 6f 72 20  dvance a cursor 
49d0: 2a 2f 0a 20 20 73 65 72 69 65 73 45 6f 66 2c 20  */.  seriesEof, 
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49f0: 2f 2a 20 78 45 6f 66 20 2d 20 63 68 65 63 6b 20  /* xEof - check 
4a00: 66 6f 72 20 65 6e 64 20 6f 66 20 73 63 61 6e 20  for end of scan 
4a10: 2a 2f 0a 20 20 73 65 72 69 65 73 43 6f 6c 75 6d  */.  seriesColum
4a20: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
4a30: 2f 2a 20 78 43 6f 6c 75 6d 6e 20 2d 20 72 65 61  /* xColumn - rea
4a40: 64 20 64 61 74 61 20 2a 2f 0a 20 20 73 65 72 69  d data */.  seri
4a50: 65 73 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  esRowid,        
4a60: 20 20 20 20 20 20 20 2f 2a 20 78 52 6f 77 69 64         /* xRowid
4a70: 20 2d 20 72 65 61 64 20 64 61 74 61 20 2a 2f 0a   - read data */.
4a80: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4aa0: 78 55 70 64 61 74 65 20 2a 2f 0a 20 20 30 2c 20  xUpdate */.  0, 
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 20 20 20 20 20 2f 2a 20 78 42 65 67 69          /* xBegi
4ad0: 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
4b00: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
4b20: 6f 6d 6d 69 74 20 2a 2f 0a 20 20 30 2c 20 20 20  ommit */.  0,   
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 20 20 20 20 20 20 2f 2a 20 78 52 6f 6c 6c 62 61        /* xRollba
4b50: 63 6b 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  ck */.  0,      
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 20 20 2f 2a 20 78 46 69 6e 64 4d 65 74 68 6f     /* xFindMetho
4b80: 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  d */.  0,       
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a 2f 0a    /* xRename */.
4bb0: 7d 3b 0a 2f 2a 20 45 4e 44 20 74 68 65 20 67 65  };./* END the ge
4bc0: 6e 65 72 61 74 65 5f 73 65 72 69 65 73 28 53 54  nerate_series(ST
4bd0: 41 52 54 2c 45 4e 44 2c 53 54 45 50 29 20 69 6d  ART,END,STEP) im
4be0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 2a  plementation.***
4bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
4c40: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 73 6b 65  ./*.** Print ske
4c50: 74 63 68 79 20 64 6f 63 75 6d 65 6e 74 61 74 69  tchy documentati
4c60: 6f 6e 20 66 6f 72 20 74 68 69 73 20 75 74 69 6c  on for this util
4c70: 69 74 79 20 70 72 6f 67 72 61 6d 0a 2a 2f 0a 73  ity program.*/.s
4c80: 74 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77 48  tatic void showH
4c90: 65 6c 70 28 76 6f 69 64 29 7b 0a 20 20 70 72 69  elp(void){.  pri
4ca0: 6e 74 66 28 22 55 73 61 67 65 3a 20 25 73 20 5b  ntf("Usage: %s [
4cb0: 6f 70 74 69 6f 6e 73 5d 20 3f 46 49 4c 45 2e 2e  options] ?FILE..
4cc0: 2e 3f 5c 6e 22 2c 20 67 2e 7a 41 72 67 76 30 29  .?\n", g.zArgv0)
4cd0: 3b 0a 20 20 70 72 69 6e 74 66 28 0a 22 52 65 61  ;.  printf(."Rea
4ce0: 64 20 53 51 4c 20 74 65 78 74 20 66 72 6f 6d 20  d SQL text from 
4cf0: 46 49 4c 45 2e 2e 2e 20 28 6f 72 20 66 72 6f 6d  FILE... (or from
4d00: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 20   standard input 
4d10: 69 66 20 46 49 4c 45 2e 2e 2e 20 69 73 20 6f 6d  if FILE... is om
4d20: 69 74 74 65 64 29 5c 6e 22 0a 22 61 6e 64 20 74  itted)\n"."and t
4d30: 68 65 6e 20 65 76 61 6c 75 61 74 65 20 65 61 63  hen evaluate eac
4d40: 68 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20 63  h block of SQL c
4d50: 6f 6e 74 61 69 6e 65 64 20 74 68 65 72 65 69 6e  ontained therein
4d60: 2e 5c 6e 22 0a 22 4f 70 74 69 6f 6e 73 3a 5c 6e  .\n"."Options:\n
4d70: 22 0a 22 20 20 2d 2d 61 75 74 6f 76 61 63 75 75  "."  --autovacuu
4d80: 6d 20 20 20 20 20 20 20 20 20 20 45 6e 61 62 6c  m          Enabl
4d90: 65 20 41 55 54 4f 56 41 43 55 55 4d 20 6d 6f 64  e AUTOVACUUM mod
4da0: 65 5c 6e 22 0a 22 20 20 2d 2d 64 61 74 61 62 61  e\n"."  --databa
4db0: 73 65 20 46 49 4c 45 20 20 20 20 20 20 20 55 73  se FILE       Us
4dc0: 65 20 64 61 74 61 62 61 73 65 20 46 49 4c 45 20  e database FILE 
4dd0: 69 6e 73 74 65 61 64 20 6f 66 20 61 6e 20 69 6e  instead of an in
4de0: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
4df0: 5c 6e 22 0a 22 20 20 2d 2d 64 69 73 61 62 6c 65  \n"."  --disable
4e00: 2d 6c 6f 6f 6b 61 73 69 64 65 20 20 20 54 75 72  -lookaside   Tur
4e10: 6e 20 6f 66 66 20 6c 6f 6f 6b 61 73 69 64 65 20  n off lookaside 
4e20: 6d 65 6d 6f 72 79 5c 6e 22 0a 22 20 20 2d 2d 68  memory\n"."  --h
4e30: 65 61 70 20 53 5a 20 4d 49 4e 20 20 20 20 20 20  eap SZ MIN      
4e40: 20 20 20 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61     Memory alloca
4e50: 74 6f 72 20 75 73 65 73 20 53 5a 20 62 79 74 65  tor uses SZ byte
4e60: 73 20 26 20 6d 69 6e 20 61 6c 6c 6f 63 61 74 69  s & min allocati
4e70: 6f 6e 20 4d 49 4e 5c 6e 22 0a 22 20 20 2d 2d 68  on MIN\n"."  --h
4e80: 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20  elp             
4e90: 20 20 20 53 68 6f 77 20 74 68 69 73 20 68 65 6c     Show this hel
4ea0: 70 20 74 65 78 74 5c 6e 22 20 20 20 20 0a 22 20  p text\n"    ." 
4eb0: 20 2d 2d 6c 6f 6f 6b 61 73 69 64 65 20 4e 20 53   --lookaside N S
4ec0: 5a 20 20 20 20 20 20 43 6f 6e 66 69 67 75 72 65  Z      Configure
4ed0: 20 6c 6f 6f 6b 61 73 69 64 65 20 66 6f 72 20 4e   lookaside for N
4ee0: 20 73 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79 74   slots of SZ byt
4ef0: 65 73 20 65 61 63 68 5c 6e 22 0a 22 20 20 2d 2d  es each\n"."  --
4f00: 6f 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  oom             
4f10: 20 20 20 20 52 75 6e 20 65 61 63 68 20 74 65 73      Run each tes
4f20: 74 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  t multiple times
4f30: 20 69 6e 20 61 20 73 69 6d 75 6c 61 74 65 64 20   in a simulated 
4f40: 4f 4f 4d 20 6c 6f 6f 70 5c 6e 22 0a 22 20 20 2d  OOM loop\n"."  -
4f50: 2d 70 61 67 65 73 69 7a 65 20 4e 20 20 20 20 20  -pagesize N     
4f60: 20 20 20 20 20 53 65 74 20 74 68 65 20 70 61 67       Set the pag
4f70: 65 20 73 69 7a 65 20 74 6f 20 4e 5c 6e 22 0a 22  e size to N\n"."
4f80: 20 20 2d 2d 70 63 61 63 68 65 20 4e 20 53 5a 20    --pcache N SZ 
4f90: 20 20 20 20 20 20 20 20 43 6f 6e 66 69 67 75 72          Configur
4fa0: 65 20 4e 20 70 61 67 65 73 20 6f 66 20 70 61 67  e N pages of pag
4fb0: 65 63 61 63 68 65 20 65 61 63 68 20 6f 66 20 73  ecache each of s
4fc0: 69 7a 65 20 53 5a 20 62 79 74 65 73 5c 6e 22 0a  ize SZ bytes\n".
4fd0: 22 20 20 2d 71 20 20 20 20 20 20 20 20 20 20 20  "  -q           
4fe0: 20 20 20 20 20 20 20 20 20 52 65 64 75 63 65 64           Reduced
4ff0: 20 6f 75 74 70 75 74 5c 6e 22 0a 22 20 20 2d 2d   output\n"."  --
5000: 71 75 69 65 74 20 20 20 20 20 20 20 20 20 20 20  quiet           
5010: 20 20 20 20 52 65 64 75 63 65 64 20 6f 75 74 70      Reduced outp
5020: 75 74 5c 6e 22 0a 22 20 20 2d 2d 73 63 72 61 74  ut\n"."  --scrat
5030: 63 68 20 4e 20 53 5a 20 20 20 20 20 20 20 20 43  ch N SZ        C
5040: 6f 6e 66 69 67 75 72 65 20 73 63 72 61 74 63 68  onfigure scratch
5050: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 4e 20 73 6c   memory for N sl
5060: 6f 74 73 20 6f 66 20 53 5a 20 62 79 74 65 73 20  ots of SZ bytes 
5070: 65 61 63 68 5c 6e 22 0a 22 20 20 2d 2d 75 6e 69  each\n"."  --uni
5080: 71 75 65 2d 63 61 73 65 73 20 46 49 4c 45 20 20  que-cases FILE  
5090: 20 57 72 69 74 65 20 61 6c 6c 20 75 6e 69 71 75   Write all uniqu
50a0: 65 20 74 65 73 74 20 63 61 73 65 73 20 74 6f 20  e test cases to 
50b0: 46 49 4c 45 5c 6e 22 0a 22 20 20 2d 2d 75 74 66  FILE\n"."  --utf
50c0: 31 36 62 65 20 20 20 20 20 20 20 20 20 20 20 20  16be            
50d0: 20 53 65 74 20 74 65 78 74 20 65 6e 63 6f 64 69   Set text encodi
50e0: 6e 67 20 74 6f 20 55 54 46 2d 31 36 42 45 5c 6e  ng to UTF-16BE\n
50f0: 22 0a 22 20 20 2d 2d 75 74 66 31 36 6c 65 20 20  "."  --utf16le  
5100: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
5110: 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 74 6f 20  ext encoding to 
5120: 55 54 46 2d 31 36 4c 45 5c 6e 22 0a 22 20 20 2d  UTF-16LE\n"."  -
5130: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v               
5140: 20 20 20 20 20 49 6e 63 72 65 61 73 65 64 20 6f       Increased o
5150: 75 74 70 75 74 5c 6e 22 0a 22 20 20 2d 2d 76 65  utput\n"."  --ve
5160: 72 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  rbose           
5170: 20 20 49 6e 63 72 65 61 73 65 64 20 6f 75 74 70    Increased outp
5180: 75 74 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a  ut\n".  );.}../*
5190: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
51a0: 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64 65  alue of a hexade
51b0: 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52 65  cimal digit.  Re
51c0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 69  turn -1 if the i
51d0: 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61  nput.** is not a
51e0: 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73   hex digit..*/.s
51f0: 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69 67  tatic int hexDig
5200: 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29 7b  itValue(char c){
5210: 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26  .  if( c>='0' &&
5220: 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72 6e   c<='9' ) return
5230: 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28 20   c - '0';.  if( 
5240: 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66 27  c>='a' && c<='f'
5250: 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 61   ) return c - 'a
5260: 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63 3e  ' + 10;.  if( c>
5270: 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20 29  ='A' && c<='F' )
5280: 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27 20   return c - 'A' 
5290: 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d  + 10;.  return -
52a0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  1;.}../*.** Inte
52b0: 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61 6e  rpret zArg as an
52c0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c 20   integer value, 
52d0: 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73 75  possibly with su
52e0: 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ffixes..*/.stati
52f0: 63 20 69 6e 74 20 69 6e 74 65 67 65 72 56 61 6c  c int integerVal
5300: 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ue(const char *z
5310: 41 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Arg){.  sqlite3_
5320: 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73  int64 v = 0;.  s
5330: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
5340: 63 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66  ct { char *zSuff
5350: 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d  ix; int iMult; }
5360: 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20   aMult[] = {.   
5370: 20 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d   { "KiB", 1024 }
5380: 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31  ,.    { "MiB", 1
5390: 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20  024*1024 },.    
53a0: 7b 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30  { "GiB", 1024*10
53b0: 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
53c0: 20 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a   "KB",  1000 },.
53d0: 20 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30      { "MB",  100
53e0: 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47  0000 },.    { "G
53f0: 42 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20  B",  1000000000 
5400: 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20  },.    { "K",   
5410: 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d  1000 },.    { "M
5420: 22 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a  ",   1000000 },.
5430: 20 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30      { "G",   100
5440: 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a  0000000 },.  };.
5450: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
5460: 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  sNeg = 0;.  if( 
5470: 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  zArg[0]=='-' ){.
5480: 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20      isNeg = 1;. 
5490: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c     zArg++;.  }el
54a0: 73 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  se if( zArg[0]==
54b0: 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b  '+' ){.    zArg+
54c0: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72  +;.  }.  if( zAr
54d0: 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
54e0: 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
54f0: 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67   int x;.    zArg
5500: 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65   += 2;.    while
5510: 28 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56  ( (x = hexDigitV
5520: 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d  alue(zArg[0]))>=
5530: 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28  0 ){.      v = (
5540: 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20  v<<4) + x;.     
5550: 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20   zArg++;.    }. 
5560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
5570: 65 28 20 49 53 44 49 47 49 54 28 7a 41 72 67 5b  e( ISDIGIT(zArg[
5580: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  0]) ){.      v =
5590: 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20   v*10 + zArg[0] 
55a0: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72  - '0';.      zAr
55b0: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  g++;.    }.  }. 
55c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
55d0: 6f 66 28 61 4d 75 6c 74 29 2f 73 69 7a 65 6f 66  of(aMult)/sizeof
55e0: 28 61 4d 75 6c 74 5b 30 5d 29 3b 20 69 2b 2b 29  (aMult[0]); i++)
55f0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
5600: 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b  3_stricmp(aMult[
5610: 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72 67  i].zSuffix, zArg
5620: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )==0 ){.      v 
5630: 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c  *= aMult[i].iMul
5640: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
5650: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
5660: 76 3e 30 78 37 66 66 66 66 66 66 66 20 29 20 61  v>0x7fffffff ) a
5670: 62 65 6e 64 45 72 72 6f 72 28 22 70 61 72 61 6d  bendError("param
5680: 65 74 65 72 20 74 6f 6f 20 6c 61 72 67 65 20 2d  eter too large -
5690: 20 6d 61 78 20 32 31 34 37 34 38 33 36 34 38 22   max 2147483648"
56a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  );.  return (int
56b0: 29 28 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 29  )(isNeg? -v : v)
56c0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
56d0: 68 65 20 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d  he current wall-
56e0: 63 6c 6f 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74  clock time */.st
56f0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74  atic sqlite3_int
5700: 36 34 20 74 69 6d 65 4f 66 44 61 79 28 76 6f 69  64 timeOfDay(voi
5710: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
5720: 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56  ite3_vfs *clockV
5730: 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  fs = 0;.  sqlite
5740: 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20 69 66 28  3_int64 t;.  if(
5750: 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63   clockVfs==0 ) c
5760: 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c 69 74 65  lockVfs = sqlite
5770: 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
5780: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69   if( clockVfs->i
5790: 56 65 72 73 69 6f 6e 3e 3d 31 20 26 26 20 63 6c  Version>=1 && cl
57a0: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
57b0: 54 69 6d 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a  TimeInt64!=0 ){.
57c0: 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43      clockVfs->xC
57d0: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
57e0: 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20  clockVfs, &t);. 
57f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62   }else{.    doub
5800: 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56  le r;.    clockV
5810: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
5820: 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a  (clockVfs, &r);.
5830: 20 20 20 20 74 20 3d 20 28 73 71 6c 69 74 65 33      t = (sqlite3
5840: 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30  _int64)(r*864000
5850: 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  00.0);.  }.  ret
5860: 75 72 6e 20 74 3b 0a 7d 0a 0a 69 6e 74 20 6d 61  urn t;.}..int ma
5870: 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61  in(int argc, cha
5880: 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 68 61  r **argv){.  cha
5890: 72 20 2a 7a 49 6e 20 3d 20 30 3b 20 20 20 20 20  r *zIn = 0;     
58a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
58b0: 70 75 74 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e  put text */.  in
58c0: 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20  t nAlloc = 0;   
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
58e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
58f0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 49 6e  llocated for zIn
5900: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 20  [] */.  int nIn 
5910: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5930: 6f 66 20 62 79 74 65 73 20 6f 66 20 7a 49 6e 5b  of bytes of zIn[
5940: 5d 20 75 73 65 64 20 2a 2f 0a 20 20 73 69 7a 65  ] used */.  size
5950: 5f 74 20 67 6f 74 3b 20 20 20 20 20 20 20 20 20  _t got;         
5960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
5970: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 70  es read from inp
5980: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ut */.  int rc =
5990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
59a0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
59b0: 63 6f 64 65 73 20 66 72 6f 6d 20 41 50 49 20 66  codes from API f
59c0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
59d0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
59f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
5a00: 20 69 6e 74 20 69 4e 65 78 74 3b 20 20 20 20 20   int iNext;     
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a20: 2a 20 4e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  * Next block of 
5a30: 53 51 4c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  SQL */.  sqlite3
5a40: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
5a50: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 64         /* Open d
5a60: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
5a70: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
5a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
5a90: 72 6f 72 20 6d 65 73 73 61 67 65 20 72 65 74 75  ror message retu
5aa0: 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  rned from sqlite
5ab0: 33 5f 65 78 65 63 28 29 20 2a 2f 0a 20 20 63 6f  3_exec() */.  co
5ac0: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 63 6f 64  nst char *zEncod
5ad0: 69 6e 67 20 3d 20 30 3b 20 20 20 20 2f 2a 20 2d  ing = 0;    /* -
5ae0: 2d 75 74 66 31 36 62 65 20 6f 72 20 2d 2d 75 74  -utf16be or --ut
5af0: 66 31 36 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  f16le */.  int n
5b00: 48 65 61 70 20 3d 20 30 2c 20 6d 6e 48 65 61 70  Heap = 0, mnHeap
5b10: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 48 65 61 70   = 0;    /* Heap
5b20: 20 73 69 7a 65 20 66 72 6f 6d 20 2d 2d 68 65 61   size from --hea
5b30: 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  p */.  int nLook
5b40: 20 3d 20 30 2c 20 73 7a 4c 6f 6f 6b 20 3d 20 30   = 0, szLook = 0
5b50: 3b 20 20 20 20 2f 2a 20 2d 2d 6c 6f 6f 6b 61 73  ;    /* --lookas
5b60: 69 64 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ide configuratio
5b70: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 43 61 63  n */.  int nPCac
5b80: 68 65 20 3d 20 30 2c 20 73 7a 50 43 61 63 68 65  he = 0, szPCache
5b90: 20 3d 20 30 3b 2f 2a 20 2d 2d 70 63 61 63 68 65   = 0;/* --pcache
5ba0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
5bb0: 2f 0a 20 20 69 6e 74 20 6e 53 63 72 61 74 63 68  /.  int nScratch
5bc0: 20 3d 20 30 2c 20 73 7a 53 63 72 61 74 63 68 3d   = 0, szScratch=
5bd0: 30 3b 2f 2a 20 2d 2d 73 63 72 61 74 63 68 20 63  0;/* --scratch c
5be0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
5bf0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 20 3d    int pageSize =
5c00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5c10: 2f 2a 20 44 65 73 69 72 65 64 20 70 61 67 65 20  /* Desired page 
5c20: 73 69 7a 65 2e 20 20 30 20 6d 65 61 6e 73 20 64  size.  0 means d
5c30: 65 66 61 75 6c 74 20 2a 2f 0a 20 20 76 6f 69 64  efault */.  void
5c40: 20 2a 70 48 65 61 70 20 3d 20 30 3b 20 20 20 20   *pHeap = 0;    
5c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
5c60: 6f 63 61 74 65 64 20 68 65 61 70 20 73 70 61 63  ocated heap spac
5c70: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4c 6f  e */.  void *pLo
5c80: 6f 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ok = 0;         
5c90: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
5ca0: 64 20 6c 6f 6f 6b 61 73 69 64 65 20 73 70 61 63  d lookaside spac
5cb0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 50 43  e */.  void *pPC
5cc0: 61 63 68 65 20 3d 20 30 3b 20 20 20 20 20 20 20  ache = 0;       
5cd0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
5ce0: 64 20 73 74 6f 72 61 67 65 20 66 6f 72 20 70 63  d storage for pc
5cf0: 61 63 68 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ache */.  void *
5d00: 70 53 63 72 61 74 63 68 20 3d 20 30 3b 20 20 20  pScratch = 0;   
5d10: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
5d20: 61 74 65 64 20 73 74 6f 72 61 67 65 20 66 6f 72  ated storage for
5d30: 20 73 63 72 61 74 63 68 20 2a 2f 0a 20 20 69 6e   scratch */.  in
5d40: 74 20 64 6f 41 75 74 6f 76 61 63 20 3d 20 30 3b  t doAutovac = 0;
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5d60: 72 75 65 20 66 6f 72 20 2d 2d 61 75 74 6f 76 61  rue for --autova
5d70: 63 75 75 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cuum */.  char *
5d80: 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
5d90: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
5da0: 6f 20 72 75 6e 20 2a 2f 0a 20 20 63 68 61 72 20  o run */.  char 
5db0: 2a 7a 54 6f 46 72 65 65 20 3d 20 30 3b 20 20 20  *zToFree = 0;   
5dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
5dd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
5de0: 6f 6e 20 74 68 69 73 20 61 66 74 65 20 72 75 6e  on this afte run
5df0: 6e 69 6e 67 20 7a 53 71 6c 20 2a 2f 0a 20 20 69  ning zSql */.  i
5e00: 6e 74 20 76 65 72 62 6f 73 65 46 6c 61 67 20 3d  nt verboseFlag =
5e10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
5e20: 2d 2d 76 65 72 62 6f 73 65 20 6f 72 20 2d 76 20  --verbose or -v 
5e30: 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 71 75  flag */.  int qu
5e40: 69 65 74 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  ietFlag = 0;    
5e50: 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 71 75 69          /* --qui
5e60: 65 74 20 6f 72 20 2d 71 20 66 6c 61 67 20 2a 2f  et or -q flag */
5e70: 0a 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30  .  int nTest = 0
5e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5e90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
5ea0: 73 74 20 63 61 73 65 73 20 72 75 6e 20 2a 2f 0a  st cases run */.
5eb0: 20 20 69 6e 74 20 6d 75 6c 74 69 54 65 73 74 20    int multiTest 
5ec0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5ed0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
5ee0: 20 77 69 6c 6c 20 62 65 20 6d 75 6c 74 69 70 6c   will be multipl
5ef0: 65 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f 0a  e test cases */.
5f00: 20 20 69 6e 74 20 6c 61 73 74 50 63 74 20 3d 20    int lastPct = 
5f10: 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  -1;             
5f20: 2f 2a 20 50 72 65 76 69 6f 75 73 20 70 65 72 63  /* Previous perc
5f30: 65 6e 74 61 67 65 20 64 6f 6e 65 20 6f 75 74 70  entage done outp
5f40: 75 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ut */.  sqlite3 
5f50: 2a 64 61 74 61 44 62 20 3d 20 30 3b 20 20 20 20  *dataDb = 0;    
5f60: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5f70: 65 20 68 6f 6c 64 69 6e 67 20 63 6f 6d 70 61 63  e holding compac
5f80: 74 65 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a  ted input data *
5f90: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
5fa0: 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20 20   *pStmt = 0;    
5fb0: 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74    /* Statement t
5fc0: 6f 20 69 6e 73 65 72 74 20 74 65 73 74 63 61 73  o insert testcas
5fd0: 65 20 69 6e 74 6f 20 64 61 74 61 44 62 20 2a 2f  e into dataDb */
5fe0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5ff0: 44 61 74 61 4f 75 74 20 3d 20 30 3b 20 20 20 20  DataOut = 0;    
6000: 20 2f 2a 20 57 72 69 74 65 20 63 6f 6d 70 61 63   /* Write compac
6010: 74 65 64 20 64 61 74 61 20 74 6f 20 74 68 69 73  ted data to this
6020: 20 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a   output file */.
6030: 20 20 69 6e 74 20 6e 48 65 61 64 65 72 20 3d 20    int nHeader = 
6040: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
6050: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
6060: 65 72 20 63 6f 6d 6d 65 6e 74 20 74 65 78 74 20  er comment text 
6070: 6f 6e 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  on input file */
6080: 0a 20 20 69 6e 74 20 6f 6f 6d 46 6c 61 67 20 3d  .  int oomFlag =
6090: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
60a0: 20 2f 2a 20 2d 2d 6f 6f 6d 20 2a 2f 0a 20 20 69   /* --oom */.  i
60b0: 6e 74 20 6f 6f 6d 43 6e 74 20 3d 20 30 3b 20 20  nt oomCnt = 0;  
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60d0: 43 6f 75 6e 74 65 72 20 66 6f 72 20 74 68 65 20  Counter for the 
60e0: 4f 4f 4d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68  OOM loop */.  ch
60f0: 61 72 20 7a 45 72 72 42 75 66 5b 32 30 30 5d 3b  ar zErrBuf[200];
6100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6110: 70 61 63 65 20 66 6f 72 20 74 68 65 20 65 72 72  pace for the err
6120: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  or message */.  
6130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 61 69  const char *zFai
6140: 6c 43 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a  lCode;        /*
6150: 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 54 45   Value of the TE
6160: 53 54 5f 46 41 49 4c 55 52 45 20 65 6e 76 69 72  ST_FAILURE envir
6170: 6f 6e 6d 65 6e 74 20 76 61 72 20 2a 2f 0a 20 20  onment var */.  
6180: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72 6f  const char *zPro
6190: 6d 70 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  mpt;          /*
61a0: 20 49 6e 69 74 69 61 6c 20 70 72 6f 6d 70 74 20   Initial prompt 
61b0: 77 68 65 6e 20 6c 61 72 67 65 2d 66 69 6c 65 20  when large-file 
61c0: 66 75 7a 7a 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  fuzzing */.  int
61d0: 20 6e 49 6e 46 69 6c 65 20 3d 20 30 3b 20 20 20   nInFile = 0;   
61e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
61f0: 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 66 69  mber of input fi
6200: 6c 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  les to read */. 
6210: 20 63 68 61 72 20 2a 2a 61 7a 49 6e 46 69 6c 65   char **azInFile
6220: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
6230: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 70 75 74  * Array of input
6240: 20 66 69 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20   file names */. 
6250: 20 69 6e 74 20 6a 6a 3b 20 20 20 20 20 20 20 20   int jj;        
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6270: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 66  * Loop counter f
6280: 6f 72 20 61 7a 49 6e 46 69 6c 65 5b 5d 20 2a 2f  or azInFile[] */
6290: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
62a0: 20 69 42 65 67 69 6e 3b 20 20 20 20 20 20 20 20   iBegin;        
62b0: 20 2f 2a 20 53 74 61 72 74 20 74 69 6d 65 20 66   /* Start time f
62c0: 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 70 72 6f  or the whole pro
62d0: 67 72 61 6d 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gram */.  sqlite
62e0: 33 5f 69 6e 74 36 34 20 69 53 74 61 72 74 2c 20  3_int64 iStart, 
62f0: 69 45 6e 64 3b 20 20 20 2f 2a 20 53 74 61 72 74  iEnd;   /* Start
6300: 20 61 6e 64 20 65 6e 64 2d 74 69 6d 65 73 20 66   and end-times f
6310: 6f 72 20 61 20 74 65 73 74 20 63 61 73 65 20 2a  or a test case *
6320: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6330: 7a 44 62 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20  zDbName = 0;    
6340: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 6e 20    /* Name of an 
6350: 6f 6e 2d 64 69 73 6b 20 64 61 74 61 62 61 73 65  on-disk database
6360: 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
6370: 0a 0a 20 20 69 42 65 67 69 6e 20 3d 20 74 69 6d  ..  iBegin = tim
6380: 65 4f 66 44 61 79 28 29 3b 0a 20 20 73 71 6c 69  eOfDay();.  sqli
6390: 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b 0a  te3_shutdown();.
63a0: 20 20 7a 46 61 69 6c 43 6f 64 65 20 3d 20 67 65    zFailCode = ge
63b0: 74 65 6e 76 28 22 54 45 53 54 5f 46 41 49 4c 55  tenv("TEST_FAILU
63c0: 52 45 22 29 3b 0a 20 20 67 2e 7a 41 72 67 76 30  RE");.  g.zArgv0
63d0: 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 7a 50   = argv[0];.  zP
63e0: 72 6f 6d 70 74 20 3d 20 22 3c 73 74 64 69 6e 3e  rompt = "<stdin>
63f0: 22 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  ";.  for(i=1; i<
6400: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
6410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
6420: 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28  argv[i];.    if(
6430: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20   z[0]=='-' ){.  
6440: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69      z++;.      i
6450: 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  f( z[0]=='-' ) z
6460: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
6470: 72 63 6d 70 28 7a 2c 22 61 75 74 6f 76 61 63 75  rcmp(z,"autovacu
6480: 75 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  um")==0 ){.     
6490: 20 20 20 64 6f 41 75 74 6f 76 61 63 20 3d 20 31     doAutovac = 1
64a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
64b0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
64c0: 2c 22 64 61 74 61 62 61 73 65 22 29 3d 3d 30 20  ,"database")==0 
64d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
64e0: 3e 3d 61 72 67 63 2d 31 20 29 20 61 62 65 6e 64  >=argc-1 ) abend
64f0: 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61  Error("missing a
6500: 72 67 75 6d 65 6e 74 20 6f 6e 20 25 73 5c 6e 22  rgument on %s\n"
6510: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
6520: 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 61 72      zDbName = ar
6530: 67 76 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20  gv[i+1];.       
6540: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 7d   i += 1;.      }
6550: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
6560: 74 72 63 6d 70 28 7a 2c 22 64 69 73 61 62 6c 65  trcmp(z,"disable
6570: 2d 6c 6f 6f 6b 61 73 69 64 65 22 29 3d 3d 30 20  -lookaside")==0 
6580: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b  ){.        nLook
6590: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 7a   = 1;.        sz
65a0: 4c 6f 6f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  Look = 0;.      
65b0: 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
65c0: 73 74 72 63 6d 70 28 7a 2c 20 22 66 22 29 3d 3d  strcmp(z, "f")==
65d0: 30 20 26 26 20 69 2b 31 3c 61 72 67 63 20 29 7b  0 && i+1<argc ){
65e0: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
65f0: 20 20 20 20 20 20 67 6f 74 6f 20 61 64 64 4e 65        goto addNe
6600: 77 49 6e 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d  wInFile;.      }
6610: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
6620: 74 72 63 6d 70 28 7a 2c 22 68 65 61 70 22 29 3d  trcmp(z,"heap")=
6630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
6640: 28 20 69 3e 3d 61 72 67 63 2d 32 20 29 20 61 62  ( i>=argc-2 ) ab
6650: 65 6e 64 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  endError("missin
6660: 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25  g arguments on %
6670: 73 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a  s\n", argv[i]);.
6680: 20 20 20 20 20 20 20 20 6e 48 65 61 70 20 3d 20          nHeap = 
6690: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
66a0: 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20  v[i+1]);.       
66b0: 20 6d 6e 48 65 61 70 20 3d 20 69 6e 74 65 67 65   mnHeap = intege
66c0: 72 56 61 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d  rValue(argv[i+2]
66d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
66e0: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  2;.      }else. 
66f0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6700: 7a 2c 22 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a  z,"help")==0 ){.
6710: 20 20 20 20 20 20 20 20 73 68 6f 77 48 65 6c 70          showHelp
6720: 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ();.        retu
6730: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
6740: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
6750: 6d 70 28 7a 2c 22 6c 6f 6f 6b 61 73 69 64 65 22  mp(z,"lookaside"
6760: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6770: 69 66 28 20 69 3e 3d 61 72 67 63 2d 32 20 29 20  if( i>=argc-2 ) 
6780: 61 62 65 6e 64 45 72 72 6f 72 28 22 6d 69 73 73  abendError("miss
6790: 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e  ing arguments on
67a0: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
67b0: 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 20 3d 20          nLook = 
67c0: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
67d0: 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20 20  v[i+1]);.       
67e0: 20 73 7a 4c 6f 6f 6b 20 3d 20 69 6e 74 65 67 65   szLook = intege
67f0: 72 56 61 6c 75 65 28 61 72 67 76 5b 69 2b 32 5d  rValue(argv[i+2]
6800: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
6810: 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  2;.      }else. 
6820: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6830: 7a 2c 22 6f 6f 6d 22 29 3d 3d 30 20 29 7b 0a 20  z,"oom")==0 ){. 
6840: 20 20 20 20 20 20 20 6f 6f 6d 46 6c 61 67 20 3d         oomFlag =
6850: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a   1;.      }else.
6860: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
6870: 28 7a 2c 22 70 61 67 65 73 69 7a 65 22 29 3d 3d  (z,"pagesize")==
6880: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
6890: 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 61 62 65   i>=argc-1 ) abe
68a0: 6e 64 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  ndError("missing
68b0: 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 25 73 22   argument on %s"
68c0: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
68d0: 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 69      pageSize = i
68e0: 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67 76  ntegerValue(argv
68f0: 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65  [++i]);.      }e
6900: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
6910: 72 63 6d 70 28 7a 2c 22 70 63 61 63 68 65 22 29  rcmp(z,"pcache")
6920: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
6930: 66 28 20 69 3e 3d 61 72 67 63 2d 32 20 29 20 61  f( i>=argc-2 ) a
6940: 62 65 6e 64 45 72 72 6f 72 28 22 6d 69 73 73 69  bendError("missi
6950: 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ng arguments on 
6960: 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  %s", argv[i]);. 
6970: 20 20 20 20 20 20 20 6e 50 43 61 63 68 65 20 3d         nPCache =
6980: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72   integerValue(ar
6990: 67 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20  gv[i+1]);.      
69a0: 20 20 73 7a 50 43 61 63 68 65 20 3d 20 69 6e 74    szPCache = int
69b0: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 69  egerValue(argv[i
69c0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 20  +2]);.        i 
69d0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
69e0: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
69f0: 6d 70 28 7a 2c 22 71 75 69 65 74 22 29 3d 3d 30  mp(z,"quiet")==0
6a00: 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 71 22   || strcmp(z,"q"
6a10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6a20: 71 75 69 65 74 46 6c 61 67 20 3d 20 31 3b 0a 20  quietFlag = 1;. 
6a30: 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 46 6c         verboseFl
6a40: 61 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  ag = 0;.      }e
6a50: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
6a60: 72 63 6d 70 28 7a 2c 22 73 63 72 61 74 63 68 22  rcmp(z,"scratch"
6a70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6a80: 69 66 28 20 69 3e 3d 61 72 67 63 2d 32 20 29 20  if( i>=argc-2 ) 
6a90: 61 62 65 6e 64 45 72 72 6f 72 28 22 6d 69 73 73  abendError("miss
6aa0: 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e  ing arguments on
6ab0: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
6ac0: 20 20 20 20 20 20 20 20 6e 53 63 72 61 74 63 68          nScratch
6ad0: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
6ae0: 61 72 67 76 5b 69 2b 31 5d 29 3b 0a 20 20 20 20  argv[i+1]);.    
6af0: 20 20 20 20 73 7a 53 63 72 61 74 63 68 20 3d 20      szScratch = 
6b00: 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72 67  integerValue(arg
6b10: 76 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  v[i+2]);.       
6b20: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d   i += 2;.      }
6b30: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
6b40: 74 72 63 6d 70 28 7a 2c 20 22 75 6e 69 71 75 65  trcmp(z, "unique
6b50: 2d 63 61 73 65 73 22 29 3d 3d 30 20 29 7b 0a 20  -cases")==0 ){. 
6b60: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72         if( i>=ar
6b70: 67 63 2d 31 20 29 20 61 62 65 6e 64 45 72 72 6f  gc-1 ) abendErro
6b80: 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d  r("missing argum
6b90: 65 6e 74 73 20 6f 6e 20 25 73 22 2c 20 61 72 67  ents on %s", arg
6ba0: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  v[i]);.        i
6bb0: 66 28 20 7a 44 61 74 61 4f 75 74 20 29 20 61 62  f( zDataOut ) ab
6bc0: 65 6e 64 45 72 72 6f 72 28 22 6f 6e 6c 79 20 6f  endError("only o
6bd0: 6e 65 20 2d 2d 6d 69 6e 69 6d 69 7a 65 20 61 6c  ne --minimize al
6be0: 6c 6f 77 65 64 22 29 3b 0a 20 20 20 20 20 20 20  lowed");.       
6bf0: 20 7a 44 61 74 61 4f 75 74 20 3d 20 61 72 67 76   zDataOut = argv
6c00: 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  [++i];.      }el
6c10: 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
6c20: 63 6d 70 28 7a 2c 22 75 74 66 31 36 6c 65 22 29  cmp(z,"utf16le")
6c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
6c40: 45 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 31  Encoding = "utf1
6c50: 36 6c 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73  6le";.      }els
6c60: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
6c70: 6d 70 28 7a 2c 22 75 74 66 31 36 62 65 22 29 3d  mp(z,"utf16be")=
6c80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45  =0 ){.        zE
6c90: 6e 63 6f 64 69 6e 67 20 3d 20 22 75 74 66 31 36  ncoding = "utf16
6ca0: 62 65 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  be";.      }else
6cb0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
6cc0: 70 28 7a 2c 22 76 65 72 62 6f 73 65 22 29 3d 3d  p(z,"verbose")==
6cd0: 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 76  0 || strcmp(z,"v
6ce0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
6cf0: 20 71 75 69 65 74 46 6c 61 67 20 3d 20 30 3b 0a   quietFlag = 0;.
6d00: 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 46          verboseF
6d10: 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  lag = 1;.      }
6d20: 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20  else.      {.   
6d30: 20 20 20 20 20 61 62 65 6e 64 45 72 72 6f 72 28       abendError(
6d40: 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
6d50: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
6d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6d70: 65 7b 0a 20 20 20 20 20 20 61 64 64 4e 65 77 49  e{.      addNewI
6d80: 6e 46 69 6c 65 3a 0a 20 20 20 20 20 20 6e 49 6e  nFile:.      nIn
6d90: 46 69 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 61 7a  File++;.      az
6da0: 49 6e 46 69 6c 65 20 3d 20 72 65 61 6c 6c 6f 63  InFile = realloc
6db0: 28 61 7a 49 6e 46 69 6c 65 2c 20 73 69 7a 65 6f  (azInFile, sizeo
6dc0: 66 28 61 7a 49 6e 46 69 6c 65 5b 30 5d 29 2a 6e  f(azInFile[0])*n
6dd0: 49 6e 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69  InFile);.      i
6de0: 66 28 20 61 7a 49 6e 46 69 6c 65 3d 3d 30 20 29  f( azInFile==0 )
6df0: 20 61 62 65 6e 64 45 72 72 6f 72 28 22 6f 75 74   abendError("out
6e00: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
6e10: 20 20 20 20 61 7a 49 6e 46 69 6c 65 5b 6e 49 6e      azInFile[nIn
6e20: 46 69 6c 65 2d 31 5d 20 3d 20 61 72 67 76 5b 69  File-1] = argv[i
6e30: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  ];.    }.  }..  
6e40: 2f 2a 20 44 6f 20 67 6c 6f 62 61 6c 20 53 51 4c  /* Do global SQL
6e50: 69 74 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ite initializati
6e60: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
6e70: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
6e80: 4e 46 49 47 5f 4c 4f 47 2c 20 76 65 72 62 6f 73  NFIG_LOG, verbos
6e90: 65 46 6c 61 67 20 3f 20 73 68 65 6c 6c 4c 6f 67  eFlag ? shellLog
6ea0: 20 3a 20 73 68 65 6c 6c 4c 6f 67 4e 6f 6f 70 2c   : shellLogNoop,
6eb0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 48 65 61 70   0);.  if( nHeap
6ec0: 3e 30 20 29 7b 0a 20 20 20 20 70 48 65 61 70 20  >0 ){.    pHeap 
6ed0: 3d 20 6d 61 6c 6c 6f 63 28 20 6e 48 65 61 70 20  = malloc( nHeap 
6ee0: 29 3b 0a 20 20 20 20 69 66 28 20 70 48 65 61 70  );.    if( pHeap
6ef0: 3d 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72  ==0 ) fatalError
6f00: 28 22 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74  ("cannot allocat
6f10: 65 20 25 64 2d 62 79 74 65 20 68 65 61 70 5c 6e  e %d-byte heap\n
6f20: 22 2c 20 6e 48 65 61 70 29 3b 0a 20 20 20 20 72  ", nHeap);.    r
6f30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  c = sqlite3_conf
6f40: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
6f50: 5f 48 45 41 50 2c 20 70 48 65 61 70 2c 20 6e 48  _HEAP, pHeap, nH
6f60: 65 61 70 2c 20 6d 6e 48 65 61 70 29 3b 0a 20 20  eap, mnHeap);.  
6f70: 20 20 69 66 28 20 72 63 20 29 20 61 62 65 6e 64    if( rc ) abend
6f80: 45 72 72 6f 72 28 22 68 65 61 70 20 63 6f 6e 66  Error("heap conf
6f90: 69 67 75 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  iguration failed
6fa0: 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  : %d\n", rc);.  
6fb0: 7d 0a 20 20 69 66 28 20 6f 6f 6d 46 6c 61 67 20  }.  if( oomFlag 
6fc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
6fd0: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
6fe0: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 2c 20 26  FIG_GETMALLOC, &
6ff0: 67 2e 73 4f 72 69 67 4d 65 6d 29 3b 0a 20 20 20  g.sOrigMem);.   
7000: 20 67 2e 73 4f 6f 6d 4d 65 6d 20 3d 20 67 2e 73   g.sOomMem = g.s
7010: 4f 72 69 67 4d 65 6d 3b 0a 20 20 20 20 67 2e 73  OrigMem;.    g.s
7020: 4f 6f 6d 4d 65 6d 2e 78 4d 61 6c 6c 6f 63 20 3d  OomMem.xMalloc =
7030: 20 6f 6f 6d 4d 61 6c 6c 6f 63 3b 0a 20 20 20 20   oomMalloc;.    
7040: 67 2e 73 4f 6f 6d 4d 65 6d 2e 78 52 65 61 6c 6c  g.sOomMem.xReall
7050: 6f 63 20 3d 20 6f 6f 6d 52 65 61 6c 6c 6f 63 3b  oc = oomRealloc;
7060: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .    sqlite3_con
7070: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
7080: 47 5f 4d 41 4c 4c 4f 43 2c 20 26 67 2e 73 4f 6f  G_MALLOC, &g.sOo
7090: 6d 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  mMem);.  }.  if(
70a0: 20 6e 4c 6f 6f 6b 3e 30 20 29 7b 0a 20 20 20 20   nLook>0 ){.    
70b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
70c0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
70d0: 4b 41 53 49 44 45 2c 20 30 2c 20 30 29 3b 0a 20  KASIDE, 0, 0);. 
70e0: 20 20 20 69 66 28 20 73 7a 4c 6f 6f 6b 3e 30 20     if( szLook>0 
70f0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 6b 20 3d  ){.      pLook =
7100: 20 6d 61 6c 6c 6f 63 28 20 6e 4c 6f 6f 6b 2a 73   malloc( nLook*s
7110: 7a 4c 6f 6f 6b 20 29 3b 0a 20 20 20 20 20 20 69  zLook );.      i
7120: 66 28 20 70 4c 6f 6f 6b 3d 3d 30 20 29 20 66 61  f( pLook==0 ) fa
7130: 74 61 6c 45 72 72 6f 72 28 22 6f 75 74 20 6f 66  talError("out of
7140: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 7d   memory");.    }
7150: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53 63 72 61  .  }.  if( nScra
7160: 74 63 68 3e 30 20 26 26 20 73 7a 53 63 72 61 74  tch>0 && szScrat
7170: 63 68 3e 30 20 29 7b 0a 20 20 20 20 70 53 63 72  ch>0 ){.    pScr
7180: 61 74 63 68 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  atch = malloc( n
7190: 53 63 72 61 74 63 68 2a 28 73 71 6c 69 74 65 33  Scratch*(sqlite3
71a0: 5f 69 6e 74 36 34 29 73 7a 53 63 72 61 74 63 68  _int64)szScratch
71b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 63 72   );.    if( pScr
71c0: 61 74 63 68 3d 3d 30 20 29 20 66 61 74 61 6c 45  atch==0 ) fatalE
71d0: 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 61 6c 6c  rror("cannot all
71e0: 6f 63 61 74 65 20 25 6c 6c 64 2d 62 79 74 65 20  ocate %lld-byte 
71f0: 73 63 72 61 74 63 68 22 2c 0a 20 20 20 20 20 20  scratch",.      
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 20 20 20 20 20 20 20 20 20 20 6e 53 63 72 61             nScra
7220: 74 63 68 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  tch*(sqlite3_int
7230: 36 34 29 73 7a 53 63 72 61 74 63 68 29 3b 0a 20  64)szScratch);. 
7240: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7250: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
7260: 4e 46 49 47 5f 53 43 52 41 54 43 48 2c 20 70 53  NFIG_SCRATCH, pS
7270: 63 72 61 74 63 68 2c 20 73 7a 53 63 72 61 74 63  cratch, szScratc
7280: 68 2c 20 6e 53 63 72 61 74 63 68 29 3b 0a 20 20  h, nScratch);.  
7290: 20 20 69 66 28 20 72 63 20 29 20 61 62 65 6e 64    if( rc ) abend
72a0: 45 72 72 6f 72 28 22 73 63 72 61 74 63 68 20 63  Error("scratch c
72b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 61 69  onfiguration fai
72c0: 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29 3b  led: %d\n", rc);
72d0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 43 61 63  .  }.  if( nPCac
72e0: 68 65 3e 30 20 26 26 20 73 7a 50 43 61 63 68 65  he>0 && szPCache
72f0: 3e 30 20 29 7b 0a 20 20 20 20 70 50 43 61 63 68  >0 ){.    pPCach
7300: 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 50 43 61  e = malloc( nPCa
7310: 63 68 65 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  che*(sqlite3_int
7320: 36 34 29 73 7a 50 43 61 63 68 65 20 29 3b 0a 20  64)szPCache );. 
7330: 20 20 20 69 66 28 20 70 50 43 61 63 68 65 3d 3d     if( pPCache==
7340: 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  0 ) fatalError("
7350: 63 61 6e 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20  cannot allocate 
7360: 25 6c 6c 64 2d 62 79 74 65 20 70 63 61 63 68 65  %lld-byte pcache
7370: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 20 20 20 20 6e 50 43 61 63 68 65 2a 28 73 71 6c      nPCache*(sql
73a0: 69 74 65 33 5f 69 6e 74 36 34 29 73 7a 50 43 61  ite3_int64)szPCa
73b0: 63 68 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  che);.    rc = s
73c0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
73d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
73e0: 43 41 43 48 45 2c 20 70 50 43 61 63 68 65 2c 20  CACHE, pPCache, 
73f0: 73 7a 50 43 61 63 68 65 2c 20 6e 50 43 61 63 68  szPCache, nPCach
7400: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
7410: 20 61 62 65 6e 64 45 72 72 6f 72 28 22 70 63 61   abendError("pca
7420: 63 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  che configuratio
7430: 6e 20 66 61 69 6c 65 64 3a 20 25 64 22 2c 20 72  n failed: %d", r
7440: 63 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  c);.  }..  /* If
7450: 20 74 68 65 20 2d 2d 75 6e 69 71 75 65 2d 63 61   the --unique-ca
7460: 73 65 73 20 6f 70 74 69 6f 6e 20 77 61 73 20 73  ses option was s
7470: 75 70 70 6c 69 65 64 2c 20 6f 70 65 6e 20 74 68  upplied, open th
7480: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
7490: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 75 73 65  will.  ** be use
74a0: 64 20 74 6f 20 67 61 74 68 65 72 20 75 6e 69 71  d to gather uniq
74b0: 75 65 20 74 65 73 74 20 63 61 73 65 73 2e 0a 20  ue test cases.. 
74c0: 20 2a 2f 0a 20 20 69 66 28 20 7a 44 61 74 61 4f   */.  if( zDataO
74d0: 75 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ut ){.    rc = s
74e0: 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65  qlite3_open(":me
74f0: 6d 6f 72 79 3a 22 2c 20 26 64 61 74 61 44 62 29  mory:", &dataDb)
7500: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 61  ;.    if( rc ) a
7510: 62 65 6e 64 45 72 72 6f 72 28 22 63 61 6e 6e 6f  bendError("canno
7520: 74 20 6f 70 65 6e 20 3a 6d 65 6d 6f 72 79 3a 20  t open :memory: 
7530: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
7540: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
7550: 63 28 64 61 74 61 44 62 2c 0a 20 20 20 20 20 20  c(dataDb,.      
7560: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
7570: 45 20 74 65 73 74 63 61 73 65 28 73 71 6c 20 42  E testcase(sql B
7580: 4c 4f 42 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  LOB PRIMARY KEY,
7590: 20 74 6d 29 20 57 49 54 48 4f 55 54 20 52 4f 57   tm) WITHOUT ROW
75a0: 49 44 3b 22 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  ID;",0,0,0);.   
75b0: 20 69 66 28 20 72 63 20 29 20 61 62 65 6e 64 45   if( rc ) abendE
75c0: 72 72 6f 72 28 22 25 73 22 2c 20 73 71 6c 69 74  rror("%s", sqlit
75d0: 65 33 5f 65 72 72 6d 73 67 28 64 61 74 61 44 62  e3_errmsg(dataDb
75e0: 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ));.    rc = sql
75f0: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7600: 64 61 74 61 44 62 2c 0a 20 20 20 20 20 20 20 20  dataDb,.        
7610: 20 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e    "INSERT OR IGN
7620: 4f 52 45 20 49 4e 54 4f 20 74 65 73 74 63 61 73  ORE INTO testcas
7630: 65 28 73 71 6c 2c 74 6d 29 56 41 4c 55 45 53 28  e(sql,tm)VALUES(
7640: 3f 31 2c 3f 32 29 22 2c 0a 20 20 20 20 20 20 20  ?1,?2)",.       
7650: 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
7660: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
7670: 61 62 65 6e 64 45 72 72 6f 72 28 22 25 73 22 2c  abendError("%s",
7680: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
7690: 64 61 74 61 44 62 29 29 3b 0a 20 20 7d 0a 0a 20  dataDb));.  }.. 
76a0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
76b0: 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  he input buffer 
76c0: 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 53 51 4c  used to hold SQL
76d0: 20 74 65 78 74 20 2a 2f 0a 20 20 69 66 28 20 6e   text */.  if( n
76e0: 49 6e 46 69 6c 65 3d 3d 30 20 29 20 6e 49 6e 46  InFile==0 ) nInF
76f0: 69 6c 65 20 3d 20 31 3b 0a 20 20 6e 41 6c 6c 6f  ile = 1;.  nAllo
7700: 63 20 3d 20 31 30 30 30 3b 0a 20 20 7a 49 6e 20  c = 1000;.  zIn 
7710: 3d 20 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29  = malloc(nAlloc)
7720: 3b 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29  ;.  if( zIn==0 )
7730: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6f 75 74   fatalError("out
7740: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 0a 20   of memory");.. 
7750: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
7760: 6c 20 69 6e 70 75 74 20 66 69 6c 65 73 20 2a 2f  l input files */
7770: 0a 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c  .  for(jj=0; jj<
7780: 6e 49 6e 46 69 6c 65 3b 20 6a 6a 2b 2b 29 7b 0a  nInFile; jj++){.
7790: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
77a0: 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
77b0: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  t of the next in
77c0: 70 75 74 20 66 69 6c 65 20 69 6e 74 6f 20 7a 49  put file into zI
77d0: 6e 5b 5d 20 2a 2f 0a 20 20 20 20 46 49 4c 45 20  n[] */.    FILE 
77e0: 2a 69 6e 3b 0a 20 20 20 20 69 66 28 20 61 7a 49  *in;.    if( azI
77f0: 6e 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  nFile ){.      i
7800: 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 20 20 69  nt j, k;.      i
7810: 6e 20 3d 20 66 6f 70 65 6e 28 61 7a 49 6e 46 69  n = fopen(azInFi
7820: 6c 65 5b 6a 6a 5d 2c 22 72 62 22 29 3b 0a 20 20  le[jj],"rb");.  
7830: 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b      if( in==0 ){
7840: 0a 20 20 20 20 20 20 20 20 61 62 65 6e 64 45 72  .        abendEr
7850: 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror("cannot open
7860: 20 25 73 20 66 6f 72 20 72 65 61 64 69 6e 67 22   %s for reading"
7870: 2c 20 61 7a 49 6e 46 69 6c 65 5b 6a 6a 5d 29 3b  , azInFile[jj]);
7880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
7890: 50 72 6f 6d 70 74 20 3d 20 61 7a 49 6e 46 69 6c  Prompt = azInFil
78a0: 65 5b 6a 6a 5d 3b 0a 20 20 20 20 20 20 66 6f 72  e[jj];.      for
78b0: 28 6a 3d 6b 3d 30 3b 20 7a 50 72 6f 6d 70 74 5b  (j=k=0; zPrompt[
78c0: 6a 5d 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 50 72  j]; j++) if( zPr
78d0: 6f 6d 70 74 5b 6a 5d 3d 3d 27 2f 27 20 29 20 6b  ompt[j]=='/' ) k
78e0: 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 7a 50   = j+1;.      zP
78f0: 72 6f 6d 70 74 20 2b 3d 20 6b 3b 0a 20 20 20 20  rompt += k;.    
7900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 20  }else{.      in 
7910: 3d 20 73 74 64 69 6e 3b 0a 20 20 20 20 20 20 7a  = stdin;.      z
7920: 50 72 6f 6d 70 74 20 3d 20 22 3c 73 74 64 69 6e  Prompt = "<stdin
7930: 3e 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  >";.    }.    wh
7940: 69 6c 65 28 20 21 66 65 6f 66 28 69 6e 29 20 29  ile( !feof(in) )
7950: 7b 0a 20 20 20 20 20 20 67 6f 74 20 3d 20 66 72  {.      got = fr
7960: 65 61 64 28 7a 49 6e 2b 6e 49 6e 2c 20 31 2c 20  ead(zIn+nIn, 1, 
7970: 6e 41 6c 6c 6f 63 2d 6e 49 6e 2d 31 2c 20 69 6e  nAlloc-nIn-1, in
7980: 29 3b 20 0a 20 20 20 20 20 20 6e 49 6e 20 2b 3d  ); .      nIn +=
7990: 20 28 69 6e 74 29 67 6f 74 3b 0a 20 20 20 20 20   (int)got;.     
79a0: 20 7a 49 6e 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20   zIn[nIn] = 0;. 
79b0: 20 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 30 20       if( got==0 
79c0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
79d0: 66 28 20 6e 41 6c 6c 6f 63 20 2d 20 6e 49 6e 20  f( nAlloc - nIn 
79e0: 2d 20 31 20 3c 20 31 30 30 20 29 7b 0a 20 20 20  - 1 < 100 ){.   
79f0: 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 6e       nAlloc += n
7a00: 41 6c 6c 6f 63 2b 31 30 30 30 3b 0a 20 20 20 20  Alloc+1000;.    
7a10: 20 20 20 20 7a 49 6e 20 3d 20 72 65 61 6c 6c 6f      zIn = reallo
7a20: 63 28 7a 49 6e 2c 20 6e 41 6c 6c 6f 63 29 3b 0a  c(zIn, nAlloc);.
7a30: 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 6e 3d          if( zIn=
7a40: 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  =0 ) fatalError(
7a50: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
7a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7a70: 20 20 20 20 69 66 28 20 69 6e 21 3d 73 74 64 69      if( in!=stdi
7a80: 6e 20 29 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  n ) fclose(in);.
7a90: 20 20 20 20 6c 61 73 74 50 63 74 20 3d 20 2d 31      lastPct = -1
7aa0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 69  ;..    /* Skip i
7ab0: 6e 69 74 69 61 6c 20 6c 69 6e 65 73 20 6f 66 20  nitial lines of 
7ac0: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74  the input file t
7ad0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22  hat begin with "
7ae0: 23 22 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  #" */.    for(i=
7af0: 30 3b 20 69 3c 6e 49 6e 3b 20 69 3d 69 4e 65 78  0; i<nIn; i=iNex
7b00: 74 2b 31 29 7b 0a 20 20 20 20 20 20 69 66 28 20  t+1){.      if( 
7b10: 7a 49 6e 5b 69 5d 21 3d 27 23 27 20 29 20 62 72  zIn[i]!='#' ) br
7b20: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
7b30: 4e 65 78 74 3d 69 2b 31 3b 20 69 4e 65 78 74 3c  Next=i+1; iNext<
7b40: 6e 49 6e 20 26 26 20 7a 49 6e 5b 69 4e 65 78 74  nIn && zIn[iNext
7b50: 5d 21 3d 27 5c 6e 27 3b 20 69 4e 65 78 74 2b 2b  ]!='\n'; iNext++
7b60: 29 7b 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 48  ){}.    }.    nH
7b70: 65 61 64 65 72 20 3d 20 69 3b 0a 0a 20 20 20 20  eader = i;..    
7b80: 2f 2a 20 50 72 6f 63 65 73 73 20 61 6c 6c 20 74  /* Process all t
7b90: 65 73 74 20 63 61 73 65 73 20 63 6f 6e 74 61 69  est cases contai
7ba0: 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 69  ned within the i
7bb0: 6e 70 75 74 20 66 69 6c 65 2e 0a 20 20 20 20 2a  nput file..    *
7bc0: 2f 0a 20 20 20 20 66 6f 72 28 3b 20 69 3c 6e 49  /.    for(; i<nI
7bd0: 6e 3b 20 69 3d 69 4e 65 78 74 2c 20 6e 54 65 73  n; i=iNext, nTes
7be0: 74 2b 2b 2c 20 67 2e 7a 54 65 73 74 4e 61 6d 65  t++, g.zTestName
7bf0: 5b 30 5d 3d 30 29 7b 0a 20 20 20 20 20 20 63 68  [0]=0){.      ch
7c00: 61 72 20 63 53 61 76 65 64 3b 0a 20 20 20 20 20  ar cSaved;.     
7c10: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 49   if( strncmp(&zI
7c20: 6e 5b 69 5d 2c 20 22 2f 2a 2a 2a 2a 3c 22 2c 36  n[i], "/****<",6
7c30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7c40: 63 68 61 72 20 2a 7a 20 3d 20 73 74 72 73 74 72  char *z = strstr
7c50: 28 26 7a 49 6e 5b 69 5d 2c 20 22 3e 2a 2a 2a 2a  (&zIn[i], ">****
7c60: 2f 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  /");.        if(
7c70: 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   z ){.          
7c80: 7a 20 2b 3d 20 36 3b 0a 20 20 20 20 20 20 20 20  z += 6;.        
7c90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7ca0: 74 66 28 73 69 7a 65 6f 66 28 67 2e 7a 54 65 73  tf(sizeof(g.zTes
7cb0: 74 4e 61 6d 65 29 2c 20 67 2e 7a 54 65 73 74 4e  tName), g.zTestN
7cc0: 61 6d 65 2c 20 22 25 2e 2a 73 22 2c 20 0a 20 20  ame, "%.*s", .  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 7a           (int)(z
7cf0: 2d 26 7a 49 6e 5b 69 5d 29 20 2d 20 31 32 2c 20  -&zIn[i]) - 12, 
7d00: 26 7a 49 6e 5b 69 2b 36 5d 29 3b 0a 20 20 20 20  &zIn[i+6]);.    
7d10: 20 20 20 20 20 20 69 66 28 20 76 65 72 62 6f 73        if( verbos
7d20: 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  eFlag ){.       
7d30: 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 2e 2a       printf("%.*
7d40: 73 5c 6e 22 2c 20 28 69 6e 74 29 28 7a 2d 26 7a  s\n", (int)(z-&z
7d50: 49 6e 5b 69 5d 29 2c 20 26 7a 49 6e 5b 69 5d 29  In[i]), &zIn[i])
7d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 66  ;.            ff
7d70: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
7d80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7d90: 20 20 20 20 69 20 2b 3d 20 28 69 6e 74 29 28 7a      i += (int)(z
7da0: 2d 26 7a 49 6e 5b 69 5d 29 3b 0a 20 20 20 20 20  -&zIn[i]);.     
7db0: 20 20 20 20 20 6d 75 6c 74 69 54 65 73 74 20 3d       multiTest =
7dc0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
7de0: 69 4e 65 78 74 3d 69 3b 20 69 4e 65 78 74 3c 6e  iNext=i; iNext<n
7df0: 49 6e 20 26 26 20 73 74 72 6e 63 6d 70 28 26 7a  In && strncmp(&z
7e00: 49 6e 5b 69 4e 65 78 74 5d 2c 22 2f 2a 2a 2a 2a  In[iNext],"/****
7e10: 3c 22 2c 36 29 21 3d 30 3b 20 69 4e 65 78 74 2b  <",6)!=0; iNext+
7e20: 2b 29 7b 7d 0a 20 20 20 20 20 20 63 53 61 76 65  +){}.      cSave
7e30: 64 20 3d 20 7a 49 6e 5b 69 4e 65 78 74 5d 3b 0a  d = zIn[iNext];.
7e40: 20 20 20 20 20 20 7a 49 6e 5b 69 4e 65 78 74 5d        zIn[iNext]
7e50: 20 3d 20 30 3b 0a 0a 0a 20 20 20 20 20 20 2f 2a   = 0;...      /*
7e60: 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 53   Print out the S
7e70: 51 4c 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  QL of the next t
7e80: 65 73 74 20 63 61 73 65 20 69 73 20 2d 2d 76 65  est case is --ve
7e90: 72 62 6f 73 65 20 69 73 20 65 6e 61 62 6c 65 64  rbose is enabled
7ea0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7eb0: 7a 53 71 6c 20 3d 20 26 7a 49 6e 5b 69 5d 3b 0a  zSql = &zIn[i];.
7ec0: 20 20 20 20 20 20 69 66 28 20 76 65 72 62 6f 73        if( verbos
7ed0: 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  eFlag ){.       
7ee0: 20 70 72 69 6e 74 66 28 22 49 4e 50 55 54 20 28   printf("INPUT (
7ef0: 6f 66 66 73 65 74 3a 20 25 64 2c 20 73 69 7a 65  offset: %d, size
7f00: 3a 20 25 64 29 3a 20 5b 25 73 5d 5c 6e 22 2c 0a  : %d): [%s]\n",.
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 69 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 26  i, (int)strlen(&
7f30: 7a 49 6e 5b 69 5d 29 2c 20 26 7a 49 6e 5b 69 5d  zIn[i]), &zIn[i]
7f40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7f50: 66 28 20 6d 75 6c 74 69 54 65 73 74 20 26 26 20  f( multiTest && 
7f60: 21 71 75 69 65 74 46 6c 61 67 20 29 7b 0a 20 20  !quietFlag ){.  
7f70: 20 20 20 20 20 20 69 66 28 20 6f 6f 6d 46 6c 61        if( oomFla
7f80: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
7f90: 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 67 2e  rintf("%s\n", g.
7fa0: 7a 54 65 73 74 4e 61 6d 65 29 3b 0a 20 20 20 20  zTestName);.    
7fb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7fc0: 20 20 20 20 20 69 6e 74 20 70 63 74 20 3d 20 28       int pct = (
7fd0: 31 30 2a 69 4e 65 78 74 29 2f 6e 49 6e 3b 0a 20  10*iNext)/nIn;. 
7fe0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 74           if( pct
7ff0: 21 3d 6c 61 73 74 50 63 74 20 29 7b 0a 20 20 20  !=lastPct ){.   
8000: 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73           if( las
8010: 74 50 63 74 3c 30 20 29 20 70 72 69 6e 74 66 28  tPct<0 ) printf(
8020: 22 25 73 3a 22 2c 20 7a 50 72 6f 6d 70 74 29 3b  "%s:", zPrompt);
8030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
8040: 6e 74 66 28 22 20 25 64 25 25 22 2c 20 70 63 74  ntf(" %d%%", pct
8050: 2a 31 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *10);.          
8060: 20 20 6c 61 73 74 50 63 74 20 3d 20 70 63 74 3b    lastPct = pct;
8070: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8090: 73 65 20 69 66 28 20 6e 49 6e 46 69 6c 65 3e 31  se if( nInFile>1
80a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
80b0: 74 66 28 22 25 73 5c 6e 22 2c 20 7a 50 72 6f 6d  tf("%s\n", zProm
80c0: 70 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pt);.      }.   
80d0: 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74     fflush(stdout
80e0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 75 6e  );..      /* Run
80f0: 20 74 68 65 20 6e 65 78 74 20 74 65 73 74 20 63   the next test c
8100: 61 73 65 2e 20 20 52 75 6e 20 69 74 20 6d 75 6c  ase.  Run it mul
8110: 74 69 70 6c 65 20 74 69 6d 65 73 20 69 6e 20 2d  tiple times in -
8120: 2d 6f 6f 6d 20 6d 6f 64 65 0a 20 20 20 20 20 20  -oom mode.      
8130: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 6f 6d  */.      if( oom
8140: 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
8150: 6f 6f 6d 43 6e 74 20 3d 20 67 2e 69 4f 6f 6d 43  oomCnt = g.iOomC
8160: 6e 74 64 6f 77 6e 20 3d 20 31 3b 0a 20 20 20 20  ntdown = 1;.    
8170: 20 20 20 20 67 2e 6e 4f 6f 6d 46 61 75 6c 74 20      g.nOomFault 
8180: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 2e 62  = 0;.        g.b
8190: 4f 6f 6d 4f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  OomOnce = 1;.   
81a0: 20 20 20 20 20 69 66 28 20 76 65 72 62 6f 73 65       if( verbose
81b0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
81c0: 20 20 70 72 69 6e 74 66 28 22 4f 6e 63 65 2e 25    printf("Once.%
81d0: 64 5c 6e 22 2c 20 6f 6f 6d 43 6e 74 29 3b 0a 20  d\n", oomCnt);. 
81e0: 20 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28           fflush(
81f0: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  stdout);.       
8200: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
8210: 20 20 20 20 20 20 20 20 6f 6f 6d 43 6e 74 20 3d          oomCnt =
8220: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8230: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66    do{.        if
8240: 28 20 7a 44 62 4e 61 6d 65 20 29 7b 0a 20 20 20  ( zDbName ){.   
8250: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8260: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44 62 4e  te3_open_v2(zDbN
8270: 61 6d 65 2c 20 26 64 62 2c 20 53 51 4c 49 54 45  ame, &db, SQLITE
8280: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c  _OPEN_READWRITE,
8290: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
82a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
82b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
82c0: 61 62 65 6e 64 45 72 72 6f 72 28 22 43 61 6e 6e  abendError("Cann
82d0: 6f 74 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ot open database
82e0: 20 66 69 6c 65 20 25 73 22 2c 20 7a 44 62 4e 61   file %s", zDbNa
82f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
8300: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
8310: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
8320: 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
8330: 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 61 69              "mai
8340: 6e 2e 64 62 22 2c 20 26 64 62 2c 0a 20 20 20 20  n.db", &db,.    
8350: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
8360: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
8370: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
8380: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
8390: 5f 4d 45 4d 4f 52 59 2c 0a 20 20 20 20 20 20 20  _MEMORY,.       
83a0: 20 20 20 20 20 30 29 3b 0a 20 20 20 20 20 20 20       0);.       
83b0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
83c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
83d0: 20 20 20 20 61 62 65 6e 64 45 72 72 6f 72 28 22      abendError("
83e0: 55 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  Unable to open t
83f0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
8400: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 20  abase");.       
8410: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
8420: 20 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 6b         if( pLook
8430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
8440: 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f   = sqlite3_db_co
8450: 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
8460: 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49  DBCONFIG_LOOKASI
8470: 44 45 2c 70 4c 6f 6f 6b 2c 73 7a 4c 6f 6f 6b 2c  DE,pLook,szLook,
8480: 6e 4c 6f 6f 6b 29 3b 0a 20 20 20 20 20 20 20 20  nLook);.        
8490: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
84a0: 5f 4f 4b 20 29 20 61 62 65 6e 64 45 72 72 6f 72  _OK ) abendError
84b0: 28 22 6c 6f 6f 6b 61 73 69 64 65 20 63 6f 6e 66  ("lookaside conf
84c0: 69 67 75 72 61 74 69 6f 6e 20 66 69 6c 65 64 3a  iguration filed:
84d0: 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 20   %d", rc);.     
84e0: 20 20 20 7d 0a 20 20 20 20 23 69 66 6e 64 65 66     }.    #ifndef
84f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
8500: 43 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  CE.        sqlit
8510: 65 33 5f 74 72 61 63 65 28 64 62 2c 20 76 65 72  e3_trace(db, ver
8520: 62 6f 73 65 46 6c 61 67 20 3f 20 74 72 61 63 65  boseFlag ? trace
8530: 43 61 6c 6c 62 61 63 6b 20 3a 20 74 72 61 63 65  Callback : trace
8540: 4e 6f 6f 70 2c 20 30 29 3b 0a 20 20 20 20 23 65  Noop, 0);.    #e
8550: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
8560: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8570: 74 69 6f 6e 28 64 62 2c 20 22 65 76 61 6c 22 2c  tion(db, "eval",
8580: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
8590: 20 30 2c 20 73 71 6c 45 76 61 6c 46 75 6e 63 2c   0, sqlEvalFunc,
85a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
85b0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
85c0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 65 76 61  unction(db, "eva
85d0: 6c 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54  l", 2, SQLITE_UT
85e0: 46 38 2c 20 30 2c 20 73 71 6c 45 76 61 6c 46 75  F8, 0, sqlEvalFu
85f0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  nc, 0, 0);.     
8600: 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
8610: 65 5f 6d 6f 64 75 6c 65 28 64 62 2c 20 22 67 65  e_module(db, "ge
8620: 6e 65 72 61 74 65 5f 73 65 72 69 65 73 22 2c 20  nerate_series", 
8630: 26 73 65 72 69 65 73 4d 6f 64 75 6c 65 2c 20 30  &seriesModule, 0
8640: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
8650: 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 53 51 4c  e3_limit(db, SQL
8660: 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
8670: 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 20 20  , 1000000);.    
8680: 20 20 20 20 69 66 28 20 7a 45 6e 63 6f 64 69 6e      if( zEncodin
8690: 67 20 29 20 73 71 6c 65 78 65 63 28 64 62 2c 20  g ) sqlexec(db, 
86a0: 22 50 52 41 47 4d 41 20 65 6e 63 6f 64 69 6e 67  "PRAGMA encoding
86b0: 3d 25 73 22 2c 20 7a 45 6e 63 6f 64 69 6e 67 29  =%s", zEncoding)
86c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 61  ;.        if( pa
86d0: 67 65 53 69 7a 65 20 29 20 73 71 6c 65 78 65 63  geSize ) sqlexec
86e0: 28 64 62 2c 20 22 50 52 41 47 4d 41 20 70 61 67  (db, "PRAGMA pag
86f0: 65 73 69 7a 65 3d 25 64 22 2c 20 70 61 67 65 53  esize=%d", pageS
8700: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ize);.        if
8710: 28 20 64 6f 41 75 74 6f 76 61 63 20 29 20 73 71  ( doAutovac ) sq
8720: 6c 65 78 65 63 28 64 62 2c 20 22 50 52 41 47 4d  lexec(db, "PRAGM
8730: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 46 55  A auto_vacuum=FU
8740: 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20 69 53  LL");.        iS
8750: 74 61 72 74 20 3d 20 74 69 6d 65 4f 66 44 61 79  tart = timeOfDay
8760: 28 29 3b 0a 20 20 20 20 20 20 20 20 67 2e 62 4f  ();.        g.bO
8770: 6f 6d 45 6e 61 62 6c 65 20 3d 20 31 3b 0a 20 20  omEnable = 1;.  
8780: 20 20 20 20 20 20 69 66 28 20 76 65 72 62 6f 73        if( verbos
8790: 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  eFlag ){.       
87a0: 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
87b0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
87c0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
87d0: 7a 53 71 6c 2c 20 65 78 65 63 43 61 6c 6c 62 61  zSql, execCallba
87e0: 63 6b 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29  ck, 0, &zErrMsg)
87f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
8800: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
8810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8820: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
8830: 45 72 72 42 75 66 29 2c 7a 45 72 72 42 75 66 2c  ErrBuf),zErrBuf,
8840: 22 25 7a 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  "%z", zErrMsg);.
8850: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 72 72              zErr
8860: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
8870: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
8880: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72  se {.          r
8890: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
88a0: 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 4e  (db, zSql, execN
88b0: 6f 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  oop, 0, 0);.    
88c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 2e      }.        g.
88d0: 62 4f 6f 6d 45 6e 61 62 6c 65 20 3d 20 30 3b 0a  bOomEnable = 0;.
88e0: 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 74          iEnd = t
88f0: 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20  imeOfDay();.    
8900: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8910: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
8920: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
8930: 20 20 20 20 20 20 20 20 61 62 65 6e 64 45 72 72          abendErr
8940: 6f 72 28 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73  or("sqlite3_clos
8950: 65 28 29 20 66 61 69 6c 65 64 20 77 69 74 68 20  e() failed with 
8960: 72 63 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20  rc=%d", rc);.   
8970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8980: 66 28 20 21 7a 44 61 74 61 4f 75 74 20 26 26 20  f( !zDataOut && 
8990: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
89a0: 73 65 64 28 29 3e 30 20 29 7b 0a 20 20 20 20 20  sed()>0 ){.     
89b0: 20 20 20 20 20 61 62 65 6e 64 45 72 72 6f 72 28       abendError(
89c0: 22 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 61  "memory in use a
89d0: 66 74 65 72 20 63 6c 6f 73 65 3a 20 25 6c 6c 64  fter close: %lld
89e0: 20 62 79 74 65 73 22 2c 73 71 6c 69 74 65 33 5f   bytes",sqlite3_
89f0: 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 29 3b 0a  memory_used());.
8a00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8a10: 20 20 69 66 28 20 6f 6f 6d 46 6c 61 67 20 29 7b    if( oomFlag ){
8a20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  .          /* Li
8a30: 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  mit the number o
8a40: 66 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20  f iterations of 
8a50: 74 68 65 20 4f 4f 4d 20 6c 6f 6f 70 20 74 6f 20  the OOM loop to 
8a60: 4f 4f 4d 5f 4d 41 58 2e 20 20 49 66 20 74 68 65  OOM_MAX.  If the
8a70: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
8a80: 72 73 74 20 70 61 73 73 20 28 73 69 6e 67 6c 65  rst pass (single
8a90: 20 66 61 69 6c 75 72 65 29 20 65 78 63 65 65 64   failure) exceed
8aa0: 73 20 32 2f 33 72 64 73 20 6f 66 20 4f 4f 4d 5f  s 2/3rds of OOM_
8ab0: 4d 41 58 20 74 68 69 73 20 73 6b 69 70 20 74 68  MAX this skip th
8ac0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
8ad0: 65 63 6f 6e 64 20 70 61 73 73 20 28 63 6f 6e 74  econd pass (cont
8ae0: 69 6e 75 6f 75 73 20 66 61 69 6c 75 72 65 20 61  inuous failure a
8af0: 66 74 65 72 20 66 69 72 73 74 29 20 63 6f 6d 70  fter first) comp
8b00: 6c 65 74 65 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  letely. */.     
8b10: 20 20 20 20 20 69 66 28 20 67 2e 6e 4f 6f 6d 46       if( g.nOomF
8b20: 61 75 6c 74 3d 3d 30 20 7c 7c 20 6f 6f 6d 43 6e  ault==0 || oomCn
8b30: 74 3e 4f 4f 4d 5f 4d 41 58 20 29 7b 0a 20 20 20  t>OOM_MAX ){.   
8b40: 20 20 20 20 20 20 20 20 20 69 66 28 20 67 2e 62           if( g.b
8b50: 4f 6f 6d 4f 6e 63 65 20 26 26 20 6f 6f 6d 43 6e  OomOnce && oomCn
8b60: 74 3c 3d 28 4f 4f 4d 5f 4d 41 58 2a 32 2f 33 29  t<=(OOM_MAX*2/3)
8b70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8b80: 20 20 6f 6f 6d 43 6e 74 20 3d 20 67 2e 69 4f 6f    oomCnt = g.iOo
8b90: 6d 43 6e 74 64 6f 77 6e 20 3d 20 31 3b 0a 20 20  mCntdown = 1;.  
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 62 4f              g.bO
8bb0: 6f 6d 4f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20  omOnce = 0;.    
8bc0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6f 6d               oom
8be0: 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cnt = 0;.       
8bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8c00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8c10: 20 20 20 20 67 2e 69 4f 6f 6d 43 6e 74 64 6f 77      g.iOomCntdow
8c20: 6e 20 3d 20 2b 2b 6f 6f 6d 43 6e 74 3b 0a 20 20  n = ++oomCnt;.  
8c30: 20 20 20 20 20 20 20 20 20 20 67 2e 6e 4f 6f 6d            g.nOom
8c40: 46 61 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  Fault = 0;.     
8c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
8c60: 20 69 66 28 20 6f 6f 6d 43 6e 74 20 29 7b 0a 20   if( oomCnt ){. 
8c70: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
8c80: 65 72 62 6f 73 65 46 6c 61 67 20 29 7b 0a 20 20  erboseFlag ){.  
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
8ca0: 74 66 28 22 25 73 2e 25 64 5c 6e 22 2c 20 67 2e  tf("%s.%d\n", g.
8cb0: 62 4f 6f 6d 4f 6e 63 65 20 3f 20 22 4f 6e 63 65  bOomOnce ? "Once
8cc0: 22 20 3a 20 22 4d 75 6c 74 69 22 2c 20 6f 6f 6d  " : "Multi", oom
8cd0: 43 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cnt);.          
8ce0: 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75      fflush(stdou
8cf0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
8d00: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 54  }.            nT
8d10: 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  est++;.         
8d20: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
8d30: 20 20 20 7d 77 68 69 6c 65 28 20 6f 6f 6d 43 6e     }while( oomCn
8d40: 74 3e 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  t>0 );..      /*
8d50: 20 53 74 6f 72 65 20 75 6e 69 71 75 65 20 74 65   Store unique te
8d60: 73 74 20 63 61 73 65 73 20 69 6e 20 74 68 65 20  st cases in the 
8d70: 69 6e 20 74 68 65 20 64 61 74 61 44 62 20 64 61  in the dataDb da
8d80: 74 61 62 61 73 65 20 69 66 20 74 68 65 0a 20 20  tabase if the.  
8d90: 20 20 20 20 2a 2a 20 2d 2d 75 6e 69 71 75 65 2d      ** --unique-
8da0: 63 61 73 65 73 20 66 6c 61 67 20 69 73 20 70 72  cases flag is pr
8db0: 65 73 65 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20  esent.      */. 
8dc0: 20 20 20 20 20 69 66 28 20 7a 44 61 74 61 4f 75       if( zDataOu
8dd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
8de0: 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70  ite3_bind_blob(p
8df0: 53 74 6d 74 2c 20 31 2c 20 26 7a 49 6e 5b 69 5d  Stmt, 1, &zIn[i]
8e00: 2c 20 69 4e 65 78 74 2d 69 2c 20 53 51 4c 49 54  , iNext-i, SQLIT
8e10: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
8e20: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
8e30: 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 32 2c 20  int64(pStmt, 2, 
8e40: 69 45 6e 64 20 2d 20 69 53 74 61 72 74 29 3b 0a  iEnd - iStart);.
8e50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8e60: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
8e70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
8e80: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  !=SQLITE_DONE ) 
8e90: 61 62 65 6e 64 45 72 72 6f 72 28 22 25 73 22 2c  abendError("%s",
8ea0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
8eb0: 64 61 74 61 44 62 29 29 3b 0a 20 20 20 20 20 20  dataDb));.      
8ec0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
8ed0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pStmt);.      }.
8ee0: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 74  .      /* Free t
8ef0: 68 65 20 53 51 4c 20 66 72 6f 6d 20 74 68 65 20  he SQL from the 
8f00: 63 75 72 72 65 6e 74 20 74 65 73 74 20 63 61 73  current test cas
8f10: 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  e.      */.     
8f20: 20 69 66 28 20 7a 54 6f 46 72 65 65 20 29 7b 0a   if( zToFree ){.
8f30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8f40: 66 72 65 65 28 7a 54 6f 46 72 65 65 29 3b 0a 20  free(zToFree);. 
8f50: 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
8f60: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8f70: 20 20 7a 49 6e 5b 69 4e 65 78 74 5d 20 3d 20 63    zIn[iNext] = c
8f80: 53 61 76 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  Saved;..      /*
8f90: 20 53 68 6f 77 20 74 65 73 74 2d 63 61 73 65 20   Show test-case 
8fa0: 72 65 73 75 6c 74 73 20 69 6e 20 2d 2d 76 65 72  results in --ver
8fb0: 62 6f 73 65 20 6d 6f 64 65 0a 20 20 20 20 20 20  bose mode.      
8fc0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 76 65 72  */.      if( ver
8fd0: 62 6f 73 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  boseFlag ){.    
8fe0: 20 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 55      printf("RESU
8ff0: 4c 54 2d 43 4f 44 45 3a 20 25 64 5c 6e 22 2c 20  LT-CODE: %d\n", 
9000: 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
9010: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
9020: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 45 52        printf("ER
9030: 52 4f 52 2d 4d 53 47 3a 20 5b 25 73 5d 5c 6e 22  ROR-MSG: [%s]\n"
9040: 2c 20 7a 45 72 72 42 75 66 29 3b 0a 20 20 20 20  , zErrBuf);.    
9050: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 66      }.        ff
9060: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
9070: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
9080: 53 69 6d 75 6c 61 74 65 20 61 6e 20 65 72 72 6f  Simulate an erro
9090: 72 20 69 66 20 74 68 65 20 54 45 53 54 5f 46 41  r if the TEST_FA
90a0: 49 4c 55 52 45 20 65 6e 76 69 72 6f 6e 6d 65 6e  ILURE environmen
90b0: 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 22 35  t variable is "5
90c0: 22 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  "..      ** This
90d0: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69   is used to veri
90e0: 66 79 20 74 68 61 74 20 61 75 74 6f 6d 61 74 65  fy that automate
90f0: 64 20 74 65 73 74 20 73 63 72 69 70 74 20 72 65  d test script re
9100: 61 6c 6c 79 20 64 6f 20 73 70 6f 74 0a 20 20 20  ally do spot.   
9110: 20 20 20 2a 2a 20 65 72 72 6f 72 73 20 74 68 61     ** errors tha
9120: 74 20 6f 63 63 75 72 20 69 6e 20 74 68 69 73 20  t occur in this 
9130: 74 65 73 74 20 70 72 6f 67 72 61 6d 2e 0a 20 20  test program..  
9140: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
9150: 20 7a 46 61 69 6c 43 6f 64 65 20 29 7b 0a 20 20   zFailCode ){.  
9160: 20 20 20 20 20 20 69 66 28 20 7a 46 61 69 6c 43        if( zFailC
9170: 6f 64 65 5b 30 5d 3d 3d 27 35 27 20 26 26 20 7a  ode[0]=='5' && z
9180: 46 61 69 6c 43 6f 64 65 5b 31 5d 3d 3d 30 20 29  FailCode[1]==0 )
9190: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 62 65 6e  {.          aben
91a0: 64 45 72 72 6f 72 28 22 73 69 6d 75 6c 61 74 65  dError("simulate
91b0: 64 20 66 61 69 6c 75 72 65 22 29 3b 0a 20 20 20  d failure");.   
91c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
91d0: 46 61 69 6c 43 6f 64 65 5b 30 5d 21 3d 30 20 29  FailCode[0]!=0 )
91e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
91f0: 66 20 54 45 53 54 5f 46 41 49 4c 55 52 45 20 69  f TEST_FAILURE i
9200: 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
9210: 72 20 74 68 61 6e 20 35 2c 20 6a 75 73 74 20 65  r than 5, just e
9220: 78 69 74 20 74 68 65 20 74 65 73 74 0a 20 20 20  xit the test.   
9230: 20 20 20 20 20 20 20 2a 2a 20 65 61 72 6c 79 20         ** early 
9240: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  */.          pri
9250: 6e 74 66 28 22 5c 6e 45 78 69 74 20 65 61 72 6c  ntf("\nExit earl
9260: 79 20 64 75 65 20 74 6f 20 54 45 53 54 5f 46 41  y due to TEST_FA
9270: 49 4c 55 52 45 20 62 65 69 6e 67 20 73 65 74 22  ILURE being set"
9280: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
9290: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
92a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
92b0: 69 66 28 20 21 76 65 72 62 6f 73 65 46 6c 61 67  if( !verboseFlag
92c0: 20 26 26 20 6d 75 6c 74 69 54 65 73 74 20 26 26   && multiTest &&
92d0: 20 21 71 75 69 65 74 46 6c 61 67 20 26 26 20 21   !quietFlag && !
92e0: 6f 6f 6d 46 6c 61 67 20 29 20 70 72 69 6e 74 66  oomFlag ) printf
92f0: 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ("\n");.  }..  /
9300: 2a 20 52 65 70 6f 72 74 20 74 6f 74 61 6c 20 6e  * Report total n
9310: 75 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20 72  umber of tests r
9320: 75 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 54  un.  */.  if( nT
9330: 65 73 74 3e 31 20 26 26 20 21 71 75 69 65 74 46  est>1 && !quietF
9340: 6c 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  lag ){.    sqlit
9350: 65 33 5f 69 6e 74 36 34 20 69 45 6c 61 70 73 65  e3_int64 iElapse
9360: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 20 2d   = timeOfDay() -
9370: 20 69 42 65 67 69 6e 3b 0a 20 20 20 20 70 72 69   iBegin;.    pri
9380: 6e 74 66 28 22 25 73 3a 20 30 20 65 72 72 6f 72  ntf("%s: 0 error
9390: 73 20 6f 75 74 20 6f 66 20 25 64 20 74 65 73 74  s out of %d test
93a0: 73 20 69 6e 20 25 64 2e 25 30 33 64 20 73 65 63  s in %d.%03d sec
93b0: 6f 6e 64 73 5c 6e 53 51 4c 69 74 65 20 25 73 20  onds\nSQLite %s 
93c0: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
93d0: 20 20 67 2e 7a 41 72 67 76 30 2c 20 6e 54 65 73    g.zArgv0, nTes
93e0: 74 2c 20 28 69 6e 74 29 28 69 45 6c 61 70 73 65  t, (int)(iElapse
93f0: 2f 31 30 30 30 29 2c 20 28 69 6e 74 29 28 69 45  /1000), (int)(iE
9400: 6c 61 70 73 65 25 31 30 30 30 29 2c 0a 20 20 20  lapse%1000),.   
9410: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9420: 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71  libversion(), sq
9430: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
9440: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
9450: 74 65 20 74 68 65 20 75 6e 69 71 75 65 20 74 65  te the unique te
9460: 73 74 20 63 61 73 65 73 20 69 66 20 74 68 65 20  st cases if the 
9470: 2d 2d 75 6e 69 71 75 65 2d 63 61 73 65 73 20 66  --unique-cases f
9480: 6c 61 67 20 77 61 73 20 75 73 65 64 0a 20 20 2a  lag was used.  *
9490: 2f 0a 20 20 69 66 28 20 7a 44 61 74 61 4f 75 74  /.  if( zDataOut
94a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
94b0: 30 3b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74  0;.    FILE *out
94c0: 20 3d 20 66 6f 70 65 6e 28 7a 44 61 74 61 4f 75   = fopen(zDataOu
94d0: 74 2c 20 22 77 62 22 29 3b 0a 20 20 20 20 69 66  t, "wb");.    if
94e0: 28 20 6f 75 74 3d 3d 30 20 29 20 61 62 65 6e 64  ( out==0 ) abend
94f0: 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70  Error("cannot op
9500: 65 6e 20 25 73 20 66 6f 72 20 77 72 69 74 69 6e  en %s for writin
9510: 67 22 2c 20 7a 44 61 74 61 4f 75 74 29 3b 0a 20  g", zDataOut);. 
9520: 20 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 30     if( nHeader>0
9530: 20 29 20 66 77 72 69 74 65 28 7a 49 6e 2c 20 6e   ) fwrite(zIn, n
9540: 48 65 61 64 65 72 2c 20 31 2c 20 6f 75 74 29 3b  Header, 1, out);
9550: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
9560: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
9570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
9580: 72 65 70 61 72 65 5f 76 32 28 64 61 74 61 44 62  repare_v2(dataDb
9590: 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 2c 20 74  , "SELECT sql, t
95a0: 6d 20 46 52 4f 4d 20 74 65 73 74 63 61 73 65 20  m FROM testcase 
95b0: 4f 52 44 45 52 20 42 59 20 74 6d 2c 20 73 71 6c  ORDER BY tm, sql
95c0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
95e0: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
95f0: 20 20 20 69 66 28 20 72 63 20 29 20 61 62 65 6e     if( rc ) aben
9600: 64 45 72 72 6f 72 28 22 25 73 22 2c 20 73 71 6c  dError("%s", sql
9610: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 61 74 61  ite3_errmsg(data
9620: 44 62 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  Db));.    while(
9630: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
9640: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
9650: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
9660: 66 28 6f 75 74 2c 22 2f 2a 2a 2a 2a 3c 25 64 3a  f(out,"/****<%d:
9670: 25 64 6d 73 3e 2a 2a 2a 2a 2f 22 2c 20 2b 2b 6e  %dms>****/", ++n
9680: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
9690: 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 29 3b 0a  _int(pStmt,1));.
96a0: 20 20 20 20 20 20 66 77 72 69 74 65 28 73 71 6c        fwrite(sql
96b0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
96c0: 28 70 53 74 6d 74 2c 30 29 2c 73 71 6c 69 74 65  (pStmt,0),sqlite
96d0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
96e0: 53 74 6d 74 2c 30 29 2c 31 2c 6f 75 74 29 3b 0a  Stmt,0),1,out);.
96f0: 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65      }.    fclose
9700: 28 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (out);.    sqlit
9710: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
9720: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
9730: 63 6c 6f 73 65 28 64 61 74 61 44 62 29 3b 0a 20  close(dataDb);. 
9740: 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
9750: 70 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f  p and exit..  */
9760: 0a 20 20 66 72 65 65 28 61 7a 49 6e 46 69 6c 65  .  free(azInFile
9770: 29 3b 0a 20 20 66 72 65 65 28 7a 49 6e 29 3b 0a  );.  free(zIn);.
9780: 20 20 66 72 65 65 28 70 48 65 61 70 29 3b 0a 20    free(pHeap);. 
9790: 20 66 72 65 65 28 70 4c 6f 6f 6b 29 3b 0a 20 20   free(pLook);.  
97a0: 66 72 65 65 28 70 53 63 72 61 74 63 68 29 3b 0a  free(pScratch);.
97b0: 20 20 66 72 65 65 28 70 50 43 61 63 68 65 29 3b    free(pPCache);
97c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a     .  return 0;.}.