/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact dbf6c26eef936ec78cb0707570de3a4308b2507e:


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