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

Artifact f2e8102f7829f7b946ebdb6f1a16c6f942d9de66:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 35 2d 32 35  /*.** 2015-05-25
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 72 65 67 72 65 73 73 69  running regressi
01b0: 6f 6e 73 20 74 65 73 74 73 20 6f 6e 0a 2a 2a 20  ons tests on.** 
01c0: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
01d0: 72 79 20 75 73 69 6e 67 20 64 61 74 61 20 66 72  ry using data fr
01e0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 66  om an external f
01f0: 75 7a 7a 65 72 2c 20 73 75 63 68 20 61 73 20 41  uzzer, such as A
0200: 6d 65 72 69 63 61 6e 0a 2a 2a 20 46 75 7a 7a 79  merican.** Fuzzy
0210: 20 4c 6f 70 20 28 41 46 4c 29 20 28 68 74 74 70   Lop (AFL) (http
0220: 3a 2f 2f 6c 63 61 6d 74 75 66 2e 63 6f 72 65 64  ://lcamtuf.cored
0230: 75 6d 70 2e 63 78 2f 61 66 6c 2f 29 2e 0a 2a 2a  ump.cx/afl/)..**
0240: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0250: 20 72 65 61 64 73 20 63 6f 6e 74 65 6e 74 20 66   reads content f
0260: 72 6f 6d 20 61 6e 20 53 51 4c 69 74 65 20 64 61  rom an SQLite da
0270: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
0280: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0290: 2a 20 73 63 68 65 6d 61 3a 0a 2a 2a 0a 2a 2a 20  * schema:.**.** 
02a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
02b0: 20 64 62 28 0a 2a 2a 20 20 20 20 20 20 20 64 62   db(.**       db
02c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
02d0: 52 59 20 4b 45 59 2c 20 2d 2d 20 64 61 74 61 62  RY KEY, -- datab
02e0: 61 73 65 20 69 64 0a 2a 2a 20 20 20 20 20 20 20  ase id.**       
02f0: 64 62 63 6f 6e 74 65 6e 74 20 42 4c 4f 42 20 20  dbcontent BLOB  
0300: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 64 61 74            -- dat
0310: 61 62 61 73 65 20 64 69 73 6b 20 66 69 6c 65 20  abase disk file 
0320: 69 6d 61 67 65 0a 2a 2a 20 20 20 20 20 29 3b 0a  image.**     );.
0330: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
0340: 42 4c 45 20 78 73 71 6c 28 0a 2a 2a 20 20 20 20  BLE xsql(.**    
0350: 20 20 20 73 71 6c 69 64 20 49 4e 54 45 47 45 52     sqlid INTEGER
0360: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 20   PRIMARY KEY,   
0370: 2d 2d 20 53 51 4c 20 73 63 72 69 70 74 20 69 64  -- SQL script id
0380: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 74 65 78  .**       sqltex
0390: 74 20 54 45 58 54 20 20 20 20 20 20 20 20 20 20  t TEXT          
03a0: 20 20 20 20 20 20 20 2d 2d 20 54 65 78 74 20 6f         -- Text o
03b0: 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  f SQL statements
03c0: 20 74 6f 20 72 75 6e 0a 2a 2a 20 20 20 20 20 29   to run.**     )
03d0: 3b 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  ;.**     CREATE 
03e0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
03f0: 53 54 53 20 72 65 61 64 6d 65 28 0a 2a 2a 20 20  STS readme(.**  
0400: 20 20 20 20 20 6d 73 67 20 54 45 58 54 20 2d 2d       msg TEXT --
0410: 20 48 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   Human-readable 
0420: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
0430: 68 69 73 20 74 65 73 74 20 63 6f 6c 6c 65 63 74  his test collect
0440: 69 6f 6e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a  ion.**     );.**
0450: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 64 61 74  .** For each dat
0460: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
0470: 65 20 44 42 20 74 61 62 6c 65 2c 20 74 68 65 20  e DB table, the 
0480: 53 51 4c 20 74 65 78 74 20 69 6e 20 74 68 65 20  SQL text in the 
0490: 58 53 51 4c 20 74 61 62 6c 65 0a 2a 2a 20 69 73  XSQL table.** is
04a0: 20 72 75 6e 20 61 67 61 69 6e 73 74 20 74 68 61   run against tha
04b0: 74 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c  t database.  All
04c0: 20 52 45 41 44 4d 45 2e 4d 53 47 20 76 61 6c 75   README.MSG valu
04d0: 65 73 20 61 72 65 20 70 72 69 6e 74 65 64 20 70  es are printed p
04e0: 72 69 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  rior.** to the s
04f0: 74 61 72 74 20 6f 66 20 74 68 65 20 74 65 73 74  tart of the test
0500: 20 28 75 6e 6c 65 73 73 20 74 68 65 20 2d 2d 71   (unless the --q
0510: 75 69 65 74 20 6f 70 74 69 6f 6e 20 69 73 20 75  uiet option is u
0520: 73 65 64 29 2e 20 20 49 66 20 74 68 65 0a 2a 2a  sed).  If the.**
0530: 20 44 42 20 74 61 62 6c 65 20 69 73 20 65 6d 70   DB table is emp
0540: 74 79 2c 20 74 68 65 6e 20 61 6c 6c 20 65 6e 74  ty, then all ent
0550: 72 69 65 73 20 69 6e 20 58 53 51 4c 20 61 72 65  ries in XSQL are
0560: 20 72 75 6e 20 61 67 61 69 6e 73 74 20 61 6e 20   run against an 
0570: 65 6d 70 74 79 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  empty.** in-memo
0580: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
0590: 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20  ** This program 
05a0: 69 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63  is looking for c
05b0: 72 61 73 68 65 73 2c 20 61 73 73 65 72 74 69 6f  rashes, assertio
05c0: 6e 20 66 61 75 6c 74 73 2c 20 61 6e 64 2f 6f 72  n faults, and/or
05d0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 2e 0a 2a   memory leaks..*
05e0: 2a 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  * No attempt is 
05f0: 6d 61 64 65 20 74 6f 20 76 65 72 69 66 79 20 74  made to verify t
0600: 68 65 20 6f 75 74 70 75 74 2e 20 20 54 68 65 20  he output.  The 
0610: 61 73 73 75 6d 70 74 69 6f 6e 20 69 73 20 74 68  assumption is th
0620: 61 74 20 65 69 74 68 65 72 20 61 6c 6c 0a 2a 2a  at either all.**
0630: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
0640: 20 66 69 6c 65 73 20 6f 72 20 61 6c 6c 20 6f 66   files or all of
0650: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0660: 6e 74 73 20 61 72 65 20 6d 61 6c 66 6f 72 6d 65  nts are malforme
0670: 64 20 69 6e 70 75 74 73 2c 0a 2a 2a 20 67 65 6e  d inputs,.** gen
0680: 65 72 61 74 65 64 20 62 79 20 61 20 66 75 7a 7a  erated by a fuzz
0690: 65 72 2c 20 74 68 61 74 20 6e 65 65 64 20 74 6f  er, that need to
06a0: 20 62 65 20 63 68 65 63 6b 65 64 20 74 6f 20 6d   be checked to m
06b0: 61 6b 65 20 73 75 72 65 20 74 68 65 79 20 64 6f  ake sure they do
06c0: 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20   not.** present 
06d0: 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 2e  a security risk.
06e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67  .**.** This prog
06f0: 72 61 6d 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65  ram also include
0700: 73 20 73 6f 6d 65 20 63 6f 6d 6d 61 6e 64 2d 6c  s some command-l
0710: 69 6e 65 20 6f 70 74 69 6f 6e 73 20 74 6f 20 68  ine options to h
0720: 65 6c 70 20 77 69 74 68 20 0a 2a 2a 20 63 72 65  elp with .** cre
0730: 61 74 69 6f 6e 20 61 6e 64 20 6d 61 69 6e 74 65  ation and mainte
0740: 6e 61 6e 63 65 20 6f 66 20 74 68 65 20 73 6f 75  nance of the sou
0750: 72 63 65 20 63 6f 6e 74 65 6e 74 20 64 61 74 61  rce content data
0760: 62 61 73 65 2e 20 20 54 68 65 20 63 6f 6d 6d 61  base.  The comma
0770: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2f 66  nd.**.**     ./f
0780: 75 7a 7a 63 68 65 63 6b 20 64 61 74 61 62 61 73  uzzcheck databas
0790: 65 2e 64 62 20 2d 2d 6c 6f 61 64 2d 73 71 6c 20  e.db --load-sql 
07a0: 46 49 4c 45 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  FILE....**.** Lo
07b0: 61 64 73 20 61 6c 6c 20 46 49 4c 45 2e 2e 2e 20  ads all FILE... 
07c0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 74 6f 20 74  arguments into t
07d0: 68 65 20 58 53 51 4c 20 74 61 62 6c 65 2e 20 20  he XSQL table.  
07e0: 54 68 65 20 2d 2d 6c 6f 61 64 2d 64 62 20 6f 70  The --load-db op
07f0: 74 69 6f 6e 0a 2a 2a 20 77 6f 72 6b 73 20 74 68  tion.** works th
0800: 65 20 73 61 6d 65 20 62 75 74 20 6c 6f 61 64 73  e same but loads
0810: 20 74 68 65 20 66 69 6c 65 73 20 69 6e 74 6f 20   the files into 
0820: 74 68 65 20 44 42 20 74 61 62 6c 65 2e 20 20 54  the DB table.  T
0830: 68 65 20 2d 6d 20 6f 70 74 69 6f 6e 20 63 61 6e  he -m option can
0840: 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 69  .** be used to i
0850: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 52 45  nitialize the RE
0860: 41 44 4d 45 20 74 61 62 6c 65 2e 20 20 54 68 65  ADME table.  The
0870: 20 22 64 61 74 61 62 61 73 65 2e 64 62 22 20 66   "database.db" f
0880: 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
0890: 2a 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  * if it does not
08a0: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73   previously exis
08b0: 74 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  t.  Example:.**.
08c0: 2a 2a 20 20 20 20 20 2e 2f 66 75 7a 7a 63 68 65  **     ./fuzzche
08d0: 63 6b 20 6e 65 77 2e 64 62 20 2d 2d 6c 6f 61 64  ck new.db --load
08e0: 2d 73 71 6c 20 2a 2e 73 71 6c 0a 2a 2a 20 20 20  -sql *.sql.**   
08f0: 20 20 2e 2f 66 75 7a 7a 63 68 65 63 6b 20 6e 65    ./fuzzcheck ne
0900: 77 2e 64 62 20 2d 2d 6c 6f 61 64 2d 64 62 20 2a  w.db --load-db *
0910: 2e 64 62 0a 2a 2a 20 20 20 20 20 2e 2f 66 75 7a  .db.**     ./fuz
0920: 7a 63 68 65 63 6b 20 6e 65 77 2e 64 62 20 2d 6d  zcheck new.db -m
0930: 20 27 4e 65 77 20 74 65 73 74 20 63 61 73 65 73   'New test cases
0940: 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  '.**.** The thre
0950: 65 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65  e commands above
0960: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 74 68 65   will create the
0970: 20 22 6e 65 77 2e 64 62 22 20 66 69 6c 65 20 61   "new.db" file a
0980: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c  nd initialize al
0990: 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 20 54 68  l.** tables.  Th
09a0: 65 6e 20 64 6f 20 22 2e 2f 66 75 7a 7a 63 68 65  en do "./fuzzche
09b0: 63 6b 20 6e 65 77 2e 64 62 22 20 74 6f 20 72 75  ck new.db" to ru
09c0: 6e 20 74 68 65 20 74 65 73 74 73 2e 0a 2a 2a 0a  n the tests..**.
09d0: 2a 2a 20 44 45 42 55 47 47 49 4e 47 20 48 49 4e  ** DEBUGGING HIN
09e0: 54 53 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 66 75 7a  TS:.**.** If fuz
09f0: 7a 63 68 65 63 6b 20 64 6f 65 73 20 63 72 61 73  zcheck does cras
0a00: 68 2c 20 69 74 20 63 61 6e 20 62 65 20 72 75 6e  h, it can be run
0a10: 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72   in the debugger
0a20: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0a30: 0a 2a 2a 20 6f 66 20 74 68 65 20 67 6c 6f 62 61  .** of the globa
0a40: 6c 20 76 61 72 69 61 62 6c 65 20 67 2e 7a 54 65  l variable g.zTe
0a50: 78 74 4e 61 6d 65 5b 5d 20 77 69 6c 6c 20 69 64  xtName[] will id
0a60: 65 6e 74 69 66 79 20 74 68 65 20 73 70 65 63 69  entify the speci
0a70: 66 69 63 20 58 53 51 4c 20 61 6e 64 0a 2a 2a 20  fic XSQL and.** 
0a80: 44 42 20 76 61 6c 75 65 73 20 74 68 61 74 20 77  DB values that w
0a90: 65 72 65 20 72 75 6e 6e 69 6e 67 20 77 68 65 6e  ere running when
0aa0: 20 74 68 65 20 63 72 61 73 68 20 6f 63 63 75 72   the crash occur
0ab0: 72 65 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  red..*/.#include
0ac0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0ad0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0ae0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0af0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0b00: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
0b10: 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75  <ctype.h>.#inclu
0b20: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23  de "sqlite3.h".#
0b30: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0b40: 68 3e 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41  h>.#define ISSPA
0b50: 43 45 28 58 29 20 69 73 73 70 61 63 65 28 28 75  CE(X) isspace((u
0b60: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 58 29  nsigned char)(X)
0b70: 29 0a 23 64 65 66 69 6e 65 20 49 53 44 49 47 49  ).#define ISDIGI
0b80: 54 28 58 29 20 69 73 64 69 67 69 74 28 28 75 6e  T(X) isdigit((un
0b90: 73 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29  signed char)(X))
0ba0: 0a 0a 0a 23 69 66 64 65 66 20 5f 5f 75 6e 69 78  ...#ifdef __unix
0bb0: 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 69  __.# include <si
0bc0: 67 6e 61 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  gnal.h>.# includ
0bd0: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e  e <unistd.h>.#en
0be0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 73  dif../*.** Files
0bf0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
0c00: 66 69 6c 65 20 73 79 73 74 65 6d 2e 0a 2a 2f 0a  file system..*/.
0c10: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56  typedef struct V
0c20: 46 69 6c 65 20 56 46 69 6c 65 3b 0a 73 74 72 75  File VFile;.stru
0c30: 63 74 20 56 46 69 6c 65 20 7b 0a 20 20 63 68 61  ct VFile {.  cha
0c40: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
0c50: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
0c60: 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 64 65 6c 65  .  NULL for dele
0c70: 74 65 2d 6f 6e 2d 63 6c 6f 73 65 2e 20 46 72 6f  te-on-close. Fro
0c80: 6d 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  m malloc() */.  
0c90: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
0ca0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
0cb0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 20 62  of the file in b
0cc0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ytes */.  int nR
0cd0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
0ce0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
0cf0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
0d00: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  s file */.  unsi
0d10: 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 20 20 20  gned char *a;   
0d20: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
0d30: 66 20 74 68 65 20 66 69 6c 65 2e 20 20 46 72 6f  f the file.  Fro
0d40: 6d 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b  m malloc() */.};
0d50: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0d60: 56 48 61 6e 64 6c 65 20 56 48 61 6e 64 6c 65 3b  VHandle VHandle;
0d70: 0a 73 74 72 75 63 74 20 56 48 61 6e 64 6c 65 20  .struct VHandle 
0d80: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
0d90: 20 62 61 73 65 3b 20 20 20 20 20 20 2f 2a 20 42   base;      /* B
0da0: 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74  ase class.  Must
0db0: 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 56   be first */.  V
0dc0: 46 69 6c 65 20 2a 70 56 46 69 6c 65 3b 20 20 20  File *pVFile;   
0dd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
0de0: 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 2a 2f  derlying file */
0df0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76  .};../*.** The v
0e00: 61 6c 75 65 20 6f 66 20 61 20 64 61 74 61 62 61  alue of a databa
0e10: 73 65 20 66 69 6c 65 20 74 65 6d 70 6c 61 74 65  se file template
0e20: 2c 20 6f 72 20 6f 66 20 61 6e 20 53 51 4c 20 73  , or of an SQL s
0e30: 63 72 69 70 74 0a 2a 2f 0a 74 79 70 65 64 65 66  cript.*/.typedef
0e40: 20 73 74 72 75 63 74 20 42 6c 6f 62 20 42 6c 6f   struct Blob Blo
0e50: 62 3b 0a 73 74 72 75 63 74 20 42 6c 6f 62 20 7b  b;.struct Blob {
0e60: 0a 20 20 42 6c 6f 62 20 2a 70 4e 65 78 74 3b 20  .  Blob *pNext; 
0e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
0e80: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  xt in a list */.
0e90: 20 20 69 6e 74 20 69 64 3b 20 20 20 20 20 20 20    int id;       
0ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
0eb0: 6f 66 20 74 68 69 73 20 42 6c 6f 62 20 2a 2f 0a  of this Blob */.
0ec0: 20 20 69 6e 74 20 73 65 71 3b 20 20 20 20 20 20    int seq;      
0ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71            /* Seq
0ee0: 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  uence number */.
0ef0: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
0f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
0f10: 65 20 6f 66 20 74 68 69 73 20 42 6c 6f 62 20 69  e of this Blob i
0f20: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  n bytes */.  uns
0f30: 69 67 6e 65 64 20 63 68 61 72 20 61 5b 31 5d 3b  igned char a[1];
0f40: 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20 63 6f 6e       /* Blob con
0f50: 74 65 6e 74 2e 20 20 45 78 74 72 61 20 73 70 61  tent.  Extra spa
0f60: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  ce allocated as 
0f70: 6e 65 65 64 65 64 2e 20 2a 2f 0a 7d 3b 0a 0a 2f  needed. */.};../
0f80: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  *.** Maximum num
0f90: 62 65 72 20 6f 66 20 66 69 6c 65 73 20 69 6e 20  ber of files in 
0fa0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 76 69  the in-memory vi
0fb0: 72 74 75 61 6c 20 66 69 6c 65 73 79 73 74 65 6d  rtual filesystem
0fc0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
0fd0: 46 49 4c 45 20 20 31 30 0a 0a 2f 2a 0a 2a 2a 20  FILE  10../*.** 
0fe0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
0ff0: 66 69 6c 65 20 73 69 7a 65 0a 2a 2f 0a 23 64 65  file size.*/.#de
1000: 66 69 6e 65 20 4d 58 5f 46 49 4c 45 5f 53 5a 20  fine MX_FILE_SZ 
1010: 31 30 30 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20  10000000../*.** 
1020: 41 6c 6c 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  All global varia
1030: 62 6c 65 73 20 61 72 65 20 67 61 74 68 65 72 65  bles are gathere
1040: 64 20 69 6e 74 6f 20 74 68 65 20 22 67 22 20 73  d into the "g" s
1050: 69 6e 67 6c 65 74 6f 6e 2e 0a 2a 2f 0a 73 74 61  ingleton..*/.sta
1060: 74 69 63 20 73 74 72 75 63 74 20 47 6c 6f 62 61  tic struct Globa
1070: 6c 56 61 72 73 20 7b 0a 20 20 63 6f 6e 73 74 20  lVars {.  const 
1080: 63 68 61 72 20 2a 7a 41 72 67 76 30 3b 20 20 20  char *zArgv0;   
1090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
10a0: 6d 65 20 6f 66 20 70 72 6f 67 72 61 6d 20 2a 2f  me of program */
10b0: 0a 20 20 56 46 69 6c 65 20 61 46 69 6c 65 5b 4d  .  VFile aFile[M
10c0: 58 5f 46 49 4c 45 5d 3b 20 20 20 20 20 20 20 20  X_FILE];        
10d0: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
10e0: 61 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f  al filesystem */
10f0: 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20  .  int nDb;     
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1120: 20 74 65 6d 70 6c 61 74 65 20 64 61 74 61 62 61   template databa
1130: 73 65 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70  ses */.  Blob *p
1140: 46 69 72 73 74 44 62 3b 20 20 20 20 20 20 20 20  FirstDb;        
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1160: 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 74 65  tent of first te
1170: 6d 70 6c 61 74 65 20 64 61 74 61 62 61 73 65 20  mplate database 
1180: 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20  */.  int nSql;  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11b0: 6f 66 20 53 51 4c 20 73 63 72 69 70 74 73 20 2a  of SQL scripts *
11c0: 2f 0a 20 20 42 6c 6f 62 20 2a 70 46 69 72 73 74  /.  Blob *pFirst
11d0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
11e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 53 51       /* First SQ
11f0: 4c 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 63 68  L script */.  ch
1200: 61 72 20 7a 54 65 73 74 4e 61 6d 65 5b 31 30 30  ar zTestName[100
1210: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
1220: 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e  * Name of curren
1230: 74 20 74 65 73 74 20 2a 2f 0a 7d 20 67 3b 0a 0a  t test */.} g;..
1240: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65  /*.** Print an e
1250: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
1260: 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   quit..*/.static
1270: 20 76 6f 69 64 20 66 61 74 61 6c 45 72 72 6f 72   void fatalError
1280: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
1290: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
12a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
12b0: 67 2e 7a 54 65 73 74 4e 61 6d 65 5b 30 5d 20 29  g.zTestName[0] )
12c0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
12d0: 64 65 72 72 2c 20 22 25 73 20 28 25 73 29 3a 20  derr, "%s (%s): 
12e0: 22 2c 20 67 2e 7a 41 72 67 76 30 2c 20 67 2e 7a  ", g.zArgv0, g.z
12f0: 54 65 73 74 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  TestName);.  }el
1300: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
1310: 73 74 64 65 72 72 2c 20 22 25 73 3a 20 22 2c 20  stderr, "%s: ", 
1320: 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 7d 0a 20  g.zArgv0);.  }. 
1330: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1340: 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e  ormat);.  vfprin
1350: 74 66 28 73 74 64 65 72 72 2c 20 7a 46 6f 72 6d  tf(stderr, zForm
1360: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1370: 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  d(ap);.  fprintf
1380: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a  (stderr, "\n");.
1390: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a    exit(1);.}../*
13a0: 0a 2a 2a 20 54 69 6d 65 6f 75 74 20 68 61 6e 64  .** Timeout hand
13b0: 6c 65 72 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ler.*/.#ifdef __
13c0: 75 6e 69 78 5f 5f 0a 73 74 61 74 69 63 20 76 6f  unix__.static vo
13d0: 69 64 20 74 69 6d 65 6f 75 74 48 61 6e 64 6c 65  id timeoutHandle
13e0: 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a  r(int NotUsed){.
13f0: 20 20 28 76 6f 69 64 29 4e 6f 74 55 73 65 64 3b    (void)NotUsed;
1400: 0a 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74  .  fatalError("t
1410: 69 6d 65 6f 75 74 5c 6e 22 29 3b 0a 7d 0a 23 65  imeout\n");.}.#e
1420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
1430: 74 68 65 20 61 6e 20 61 6c 61 72 6d 20 74 6f 20  the an alarm to 
1440: 67 6f 20 6f 66 66 20 61 66 74 65 72 20 4e 20 73  go off after N s
1450: 65 63 6f 6e 64 73 2e 20 20 44 69 73 61 62 6c 65  econds.  Disable
1460: 20 74 68 65 20 61 6c 61 72 6d 0a 2a 2a 20 69 66   the alarm.** if
1470: 20 4e 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20   N==0.*/.static 
1480: 76 6f 69 64 20 73 65 74 41 6c 61 72 6d 28 69 6e  void setAlarm(in
1490: 74 20 4e 29 7b 0a 23 69 66 64 65 66 20 5f 5f 75  t N){.#ifdef __u
14a0: 6e 69 78 5f 5f 0a 20 20 61 6c 61 72 6d 28 4e 29  nix__.  alarm(N)
14b0: 3b 0a 23 65 6c 73 65 0a 20 20 28 76 6f 69 64 29  ;.#else.  (void)
14c0: 4e 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  N;.#endif.}..#if
14d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14e0: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
14f0: 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 6e  CK./*.** This an
1500: 20 53 51 4c 20 70 72 6f 67 72 65 73 73 20 68 61   SQL progress ha
1510: 6e 64 6c 65 72 2e 20 20 41 66 74 65 72 20 61 6e  ndler.  After an
1520: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
1530: 61 73 20 72 75 6e 20 66 6f 72 0a 2a 2a 20 6d 61  as run for.** ma
1540: 6e 79 20 73 74 65 70 73 2c 20 77 65 20 77 61 6e  ny steps, we wan
1550: 74 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 69  t to interrupt i
1560: 74 2e 20 20 54 68 69 73 20 67 75 61 72 64 73 20  t.  This guards 
1570: 61 67 61 69 6e 73 74 20 69 6e 66 69 6e 69 74 65  against infinite
1580: 0a 2a 2a 20 6c 6f 6f 70 73 20 66 72 6f 6d 20 72  .** loops from r
1590: 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20  ecursive common 
15a0: 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
15b0: 73 2e 0a 2a 2a 0a 2a 2a 20 2a 70 56 64 62 65 4c  s..**.** *pVdbeL
15c0: 69 6d 69 74 46 6c 61 67 20 69 73 20 74 72 75 65  imitFlag is true
15d0: 20 69 66 20 74 68 65 20 2d 2d 6c 69 6d 69 74 2d   if the --limit-
15e0: 76 64 62 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  vdbe command-lin
15f0: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
1600: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73  ..** In that cas
1610: 65 2c 20 68 69 74 74 69 6e 67 20 74 68 65 20 70  e, hitting the p
1620: 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20  rogress handler 
1630: 69 73 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72  is a fatal error
1640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1650: 70 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  progressHandler(
1660: 76 6f 69 64 20 2a 70 56 64 62 65 4c 69 6d 69 74  void *pVdbeLimit
1670: 46 6c 61 67 29 7b 0a 20 20 69 66 28 20 2a 28 69  Flag){.  if( *(i
1680: 6e 74 2a 29 70 56 64 62 65 4c 69 6d 69 74 46 6c  nt*)pVdbeLimitFl
1690: 61 67 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  ag ) fatalError(
16a0: 22 74 6f 6f 20 6d 61 6e 79 20 56 44 42 45 20 63  "too many VDBE c
16b0: 79 63 6c 65 73 22 29 3b 0a 20 20 72 65 74 75 72  ycles");.  retur
16c0: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
16d0: 2a 0a 2a 2a 20 52 65 61 6c 6c 6f 63 61 74 65 20  *.** Reallocate 
16e0: 6d 65 6d 6f 72 79 2e 20 20 53 68 6f 77 20 61 6e  memory.  Show an
16f0: 64 20 65 72 72 6f 72 20 61 6e 64 20 71 75 69 74  d error and quit
1700: 20 69 66 20 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73   if unable..*/.s
1710: 74 61 74 69 63 20 76 6f 69 64 20 2a 73 61 66 65  tatic void *safe
1720: 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  _realloc(void *p
1730: 4f 6c 64 2c 20 69 6e 74 20 73 7a 4e 65 77 29 7b  Old, int szNew){
1740: 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20  .  void *pNew = 
1750: 72 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 73 7a  realloc(pOld, sz
1760: 4e 65 77 3c 3d 30 20 3f 20 31 20 3a 20 73 7a 4e  New<=0 ? 1 : szN
1770: 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ew);.  if( pNew=
1780: 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  =0 ) fatalError(
1790: 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 6c 6c  "unable to reall
17a0: 6f 63 20 66 6f 72 20 25 64 20 62 79 74 65 73 22  oc for %d bytes"
17b0: 2c 20 73 7a 4e 65 77 29 3b 0a 20 20 72 65 74 75  , szNew);.  retu
17c0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
17d0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
17e0: 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
17f0: 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  stem..*/.static 
1800: 76 6f 69 64 20 66 6f 72 6d 61 74 56 66 73 28 76  void formatVfs(v
1810: 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
1820: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 46   for(i=0; i<MX_F
1830: 49 4c 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 67  ILE; i++){.    g
1840: 2e 61 46 69 6c 65 5b 69 5d 2e 73 7a 20 3d 20 2d  .aFile[i].sz = -
1850: 31 3b 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69  1;.    g.aFile[i
1860: 5d 2e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  ].zFilename = 0;
1870: 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e  .    g.aFile[i].
1880: 61 20 3d 20 30 3b 0a 20 20 20 20 67 2e 61 46 69  a = 0;.    g.aFi
1890: 6c 65 5b 69 5d 2e 6e 52 65 66 20 3d 20 30 3b 0a  le[i].nRef = 0;.
18a0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 72    }.}.../*.** Er
18b0: 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
18c0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72 74 75  ion in the virtu
18d0: 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 0a  al file system..
18e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
18f0: 65 66 6f 72 6d 61 74 56 66 73 28 76 6f 69 64 29  eformatVfs(void)
1900: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1910: 28 69 3d 30 3b 20 69 3c 4d 58 5f 46 49 4c 45 3b  (i=0; i<MX_FILE;
1920: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 67   i++){.    if( g
1930: 2e 61 46 69 6c 65 5b 69 5d 2e 73 7a 3c 30 20 29  .aFile[i].sz<0 )
1940: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1950: 66 28 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46  f( g.aFile[i].zF
1960: 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ilename ){.     
1970: 20 66 72 65 65 28 67 2e 61 46 69 6c 65 5b 69 5d   free(g.aFile[i]
1980: 2e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  .zFilename);.   
1990: 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46     g.aFile[i].zF
19a0: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
19b0: 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 61 46 69   }.    if( g.aFi
19c0: 6c 65 5b 69 5d 2e 6e 52 65 66 3e 30 20 29 7b 0a  le[i].nRef>0 ){.
19d0: 20 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72        fatalError
19e0: 28 22 66 69 6c 65 20 25 64 20 73 74 69 6c 6c 20  ("file %d still 
19f0: 6f 70 65 6e 2e 20 20 6e 52 65 66 3d 25 64 22 2c  open.  nRef=%d",
1a00: 20 69 2c 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 6e   i, g.aFile[i].n
1a10: 52 65 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Ref);.    }.    
1a20: 67 2e 61 46 69 6c 65 5b 69 5d 2e 73 7a 20 3d 20  g.aFile[i].sz = 
1a30: 2d 31 3b 0a 20 20 20 20 66 72 65 65 28 67 2e 61  -1;.    free(g.a
1a40: 46 69 6c 65 5b 69 5d 2e 61 29 3b 0a 20 20 20 20  File[i].a);.    
1a50: 67 2e 61 46 69 6c 65 5b 69 5d 2e 61 20 3d 20 30  g.aFile[i].a = 0
1a60: 3b 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d  ;.    g.aFile[i]
1a70: 2e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d  .nRef = 0;.  }.}
1a80: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 56  ../*.** Find a V
1a90: 46 69 6c 65 20 62 79 20 6e 61 6d 65 0a 2a 2f 0a  File by name.*/.
1aa0: 73 74 61 74 69 63 20 56 46 69 6c 65 20 2a 66 69  static VFile *fi
1ab0: 6e 64 56 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  ndVFile(const ch
1ac0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
1ad0: 74 20 69 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  t i;.  if( zName
1ae0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1af0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f    for(i=0; i<MX_
1b00: 46 49 4c 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  FILE; i++){.    
1b10: 69 66 28 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a  if( g.aFile[i].z
1b20: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 63 6f  Filename==0 ) co
1b30: 6e 74 69 6e 75 65 3b 20 20 20 0a 20 20 20 20 69  ntinue;   .    i
1b40: 66 28 20 73 74 72 63 6d 70 28 67 2e 61 46 69 6c  f( strcmp(g.aFil
1b50: 65 5b 69 5d 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20  e[i].zFilename, 
1b60: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75  zName)==0 ) retu
1b70: 72 6e 20 26 67 2e 61 46 69 6c 65 5b 69 5d 3b 0a  rn &g.aFile[i];.
1b80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
1ba0: 56 46 69 6c 65 20 62 79 20 6e 61 6d 65 2e 20 20  VFile by name.  
1bb0: 43 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  Create it if it 
1bc0: 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
1bd0: 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 69 6e   exist and.** in
1be0: 69 74 69 61 6c 69 7a 65 20 69 74 20 74 6f 20 74  itialize it to t
1bf0: 68 65 20 73 69 7a 65 20 61 6e 64 20 63 6f 6e 74  he size and cont
1c00: 65 6e 74 20 67 69 76 65 6e 2e 0a 2a 2a 0a 2a 2a  ent given..**.**
1c10: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 6f 6e 6c   Return NULL onl
1c20: 79 20 69 66 20 74 68 65 20 66 69 6c 65 73 79 73  y if the filesys
1c30: 74 65 6d 20 69 73 20 66 75 6c 6c 2e 0a 2a 2f 0a  tem is full..*/.
1c40: 73 74 61 74 69 63 20 56 46 69 6c 65 20 2a 63 72  static VFile *cr
1c50: 65 61 74 65 56 46 69 6c 65 28 63 6f 6e 73 74 20  eateVFile(const 
1c60: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1c70: 20 73 7a 2c 20 75 6e 73 69 67 6e 65 64 20 63 68   sz, unsigned ch
1c80: 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 56 46  ar *pData){.  VF
1c90: 69 6c 65 20 2a 70 4e 65 77 20 3d 20 66 69 6e 64  ile *pNew = find
1ca0: 56 46 69 6c 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  VFile(zName);.  
1cb0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4e 65  int i;.  if( pNe
1cc0: 77 20 29 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  w ) return pNew;
1cd0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58  .  for(i=0; i<MX
1ce0: 5f 46 49 4c 45 20 26 26 20 67 2e 61 46 69 6c 65  _FILE && g.aFile
1cf0: 5b 69 5d 2e 73 7a 3e 3d 30 3b 20 69 2b 2b 29 7b  [i].sz>=0; i++){
1d00: 7d 0a 20 20 69 66 28 20 69 3e 3d 4d 58 5f 46 49  }.  if( i>=MX_FI
1d10: 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  LE ) return 0;. 
1d20: 20 70 4e 65 77 20 3d 20 26 67 2e 61 46 69 6c 65   pNew = &g.aFile
1d30: 5b 69 5d 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  [i];.  if( zName
1d40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d   ){.    int nNam
1d50: 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
1d60: 7a 4e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 70 4e  zName)+1;.    pN
1d70: 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
1d80: 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28 30 2c 20  safe_realloc(0, 
1d90: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  nName);.    memc
1da0: 70 79 28 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  py(pNew->zFilena
1db0: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
1dc0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1dd0: 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  pNew->zFilename 
1de0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  = 0;.  }.  pNew-
1df0: 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 4e 65  >nRef = 0;.  pNe
1e00: 77 2d 3e 73 7a 20 3d 20 73 7a 3b 0a 20 20 70 4e  w->sz = sz;.  pN
1e10: 65 77 2d 3e 61 20 3d 20 73 61 66 65 5f 72 65 61  ew->a = safe_rea
1e20: 6c 6c 6f 63 28 30 2c 20 73 7a 29 3b 0a 20 20 69  lloc(0, sz);.  i
1e30: 66 28 20 73 7a 3e 30 20 29 20 6d 65 6d 63 70 79  f( sz>0 ) memcpy
1e40: 28 70 4e 65 77 2d 3e 61 2c 20 70 44 61 74 61 2c  (pNew->a, pData,
1e50: 20 73 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   sz);.  return p
1e60: 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  New;.}.../*.** I
1e70: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1e80: 20 74 68 65 20 22 72 65 61 64 66 69 6c 65 28 58   the "readfile(X
1e90: 29 22 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  )" SQL function.
1ea0: 20 20 54 68 65 20 65 6e 74 69 72 65 20 63 6f 6e    The entire con
1eb0: 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 66  tent.** of the f
1ec0: 69 6c 65 20 6e 61 6d 65 64 20 58 20 69 73 20 72  ile named X is r
1ed0: 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ead and returned
1ee0: 20 61 73 20 61 20 42 4c 4f 42 2e 20 20 4e 55 4c   as a BLOB.  NUL
1ef0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  L is returned.**
1f00: 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   if the file doe
1f10: 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69  s not exist or i
1f20: 73 20 75 6e 72 65 61 64 61 62 6c 65 2e 0a 2a 2f  s unreadable..*/
1f30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 61  .static void rea
1f40: 64 66 69 6c 65 46 75 6e 63 28 0a 20 20 73 71 6c  dfileFunc(.  sql
1f50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
1f60: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
1f70: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
1f80: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
1f90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1fa0: 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  ;.  FILE *in;.  
1fb0: 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 76 6f 69 64  long nIn;.  void
1fc0: 20 2a 70 42 75 66 3b 0a 0a 20 20 7a 4e 61 6d 65   *pBuf;..  zName
1fd0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
1fe0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
1ff0: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  xt(argv[0]);.  i
2000: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
2010: 74 75 72 6e 3b 0a 20 20 69 6e 20 3d 20 66 6f 70  turn;.  in = fop
2020: 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b  en(zName, "rb");
2030: 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
2040: 65 74 75 72 6e 3b 0a 20 20 66 73 65 65 6b 28 69  eturn;.  fseek(i
2050: 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b  n, 0, SEEK_END);
2060: 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69  .  nIn = ftell(i
2070: 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29  n);.  rewind(in)
2080: 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74  ;.  pBuf = sqlit
2090: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e  e3_malloc64( nIn
20a0: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20 26   );.  if( pBuf &
20b0: 26 20 31 3d 3d 66 72 65 61 64 28 70 42 75 66 2c  & 1==fread(pBuf,
20c0: 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 20 29 7b 0a   nIn, 1, in) ){.
20d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
20e0: 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74 2c  lt_blob(context,
20f0: 20 70 42 75 66 2c 20 6e 49 6e 2c 20 73 71 6c 69   pBuf, nIn, sqli
2100: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 65 6c  te3_free);.  }el
2110: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
2120: 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 7d 0a  free(pBuf);.  }.
2130: 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a    fclose(in);.}.
2140: 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2150: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 77 72  ation of the "wr
2160: 69 74 65 66 69 6c 65 28 58 2c 59 29 22 20 53 51  itefile(X,Y)" SQ
2170: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  L function.  The
2180: 20 61 72 67 75 6d 65 6e 74 20 59 0a 2a 2a 20 69   argument Y.** i
2190: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 66  s written into f
21a0: 69 6c 65 20 58 2e 20 20 54 68 65 20 6e 75 6d 62  ile X.  The numb
21b0: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
21c0: 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ten is returned.
21d0: 20 20 4f 72 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20    Or.** NULL is 
21e0: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
21f0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
2200: 2c 20 73 75 63 68 20 61 73 20 62 65 69 6e 67 20  , such as being 
2210: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 0a 2a  unable to open.*
2220: 2a 20 66 69 6c 65 20 58 20 66 6f 72 20 77 72 69  * file X for wri
2230: 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ting..*/.static 
2240: 76 6f 69 64 20 77 72 69 74 65 66 69 6c 65 46 75  void writefileFu
2250: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2260: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
2270: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
2280: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
2290: 67 76 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  gv.){.  FILE *ou
22a0: 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
22b0: 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  *z;.  sqlite3_in
22c0: 74 36 34 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  t64 rc;.  const 
22d0: 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 0a 20 20  char *zFile;..  
22e0: 28 76 6f 69 64 29 61 72 67 63 3b 0a 20 20 7a 46  (void)argc;.  zF
22f0: 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ile = (const cha
2300: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
2310: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
2320: 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
2330: 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d   return;.  out =
2340: 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77   fopen(zFile, "w
2350: 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  b");.  if( out==
2360: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20  0 ) return;.  z 
2370: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
2380: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f  qlite3_value_blo
2390: 62 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66  b(argv[1]);.  if
23a0: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ( z==0 ){.    rc
23b0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
23c0: 20 20 20 72 63 20 3d 20 66 77 72 69 74 65 28 7a     rc = fwrite(z
23d0: 2c 20 31 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  , 1, sqlite3_val
23e0: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31 5d  ue_bytes(argv[1]
23f0: 29 2c 20 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 66  ), out);.  }.  f
2400: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 73 71  close(out);.  sq
2410: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
2420: 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b  64(context, rc);
2430: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  .}.../*.** Load 
2440: 61 20 6c 69 73 74 20 6f 66 20 42 6c 6f 62 20 6f  a list of Blob o
2450: 62 6a 65 63 74 73 20 66 72 6f 6d 20 74 68 65 20  bjects from the 
2460: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74  database.*/.stat
2470: 69 63 20 76 6f 69 64 20 62 6c 6f 62 4c 69 73 74  ic void blobList
2480: 4c 6f 61 64 46 72 6f 6d 44 62 28 0a 20 20 73 71  LoadFromDb(.  sq
2490: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
24a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 66         /* Read f
24b0: 72 6f 6d 20 74 68 69 73 20 64 61 74 61 62 61 73  rom this databas
24c0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
24d0: 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20 20  r *zSql,        
24e0: 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f  /* Query used to
24f0: 20 65 78 74 72 61 63 74 20 74 68 65 20 62 6c 6f   extract the blo
2500: 62 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c 79  bs */.  int only
2510: 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Id,             
2520: 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 77 68   /* Only load wh
2530: 65 72 65 20 69 64 20 69 73 20 74 68 69 73 20 76  ere id is this v
2540: 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
2550: 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
2560: 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74 65     /* OUT: Write
2570: 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 62 73   number of blobs
2580: 20 6c 6f 61 64 65 64 20 68 65 72 65 20 2a 2f 0a   loaded here */.
2590: 20 20 42 6c 6f 62 20 2a 2a 70 70 4c 69 73 74 20    Blob **ppList 
25a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25b0: 54 3a 20 57 72 69 74 65 20 74 68 65 20 68 65 61  T: Write the hea
25c0: 64 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 6c 69  d of the blob li
25d0: 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
25e0: 42 6c 6f 62 20 68 65 61 64 3b 0a 20 20 42 6c 6f  Blob head;.  Blo
25f0: 62 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f  b *p;.  sqlite3_
2600: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
2610: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt n = 0;.  int 
2620: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 32 3b 0a  rc;.  char *z2;.
2630: 0a 20 20 69 66 28 20 6f 6e 6c 79 49 64 3e 30 20  .  if( onlyId>0 
2640: 29 7b 0a 20 20 20 20 7a 32 20 3d 20 73 71 6c 69  ){.    z2 = sqli
2650: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
2660: 57 48 45 52 45 20 72 6f 77 69 64 3d 25 64 22 2c  WHERE rowid=%d",
2670: 20 7a 53 71 6c 2c 20 6f 6e 6c 79 49 64 29 3b 0a   zSql, onlyId);.
2680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 32 20    }else{.    z2 
2690: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
26a0: 66 28 22 25 73 22 2c 20 7a 53 71 6c 29 3b 0a 20  f("%s", zSql);. 
26b0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
26c0: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
26d0: 20 7a 32 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c   z2, -1, &pStmt,
26e0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
26f0: 72 65 65 28 7a 32 29 3b 0a 20 20 69 66 28 20 72  ree(z2);.  if( r
2700: 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  c ) fatalError("
2710: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
2720: 6d 73 67 28 64 62 29 29 3b 0a 20 20 68 65 61 64  msg(db));.  head
2730: 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 20  .pNext = 0;.  p 
2740: 3d 20 26 68 65 61 64 3b 0a 20 20 77 68 69 6c 65  = &head;.  while
2750: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
2760: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2770: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  ) ){.    int sz 
2780: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2790: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29  _bytes(pStmt, 1)
27a0: 3b 0a 20 20 20 20 42 6c 6f 62 20 2a 70 4e 65 77  ;.    Blob *pNew
27b0: 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28   = safe_realloc(
27c0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  0, sizeof(*pNew)
27d0: 2b 73 7a 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d  +sz );.    pNew-
27e0: 3e 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  >id = sqlite3_co
27f0: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
2800: 30 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 7a  0);.    pNew->sz
2810: 20 3d 20 73 7a 3b 0a 20 20 20 20 70 4e 65 77 2d   = sz;.    pNew-
2820: 3e 73 65 71 20 3d 20 6e 2b 2b 3b 0a 20 20 20 20  >seq = n++;.    
2830: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b  pNew->pNext = 0;
2840: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65 77  .    memcpy(pNew
2850: 2d 3e 61 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ->a, sqlite3_col
2860: 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 31  umn_blob(pStmt,1
2870: 29 2c 20 73 7a 29 3b 0a 20 20 20 20 70 4e 65 77  ), sz);.    pNew
2880: 2d 3e 61 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20  ->a[sz] = 0;.   
2890: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77   p->pNext = pNew
28a0: 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65 77 3b 0a  ;.    p = pNew;.
28b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
28c0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
28d0: 20 2a 70 4e 20 3d 20 6e 3b 0a 20 20 2a 70 70 4c   *pN = n;.  *ppL
28e0: 69 73 74 20 3d 20 68 65 61 64 2e 70 4e 65 78 74  ist = head.pNext
28f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
2900: 61 20 6c 69 73 74 20 6f 66 20 42 6c 6f 62 20 6f  a list of Blob o
2910: 62 6a 65 63 74 73 0a 2a 2f 0a 73 74 61 74 69 63  bjects.*/.static
2920: 20 76 6f 69 64 20 62 6c 6f 62 4c 69 73 74 46 72   void blobListFr
2930: 65 65 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 20 42  ee(Blob *p){.  B
2940: 6c 6f 62 20 2a 70 4e 65 78 74 3b 0a 20 20 77 68  lob *pNext;.  wh
2950: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70 4e  ile( p ){.    pN
2960: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
2970: 20 20 20 20 66 72 65 65 28 70 29 3b 0a 20 20 20      free(p);.   
2980: 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a   p = pNext;.  }.
2990: 7d 0a 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  }.../* Return th
29a0: 65 20 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63  e current wall-c
29b0: 6c 6f 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61  lock time */.sta
29c0: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
29d0: 34 20 74 69 6d 65 4f 66 44 61 79 28 76 6f 69 64  4 timeOfDay(void
29e0: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
29f0: 74 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66  te3_vfs *clockVf
2a00: 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  s = 0;.  sqlite3
2a10: 5f 69 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20  _int64 t;.  if( 
2a20: 63 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c  clockVfs==0 ) cl
2a30: 6f 63 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33  ockVfs = sqlite3
2a40: 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
2a50: 69 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56  if( clockVfs->iV
2a60: 65 72 73 69 6f 6e 3e 3d 31 20 26 26 20 63 6c 6f  ersion>=1 && clo
2a70: 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54  ckVfs->xCurrentT
2a80: 69 6d 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20  imeInt64!=0 ){. 
2a90: 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75     clockVfs->xCu
2aa0: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 63  rrentTimeInt64(c
2ab0: 6c 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20  lockVfs, &t);.  
2ac0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c  }else{.    doubl
2ad0: 65 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66  e r;.    clockVf
2ae0: 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28  s->xCurrentTime(
2af0: 63 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20  clockVfs, &r);. 
2b00: 20 20 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f     t = (sqlite3_
2b10: 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30 30  int64)(r*8640000
2b20: 30 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  0.0);.  }.  retu
2b30: 72 6e 20 74 3b 0a 7d 0a 0a 2f 2a 20 4d 65 74 68  rn t;.}../* Meth
2b40: 6f 64 73 20 66 6f 72 20 74 68 65 20 56 48 61 6e  ods for the VHan
2b50: 64 6c 65 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  dle object.*/.st
2b60: 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 43 6c  atic int inmemCl
2b70: 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
2b80: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 56 48 61 6e   *pFile){.  VHan
2b90: 64 6c 65 20 2a 70 20 3d 20 28 56 48 61 6e 64 6c  dle *p = (VHandl
2ba0: 65 2a 29 70 46 69 6c 65 3b 0a 20 20 56 46 69 6c  e*)pFile;.  VFil
2bb0: 65 20 2a 70 56 46 69 6c 65 20 3d 20 70 2d 3e 70  e *pVFile = p->p
2bc0: 56 46 69 6c 65 3b 0a 20 20 70 56 46 69 6c 65 2d  VFile;.  pVFile-
2bd0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
2be0: 56 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 26  VFile->nRef==0 &
2bf0: 26 20 70 56 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e  & pVFile->zFilen
2c00: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 56  ame==0 ){.    pV
2c10: 46 69 6c 65 2d 3e 73 7a 20 3d 20 2d 31 3b 0a 20  File->sz = -1;. 
2c20: 20 20 20 66 72 65 65 28 70 56 46 69 6c 65 2d 3e     free(pVFile->
2c30: 61 29 3b 0a 20 20 20 20 70 56 46 69 6c 65 2d 3e  a);.    pVFile->
2c40: 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 0;.  }.  ret
2c50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c60: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65  .static int inme
2c70: 6d 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  mRead(.  sqlite3
2c80: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
2c90: 2f 2a 20 52 65 61 64 20 66 72 6f 6d 20 74 68 69  /* Read from thi
2ca0: 73 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  s open file */. 
2cb0: 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
2cc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
2cd0: 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 69 73   content in this
2ce0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
2cf0: 20 69 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20   iAmt,          
2d00: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
2d10: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  content */.  sql
2d20: 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74  ite3_int64 iOfst
2d30: 20 20 20 20 2f 2a 20 53 74 61 72 74 20 72 65 61      /* Start rea
2d40: 64 69 6e 67 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ding here */.){.
2d50: 20 20 56 48 61 6e 64 6c 65 20 2a 70 48 61 6e 64    VHandle *pHand
2d60: 6c 65 20 3d 20 28 56 48 61 6e 64 6c 65 2a 29 70  le = (VHandle*)p
2d70: 46 69 6c 65 3b 0a 20 20 56 46 69 6c 65 20 2a 70  File;.  VFile *p
2d80: 56 46 69 6c 65 20 3d 20 70 48 61 6e 64 6c 65 2d  VFile = pHandle-
2d90: 3e 70 56 46 69 6c 65 3b 0a 20 20 69 66 28 20 69  >pVFile;.  if( i
2da0: 4f 66 73 74 3c 30 20 7c 7c 20 69 4f 66 73 74 3e  Ofst<0 || iOfst>
2db0: 3d 70 56 46 69 6c 65 2d 3e 73 7a 20 29 7b 0a 20  =pVFile->sz ){. 
2dc0: 20 20 20 6d 65 6d 73 65 74 28 70 44 61 74 61 2c     memset(pData,
2dd0: 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 72   0, iAmt);.    r
2de0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2df0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
2e00: 20 7d 0a 20 20 69 66 28 20 69 4f 66 73 74 2b 69   }.  if( iOfst+i
2e10: 41 6d 74 3e 70 56 46 69 6c 65 2d 3e 73 7a 20 29  Amt>pVFile->sz )
2e20: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 44 61  {.    memset(pDa
2e30: 74 61 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20  ta, 0, iAmt);.  
2e40: 20 20 69 41 6d 74 20 3d 20 28 69 6e 74 29 28 70    iAmt = (int)(p
2e50: 56 46 69 6c 65 2d 3e 73 7a 20 2d 20 69 4f 66 73  VFile->sz - iOfs
2e60: 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  t);.    memcpy(p
2e70: 44 61 74 61 2c 20 70 56 46 69 6c 65 2d 3e 61 2c  Data, pVFile->a,
2e80: 20 69 41 6d 74 29 3b 0a 20 20 20 20 72 65 74 75   iAmt);.    retu
2e90: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2ea0: 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
2eb0: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
2ec0: 70 56 46 69 6c 65 2d 3e 61 20 2b 20 69 4f 66 73  pVFile->a + iOfs
2ed0: 74 2c 20 69 41 6d 74 29 3b 0a 20 20 72 65 74 75  t, iAmt);.  retu
2ee0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ef0: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d  static int inmem
2f00: 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
2f10: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  _file *pFile,   
2f20: 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 69 73  /* Write to this
2f30: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   file */.  const
2f40: 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20   void *pData,   
2f50: 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 74 6f 20    /* Content to 
2f60: 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  write */.  int i
2f70: 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Amt,            
2f80: 20 20 2f 2a 20 62 79 74 65 73 20 74 6f 20 77 72    /* bytes to wr
2f90: 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
2fa0: 5f 69 6e 74 36 34 20 69 4f 66 73 74 20 20 20 20  _int64 iOfst    
2fb0: 2f 2a 20 53 74 61 72 74 20 77 72 69 74 69 6e 67  /* Start writing
2fc0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 48   here */.){.  VH
2fd0: 61 6e 64 6c 65 20 2a 70 48 61 6e 64 6c 65 20 3d  andle *pHandle =
2fe0: 20 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c 65   (VHandle*)pFile
2ff0: 3b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69 6c  ;.  VFile *pVFil
3000: 65 20 3d 20 70 48 61 6e 64 6c 65 2d 3e 70 56 46  e = pHandle->pVF
3010: 69 6c 65 3b 0a 20 20 69 66 28 20 69 4f 66 73 74  ile;.  if( iOfst
3020: 2b 69 41 6d 74 20 3e 20 70 56 46 69 6c 65 2d 3e  +iAmt > pVFile->
3030: 73 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4f  sz ){.    if( iO
3040: 66 73 74 2b 69 41 6d 74 20 3e 3d 20 4d 58 5f 46  fst+iAmt >= MX_F
3050: 49 4c 45 5f 53 5a 20 29 7b 0a 20 20 20 20 20 20  ILE_SZ ){.      
3060: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
3070: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 56  LL;.    }.    pV
3080: 46 69 6c 65 2d 3e 61 20 3d 20 73 61 66 65 5f 72  File->a = safe_r
3090: 65 61 6c 6c 6f 63 28 70 56 46 69 6c 65 2d 3e 61  ealloc(pVFile->a
30a0: 2c 20 28 69 6e 74 29 28 69 4f 66 73 74 2b 69 41  , (int)(iOfst+iA
30b0: 6d 74 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f  mt));.    if( iO
30c0: 66 73 74 20 3e 20 70 56 46 69 6c 65 2d 3e 73 7a  fst > pVFile->sz
30d0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
30e0: 28 70 56 46 69 6c 65 2d 3e 61 20 2b 20 70 56 46  (pVFile->a + pVF
30f0: 69 6c 65 2d 3e 73 7a 2c 20 30 2c 20 28 69 6e 74  ile->sz, 0, (int
3100: 29 28 69 4f 66 73 74 20 2d 20 70 56 46 69 6c 65  )(iOfst - pVFile
3110: 2d 3e 73 7a 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ->sz));.    }.  
3120: 20 20 70 56 46 69 6c 65 2d 3e 73 7a 20 3d 20 28    pVFile->sz = (
3130: 69 6e 74 29 28 69 4f 66 73 74 20 2b 20 69 41 6d  int)(iOfst + iAm
3140: 74 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  t);.  }.  memcpy
3150: 28 70 56 46 69 6c 65 2d 3e 61 20 2b 20 69 4f 66  (pVFile->a + iOf
3160: 73 74 2c 20 70 44 61 74 61 2c 20 69 41 6d 74 29  st, pData, iAmt)
3170: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3180: 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
3190: 6e 74 20 69 6e 6d 65 6d 54 72 75 6e 63 61 74 65  nt inmemTruncate
31a0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
31b0: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
31c0: 74 36 34 20 69 53 69 7a 65 29 7b 0a 20 20 56 48  t64 iSize){.  VH
31d0: 61 6e 64 6c 65 20 2a 70 48 61 6e 64 6c 65 20 3d  andle *pHandle =
31e0: 20 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c 65   (VHandle*)pFile
31f0: 3b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69 6c  ;.  VFile *pVFil
3200: 65 20 3d 20 70 48 61 6e 64 6c 65 2d 3e 70 56 46  e = pHandle->pVF
3210: 69 6c 65 3b 0a 20 20 69 66 28 20 70 56 46 69 6c  ile;.  if( pVFil
3220: 65 2d 3e 73 7a 3e 69 53 69 7a 65 20 26 26 20 69  e->sz>iSize && i
3230: 53 69 7a 65 3e 3d 30 20 29 20 70 56 46 69 6c 65  Size>=0 ) pVFile
3240: 2d 3e 73 7a 20 3d 20 28 69 6e 74 29 69 53 69 7a  ->sz = (int)iSiz
3250: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
3260: 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
3270: 69 6e 74 20 69 6e 6d 65 6d 53 79 6e 63 28 73 71  int inmemSync(sq
3280: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
3290: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
32a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32b0: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
32c0: 69 6e 6d 65 6d 46 69 6c 65 53 69 7a 65 28 73 71  inmemFileSize(sq
32d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
32e0: 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e, sqlite3_int64
32f0: 20 2a 70 53 69 7a 65 29 7b 0a 20 20 2a 70 53 69   *pSize){.  *pSi
3300: 7a 65 20 3d 20 28 28 56 48 61 6e 64 6c 65 2a 29  ze = ((VHandle*)
3310: 70 46 69 6c 65 29 2d 3e 70 56 46 69 6c 65 2d 3e  pFile)->pVFile->
3320: 73 7a 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  sz;.  return SQL
3330: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
3340: 20 69 6e 74 20 69 6e 6d 65 6d 4c 6f 63 6b 28 73   int inmemLock(s
3350: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
3360: 6c 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  le, int type){. 
3370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3380: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
3390: 69 6e 6d 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69  inmemUnlock(sqli
33a0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
33b0: 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 72 65   int type){.  re
33c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33d0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d  }.static int inm
33e0: 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
33f0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
3400: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70 4f   *pFile, int *pO
3410: 75 74 29 7b 0a 20 20 2a 70 4f 75 74 20 3d 20 30  ut){.  *pOut = 0
3420: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
3430: 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
3440: 6e 74 20 69 6e 6d 65 6d 46 69 6c 65 43 6f 6e 74  nt inmemFileCont
3450: 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
3460: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c   *pFile, int op,
3470: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
3480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
3490: 54 46 4f 55 4e 44 3b 0a 7d 0a 73 74 61 74 69 63  TFOUND;.}.static
34a0: 20 69 6e 74 20 69 6e 6d 65 6d 53 65 63 74 6f 72   int inmemSector
34b0: 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
34c0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 65 74  e *pFile){.  ret
34d0: 75 72 6e 20 35 31 32 3b 0a 7d 0a 73 74 61 74 69  urn 512;.}.stati
34e0: 63 20 69 6e 74 20 69 6e 6d 65 6d 44 65 76 69 63  c int inmemDevic
34f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
3500: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
3510: 46 69 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 0a  File){.  return.
3520: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
3530: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
3540: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  .      SQLITE_IO
3550: 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
3560: 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20  WHEN_OPEN |.    
3570: 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50    SQLITE_IOCAP_P
3580: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
3590: 54 45 3b 0a 7d 0a 0a 0a 2f 2a 20 4d 65 74 68 6f  TE;.}.../* Metho
35a0: 64 20 74 61 62 6c 65 20 66 6f 72 20 56 48 61 6e  d table for VHan
35b0: 64 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  dle.*/.static sq
35c0: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
35d0: 20 56 48 61 6e 64 6c 65 4d 65 74 68 6f 64 73 20   VHandleMethods 
35e0: 3d 20 7b 0a 20 20 2f 2a 20 69 56 65 72 73 69 6f  = {.  /* iVersio
35f0: 6e 20 20 2a 2f 20 20 20 20 31 2c 0a 20 20 2f 2a  n  */    1,.  /*
3600: 20 78 43 6c 6f 73 65 20 20 20 20 2a 2f 20 20 20   xClose    */   
3610: 20 69 6e 6d 65 6d 43 6c 6f 73 65 2c 0a 20 20 2f   inmemClose,.  /
3620: 2a 20 78 52 65 61 64 20 20 20 20 20 2a 2f 20 20  * xRead     */  
3630: 20 20 69 6e 6d 65 6d 52 65 61 64 2c 0a 20 20 2f    inmemRead,.  /
3640: 2a 20 78 57 72 69 74 65 20 20 20 20 2a 2f 20 20  * xWrite    */  
3650: 20 20 69 6e 6d 65 6d 57 72 69 74 65 2c 0a 20 20    inmemWrite,.  
3660: 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
3670: 20 20 20 69 6e 6d 65 6d 54 72 75 6e 63 61 74 65     inmemTruncate
3680: 2c 0a 20 20 2f 2a 20 78 53 79 6e 63 20 20 20 20  ,.  /* xSync    
3690: 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 53 79 6e 63   */    inmemSync
36a0: 2c 0a 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65  ,.  /* xFileSize
36b0: 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 46 69 6c 65   */    inmemFile
36c0: 53 69 7a 65 2c 0a 20 20 2f 2a 20 78 4c 6f 63 6b  Size,.  /* xLock
36d0: 20 20 20 20 20 2a 2f 20 20 20 20 69 6e 6d 65 6d       */    inmem
36e0: 4c 6f 63 6b 2c 0a 20 20 2f 2a 20 78 55 6e 6c 6f  Lock,.  /* xUnlo
36f0: 63 6b 20 20 20 2a 2f 20 20 20 20 69 6e 6d 65 6d  ck   */    inmem
3700: 55 6e 6c 6f 63 6b 2c 0a 20 20 2f 2a 20 78 43 68  Unlock,.  /* xCh
3710: 65 63 6b 2e 2e 2e 20 2a 2f 20 20 20 20 69 6e 6d  eck... */    inm
3720: 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
3730: 6f 63 6b 2c 0a 20 20 2f 2a 20 78 46 69 6c 65 43  ock,.  /* xFileC
3740: 74 72 6c 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 46  trl */    inmemF
3750: 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 2f 2a  ileControl,.  /*
3760: 20 78 53 65 63 74 6f 72 53 7a 20 2a 2f 20 20 20   xSectorSz */   
3770: 20 69 6e 6d 65 6d 53 65 63 74 6f 72 53 69 7a 65   inmemSectorSize
3780: 2c 0a 20 20 2f 2a 20 78 44 65 76 63 68 61 72 20  ,.  /* xDevchar 
3790: 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 44 65 76 69   */    inmemDevi
37a0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
37b0: 73 2c 0a 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20  s,.  /* xShmMap 
37c0: 20 20 2a 2f 20 20 20 20 30 2c 0a 20 20 2f 2a 20    */    0,.  /* 
37d0: 78 53 68 6d 4c 6f 63 6b 20 20 2a 2f 20 20 20 20  xShmLock  */    
37e0: 30 2c 0a 20 20 2f 2a 20 78 53 68 6d 42 61 72 72  0,.  /* xShmBarr
37f0: 69 65 72 20 2a 2f 20 20 30 2c 0a 20 20 2f 2a 20  ier */  0,.  /* 
3800: 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20  xShmUnmap */    
3810: 30 2c 0a 20 20 2f 2a 20 78 46 65 74 63 68 20 20  0,.  /* xFetch  
3820: 20 20 2a 2f 20 20 20 20 30 2c 0a 20 20 2f 2a 20    */    0,.  /* 
3830: 78 55 6e 66 65 74 63 68 20 20 2a 2f 20 20 20 20  xUnfetch  */    
3840: 30 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  0.};../*.** Open
3850: 20 61 20 6e 65 77 20 66 69 6c 65 20 69 6e 20 74   a new file in t
3860: 68 65 20 69 6e 6d 65 6d 20 56 46 53 2e 20 20 41  he inmem VFS.  A
3870: 6c 6c 20 66 69 6c 65 73 20 61 72 65 20 61 6e 6f  ll files are ano
3880: 6e 79 6d 6f 75 73 20 61 6e 64 20 61 72 65 0a 2a  nymous and are.*
3890: 2a 20 64 65 6c 65 74 65 2d 6f 6e 2d 63 6c 6f 73  * delete-on-clos
38a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
38b0: 20 69 6e 6d 65 6d 4f 70 65 6e 28 0a 20 20 73 71   inmemOpen(.  sq
38c0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
38d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
38e0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 73 71 6c 69  Filename,.  sqli
38f0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
3900: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
3910: 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  ,.  int *pOutFla
3920: 67 73 0a 29 7b 0a 20 20 56 46 69 6c 65 20 2a 70  gs.){.  VFile *p
3930: 56 46 69 6c 65 20 3d 20 63 72 65 61 74 65 56 46  VFile = createVF
3940: 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  ile(zFilename, 0
3950: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
3960: 2a 29 22 22 29 3b 0a 20 20 56 48 61 6e 64 6c 65  *)"");.  VHandle
3970: 20 2a 70 48 61 6e 64 6c 65 20 3d 20 28 56 48 61   *pHandle = (VHa
3980: 6e 64 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ndle*)pFile;.  i
3990: 66 28 20 70 56 46 69 6c 65 3d 3d 30 20 29 7b 0a  f( pVFile==0 ){.
39a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
39b0: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 70 48  E_FULL;.  }.  pH
39c0: 61 6e 64 6c 65 2d 3e 70 56 46 69 6c 65 20 3d 20  andle->pVFile = 
39d0: 70 56 46 69 6c 65 3b 0a 20 20 70 56 46 69 6c 65  pVFile;.  pVFile
39e0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 46 69 6c  ->nRef++;.  pFil
39f0: 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26 56  e->pMethods = &V
3a00: 48 61 6e 64 6c 65 4d 65 74 68 6f 64 73 3b 0a 20  HandleMethods;. 
3a10: 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29   if( pOutFlags )
3a20: 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 6f 70   *pOutFlags = op
3a30: 65 6e 46 6c 61 67 73 3b 0a 20 20 72 65 74 75 72  enFlags;.  retur
3a40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3a50: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66  /*.** Delete a f
3a60: 69 6c 65 20 62 79 20 6e 61 6d 65 0a 2a 2f 0a 73  ile by name.*/.s
3a70: 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 44  tatic int inmemD
3a80: 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
3a90: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f  _vfs *pVfs,.  co
3aa0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
3ab0: 61 6d 65 2c 0a 20 20 69 6e 74 20 73 79 6e 63 64  ame,.  int syncd
3ac0: 69 72 0a 29 7b 0a 20 20 56 46 69 6c 65 20 2a 70  ir.){.  VFile *p
3ad0: 56 46 69 6c 65 20 3d 20 66 69 6e 64 56 46 69 6c  VFile = findVFil
3ae0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
3af0: 69 66 28 20 70 56 46 69 6c 65 3d 3d 30 20 29 20  if( pVFile==0 ) 
3b00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3b10: 3b 0a 20 20 69 66 28 20 70 56 46 69 6c 65 2d 3e  ;.  if( pVFile->
3b20: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 66  nRef==0 ){.    f
3b30: 72 65 65 28 70 56 46 69 6c 65 2d 3e 7a 46 69 6c  ree(pVFile->zFil
3b40: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 56 46 69  ename);.    pVFi
3b50: 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  le->zFilename = 
3b60: 30 3b 0a 20 20 20 20 70 56 46 69 6c 65 2d 3e 73  0;.    pVFile->s
3b70: 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 66 72 65 65  z = -1;.    free
3b80: 28 70 56 46 69 6c 65 2d 3e 61 29 3b 0a 20 20 20  (pVFile->a);.   
3b90: 20 70 56 46 69 6c 65 2d 3e 61 20 3d 20 30 3b 0a   pVFile->a = 0;.
3ba0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3bb0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
3bc0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
3bd0: 44 45 4c 45 54 45 3b 0a 7d 0a 0a 2f 2a 20 43 68  DELETE;.}../* Ch
3be0: 65 63 6b 20 66 6f 72 20 74 68 65 20 65 78 69 73  eck for the exis
3bf0: 74 61 6e 63 65 20 6f 66 20 61 20 66 69 6c 65 0a  tance of a file.
3c00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
3c10: 6d 65 6d 41 63 63 65 73 73 28 0a 20 20 73 71 6c  memAccess(.  sql
3c20: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
3c30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
3c40: 69 6c 65 6e 61 6d 65 2c 0a 20 20 69 6e 74 20 66  ilename,.  int f
3c50: 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 52 65  lags,.  int *pRe
3c60: 73 4f 75 74 0a 29 7b 0a 20 20 56 46 69 6c 65 20  sOut.){.  VFile 
3c70: 2a 70 56 46 69 6c 65 20 3d 20 66 69 6e 64 56 46  *pVFile = findVF
3c80: 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ile(zFilename);.
3c90: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 20 70 56    *pResOut =  pV
3ca0: 46 69 6c 65 21 3d 30 3b 0a 20 20 72 65 74 75 72  File!=0;.  retur
3cb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3cc0: 2f 2a 20 47 65 74 20 74 68 65 20 63 61 6e 6f 6e  /* Get the canon
3cd0: 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 66 6f  ical pathname fo
3ce0: 72 20 61 20 66 69 6c 65 0a 2a 2f 0a 73 74 61 74  r a file.*/.stat
3cf0: 69 63 20 69 6e 74 20 69 6e 6d 65 6d 46 75 6c 6c  ic int inmemFull
3d00: 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
3d10: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20  te3_vfs *pVfs,. 
3d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
3d30: 6c 65 6e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 4f  lename,.  int nO
3d40: 75 74 2c 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74  ut,.  char *zOut
3d50: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  .){.  sqlite3_sn
3d60: 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75  printf(nOut, zOu
3d70: 74 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  t, "%s", zFilena
3d80: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  me);.  return SQ
3d90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3da0: 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 56  * Register the V
3db0: 46 53 20 74 68 61 74 20 72 65 61 64 73 20 66 72  FS that reads fr
3dc0: 6f 6d 20 74 68 65 20 67 2e 61 46 69 6c 65 5b 5d  om the g.aFile[]
3dd0: 20 73 65 74 20 6f 66 20 66 69 6c 65 73 2e 0a 2a   set of files..*
3de0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3df0: 6d 65 6d 56 66 73 52 65 67 69 73 74 65 72 28 76  memVfsRegister(v
3e00: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
3e10: 71 6c 69 74 65 33 5f 76 66 73 20 69 6e 6d 65 6d  qlite3_vfs inmem
3e20: 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  Vfs;.  sqlite3_v
3e30: 66 73 20 2a 70 44 65 66 61 75 6c 74 20 3d 20 73  fs *pDefault = s
3e40: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
3e50: 30 29 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 69  0);.  inmemVfs.i
3e60: 56 65 72 73 69 6f 6e 20 3d 20 33 3b 0a 20 20 69  Version = 3;.  i
3e70: 6e 6d 65 6d 56 66 73 2e 73 7a 4f 73 46 69 6c 65  nmemVfs.szOsFile
3e80: 20 3d 20 73 69 7a 65 6f 66 28 56 48 61 6e 64 6c   = sizeof(VHandl
3e90: 65 29 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 6d  e);.  inmemVfs.m
3ea0: 78 50 61 74 68 6e 61 6d 65 20 3d 20 32 30 30 3b  xPathname = 200;
3eb0: 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 7a 4e 61 6d  .  inmemVfs.zNam
3ec0: 65 20 3d 20 22 69 6e 6d 65 6d 22 3b 0a 20 20 69  e = "inmem";.  i
3ed0: 6e 6d 65 6d 56 66 73 2e 78 4f 70 65 6e 20 3d 20  nmemVfs.xOpen = 
3ee0: 69 6e 6d 65 6d 4f 70 65 6e 3b 0a 20 20 69 6e 6d  inmemOpen;.  inm
3ef0: 65 6d 56 66 73 2e 78 44 65 6c 65 74 65 20 3d 20  emVfs.xDelete = 
3f00: 69 6e 6d 65 6d 44 65 6c 65 74 65 3b 0a 20 20 69  inmemDelete;.  i
3f10: 6e 6d 65 6d 56 66 73 2e 78 41 63 63 65 73 73 20  nmemVfs.xAccess 
3f20: 3d 20 69 6e 6d 65 6d 41 63 63 65 73 73 3b 0a 20  = inmemAccess;. 
3f30: 20 69 6e 6d 65 6d 56 66 73 2e 78 46 75 6c 6c 50   inmemVfs.xFullP
3f40: 61 74 68 6e 61 6d 65 20 3d 20 69 6e 6d 65 6d 46  athname = inmemF
3f50: 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20 69  ullPathname;.  i
3f60: 6e 6d 65 6d 56 66 73 2e 78 52 61 6e 64 6f 6d 6e  nmemVfs.xRandomn
3f70: 65 73 73 20 3d 20 70 44 65 66 61 75 6c 74 2d 3e  ess = pDefault->
3f80: 78 52 61 6e 64 6f 6d 6e 65 73 73 3b 0a 20 20 69  xRandomness;.  i
3f90: 6e 6d 65 6d 56 66 73 2e 78 53 6c 65 65 70 20 3d  nmemVfs.xSleep =
3fa0: 20 70 44 65 66 61 75 6c 74 2d 3e 78 53 6c 65 65   pDefault->xSlee
3fb0: 70 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78 43  p;.  inmemVfs.xC
3fc0: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
3fd0: 3d 20 70 44 65 66 61 75 6c 74 2d 3e 78 43 75 72  = pDefault->xCur
3fe0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 3b 0a 20  rentTimeInt64;. 
3ff0: 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
4000: 69 73 74 65 72 28 26 69 6e 6d 65 6d 56 66 73 2c  ister(&inmemVfs,
4010: 20 30 29 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41   0);.};../*.** A
4020: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
4030: 72 20 74 68 65 20 72 75 6e 46 6c 61 67 73 20 70  r the runFlags p
4040: 61 72 61 6d 65 74 65 72 20 74 6f 20 72 75 6e 53  arameter to runS
4050: 71 6c 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ql().*/.#define 
4060: 53 51 4c 5f 54 52 41 43 45 20 20 30 78 30 30 30  SQL_TRACE  0x000
4070: 31 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 65  1     /* Print e
4080: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
4090: 74 20 61 73 20 69 74 20 69 73 20 70 72 65 70 61  t as it is prepa
40a0: 72 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  red */.#define S
40b0: 51 4c 5f 4f 55 54 50 55 54 20 30 78 30 30 30 32  QL_OUTPUT 0x0002
40c0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65       /* Show the
40d0: 20 53 51 4c 20 6f 75 74 70 75 74 20 2a 2f 0a 0a   SQL output */..
40e0: 2f 2a 0a 2a 2a 20 52 75 6e 20 6d 75 6c 74 69 70  /*.** Run multip
40f0: 6c 65 20 63 6f 6d 6d 61 6e 64 73 20 6f 66 20 53  le commands of S
4100: 51 4c 2e 20 20 53 69 6d 69 6c 61 72 20 74 6f 20  QL.  Similar to 
4110: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20  sqlite3_exec(), 
4120: 62 75 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  but does not.** 
4130: 73 74 6f 70 20 69 66 20 61 6e 20 65 72 72 6f 72  stop if an error
4140: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e   is encountered.
4150: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4160: 72 75 6e 53 71 6c 28 73 71 6c 69 74 65 33 20 2a  runSql(sqlite3 *
4170: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
4180: 7a 53 71 6c 2c 20 75 6e 73 69 67 6e 65 64 20 20  zSql, unsigned  
4190: 72 75 6e 46 6c 61 67 73 29 7b 0a 20 20 63 6f 6e  runFlags){.  con
41a0: 73 74 20 63 68 61 72 20 2a 7a 4d 6f 72 65 3b 0a  st char *zMore;.
41b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
41c0: 6e 64 20 3d 20 26 7a 53 71 6c 5b 73 74 72 6c 65  nd = &zSql[strle
41d0: 6e 28 7a 53 71 6c 29 5d 3b 0a 20 20 73 71 6c 69  n(zSql)];.  sqli
41e0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
41f0: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 20  ..  while( zSql 
4200: 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20  && zSql[0] ){.  
4210: 20 20 7a 4d 6f 72 65 20 3d 20 30 3b 0a 20 20 20    zMore = 0;.   
4220: 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
4230: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
4240: 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
4250: 20 26 70 53 74 6d 74 2c 20 26 7a 4d 6f 72 65 29   &pStmt, &zMore)
4260: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d  ;.    assert( zM
4270: 6f 72 65 3c 3d 7a 45 6e 64 20 29 3b 0a 20 20 20  ore<=zEnd );.   
4280: 20 69 66 28 20 7a 4d 6f 72 65 3d 3d 7a 53 71 6c   if( zMore==zSql
4290: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
42a0: 28 20 72 75 6e 46 6c 61 67 73 20 26 20 53 51 4c  ( runFlags & SQL
42b0: 5f 54 52 41 43 45 20 29 7b 0a 20 20 20 20 20 20  _TRACE ){.      
42c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
42d0: 7a 53 71 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zSql;.      int 
42e0: 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  n;.      while( 
42f0: 7a 3c 7a 4d 6f 72 65 20 26 26 20 49 53 53 50 41  z<zMore && ISSPA
4300: 43 45 28 7a 5b 30 5d 29 20 29 20 7a 2b 2b 3b 0a  CE(z[0]) ) z++;.
4310: 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
4320: 7a 4d 6f 72 65 20 2d 20 7a 29 3b 0a 20 20 20 20  zMore - z);.    
4330: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
4340: 49 53 53 50 41 43 45 28 7a 5b 6e 2d 31 5d 29 20  ISSPACE(z[n-1]) 
4350: 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ) n--;.      if(
4360: 20 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   n==0 ) break;. 
4370: 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d 3d       if( pStmt==
4380: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69  0 ){.        pri
4390: 6e 74 66 28 22 54 52 41 43 45 3a 20 25 2e 2a 73  ntf("TRACE: %.*s
43a0: 20 28 65 72 72 6f 72 3a 20 25 73 29 5c 6e 22 2c   (error: %s)\n",
43b0: 20 6e 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f 65   n, z, sqlite3_e
43c0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
43d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
43e0: 20 70 72 69 6e 74 66 28 22 54 52 41 43 45 3a 20   printf("TRACE: 
43f0: 25 2e 2a 73 5c 6e 22 2c 20 6e 2c 20 7a 29 3b 0a  %.*s\n", n, z);.
4400: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4410: 20 20 7a 53 71 6c 20 3d 20 7a 4d 6f 72 65 3b 0a    zSql = zMore;.
4420: 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b      if( pStmt ){
4430: 0a 20 20 20 20 20 20 69 66 28 20 28 72 75 6e 46  .      if( (runF
4440: 6c 61 67 73 20 26 20 53 51 4c 5f 4f 55 54 50 55  lags & SQL_OUTPU
4450: 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  T)==0 ){.       
4460: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
4470: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
4480: 28 70 53 74 6d 74 29 20 29 7b 7d 0a 20 20 20 20  (pStmt) ){}.    
4490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
44a0: 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 2d 31 3b 0a   int nCol = -1;.
44b0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 53          while( S
44c0: 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
44d0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
44e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
44f0: 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  i;.          if(
4500: 20 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   nCol<0 ){.     
4510: 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71         nCol = sq
4520: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
4530: 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  nt(pStmt);.     
4540: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
4550: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
4560: 20 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d 2d       printf("---
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20  ---------\n");. 
45a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
45b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
45c0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
45d0: 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79 70          int eTyp
45e0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
45f0: 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 69 29  mn_type(pStmt,i)
4600: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
4610: 69 6e 74 66 28 22 25 73 20 3d 20 22 2c 20 73 71  intf("%s = ", sq
4620: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
4630: 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  e(pStmt,i));.   
4640: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
4650: 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20 20   eType ){.      
4660: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4670: 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  ITE_NULL: {.    
4680: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
4690: 74 66 28 22 4e 55 4c 4c 5c 6e 22 29 3b 0a 20 20  tf("NULL\n");.  
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
46b0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
46c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
46d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
46e0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
46f0: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
4700: 28 22 49 4e 54 20 25 73 5c 6e 22 2c 20 73 71 6c  ("INT %s\n", sql
4710: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
4720: 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20  (pStmt,i));.    
4730: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4740: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
4750: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
4760: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
4770: 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
4780: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 46 4c        printf("FL
4790: 4f 41 54 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  OAT %s\n", sqlit
47a0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
47b0: 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20  Stmt,i));.      
47c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
47d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
47e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
47f0: 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
4800: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4810: 20 20 20 70 72 69 6e 74 66 28 22 54 45 58 54 20     printf("TEXT 
4820: 5b 25 73 5d 5c 6e 22 2c 20 73 71 6c 69 74 65 33  [%s]\n", sqlite3
4830: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
4840: 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  mt,i));.        
4850: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
4880: 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20 7b  e SQLITE_BLOB: {
4890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
48a0: 20 70 72 69 6e 74 66 28 22 42 4c 4f 42 20 28 25   printf("BLOB (%
48b0: 64 20 62 79 74 65 73 29 5c 6e 22 2c 20 73 71 6c  d bytes)\n", sql
48c0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
48d0: 73 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  s(pStmt,i));.   
48e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
48f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
4900: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4910: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
4920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
4930: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 73          .      s
4940: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
4950: 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
4960: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 62 75 69  }.}../*.** Rebui
4970: 6c 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ld the database 
4980: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  file..**.**    (
4990: 31 29 20 20 52 65 6d 6f 76 65 20 64 75 70 6c 69  1)  Remove dupli
49a0: 63 61 74 65 20 65 6e 74 72 69 65 73 0a 2a 2a 20  cate entries.** 
49b0: 20 20 20 28 32 29 20 20 50 75 74 20 61 6c 6c 20     (2)  Put all 
49c0: 65 6e 74 72 69 65 73 20 69 6e 20 6f 72 64 65 72  entries in order
49d0: 0a 2a 2a 20 20 20 20 28 33 29 20 20 56 61 63 75  .**    (3)  Vacu
49e0: 75 6d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  um.*/.static voi
49f0: 64 20 72 65 62 75 69 6c 64 5f 64 61 74 61 62 61  d rebuild_databa
4a00: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  se(sqlite3 *db){
4a10: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
4a20: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
4a30: 62 2c 20 0a 20 20 20 20 20 22 42 45 47 49 4e 3b  b, .     "BEGIN;
4a40: 5c 6e 22 0a 20 20 20 20 20 22 43 52 45 41 54 45  \n".     "CREATE
4a50: 20 54 45 4d 50 20 54 41 42 4c 45 20 64 62 78 20   TEMP TABLE dbx 
4a60: 41 53 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e  AS SELECT DISTIN
4a70: 43 54 20 64 62 63 6f 6e 74 65 6e 74 20 46 52 4f  CT dbcontent FRO
4a80: 4d 20 64 62 3b 5c 6e 22 0a 20 20 20 20 20 22 44  M db;\n".     "D
4a90: 45 4c 45 54 45 20 46 52 4f 4d 20 64 62 3b 5c 6e  ELETE FROM db;\n
4aa0: 22 0a 20 20 20 20 20 22 49 4e 53 45 52 54 20 49  ".     "INSERT I
4ab0: 4e 54 4f 20 64 62 28 64 62 69 64 2c 20 64 62 63  NTO db(dbid, dbc
4ac0: 6f 6e 74 65 6e 74 29 20 53 45 4c 45 43 54 20 4e  ontent) SELECT N
4ad0: 55 4c 4c 2c 20 64 62 63 6f 6e 74 65 6e 74 20 46  ULL, dbcontent F
4ae0: 52 4f 4d 20 64 62 78 20 4f 52 44 45 52 20 42 59  ROM dbx ORDER BY
4af0: 20 32 3b 5c 6e 22 0a 20 20 20 20 20 22 44 52 4f   2;\n".     "DRO
4b00: 50 20 54 41 42 4c 45 20 64 62 78 3b 5c 6e 22 0a  P TABLE dbx;\n".
4b10: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45 4d       "CREATE TEM
4b20: 50 20 54 41 42 4c 45 20 73 78 20 41 53 20 53 45  P TABLE sx AS SE
4b30: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 73 71  LECT DISTINCT sq
4b40: 6c 74 65 78 74 20 46 52 4f 4d 20 78 73 71 6c 3b  ltext FROM xsql;
4b50: 5c 6e 22 0a 20 20 20 20 20 22 44 45 4c 45 54 45  \n".     "DELETE
4b60: 20 46 52 4f 4d 20 78 73 71 6c 3b 5c 6e 22 0a 20   FROM xsql;\n". 
4b70: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
4b80: 20 78 73 71 6c 28 73 71 6c 69 64 2c 73 71 6c 74   xsql(sqlid,sqlt
4b90: 65 78 74 29 20 53 45 4c 45 43 54 20 4e 55 4c 4c  ext) SELECT NULL
4ba0: 2c 20 73 71 6c 74 65 78 74 20 46 52 4f 4d 20 73  , sqltext FROM s
4bb0: 78 20 4f 52 44 45 52 20 42 59 20 32 3b 5c 6e 22  x ORDER BY 2;\n"
4bc0: 0a 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c  .     "DROP TABL
4bd0: 45 20 73 78 3b 5c 6e 22 0a 20 20 20 20 20 22 43  E sx;\n".     "C
4be0: 4f 4d 4d 49 54 3b 5c 6e 22 0a 20 20 20 20 20 22  OMMIT;\n".     "
4bf0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
4c00: 3d 31 30 32 34 3b 5c 6e 22 0a 20 20 20 20 20 22  =1024;\n".     "
4c10: 56 41 43 55 55 4d 3b 5c 6e 22 2c 20 30 2c 20 30  VACUUM;\n", 0, 0
4c20: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
4c30: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e   fatalError("can
4c40: 6e 6f 74 20 72 65 62 75 69 6c 64 3a 20 25 73 22  not rebuild: %s"
4c50: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
4c60: 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (db));.}../*.** 
4c70: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
4c80: 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d 61   of a hexadecima
4c90: 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72 6e  l digit.  Return
4ca0: 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75 74   -1 if the input
4cb0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65 78  .** is not a hex
4cc0: 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69   digit..*/.stati
4cd0: 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56 61  c int hexDigitVa
4ce0: 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20 69  lue(char c){.  i
4cf0: 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d  f( c>='0' && c<=
4d00: 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  '9' ) return c -
4d10: 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27   '0';.  if( c>='
4d20: 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20 72  a' && c<='f' ) r
4d30: 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20  eturn c - 'a' + 
4d40: 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41 27  10;.  if( c>='A'
4d50: 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65 74   && c<='F' ) ret
4d60: 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31 30  urn c - 'A' + 10
4d70: 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  ;.  return -1;.}
4d80: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
4d90: 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e 74  t zArg as an int
4da0: 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73 73  eger value, poss
4db0: 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69 78  ibly with suffix
4dc0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
4dd0: 74 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63  t integerValue(c
4de0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
4df0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
4e00: 34 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  4 v = 0;.  stati
4e10: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
4e20: 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20   char *zSuffix; 
4e30: 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75  int iMult; } aMu
4e40: 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  lt[] = {.    { "
4e50: 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20  KiB", 1024 },.  
4e60: 20 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a    { "MiB", 1024*
4e70: 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47  1024 },.    { "G
4e80: 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31  iB", 1024*1024*1
4e90: 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42  024 },.    { "KB
4ea0: 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20  ",  1000 },.    
4eb0: 7b 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30  { "MB",  1000000
4ec0: 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20   },.    { "GB", 
4ed0: 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   1000000000 },. 
4ee0: 20 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30     { "K",   1000
4ef0: 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20   },.    { "M",  
4f00: 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20   1000000 },.    
4f10: 7b 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30  { "G",   1000000
4f20: 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  000 },.  };.  in
4f30: 74 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67  t i;.  int isNeg
4f40: 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67   = 0;.  if( zArg
4f50: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
4f60: 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a  isNeg = 1;.    z
4f70: 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  Arg++;.  }else i
4f80: 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20  f( zArg[0]=='+' 
4f90: 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  ){.    zArg++;. 
4fa0: 20 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d   }.  if( zArg[0]
4fb0: 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d  =='0' && zArg[1]
4fc0: 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='x' ){.    int
4fd0: 20 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20   x;.    zArg += 
4fe0: 32 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78  2;.    while( (x
4ff0: 20 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65   = hexDigitValue
5000: 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b  (zArg[0]))>=0 ){
5010: 0a 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34  .      v = (v<<4
5020: 29 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72  ) + x;.      zAr
5030: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  g++;.    }.  }el
5040: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49  se{.    while( I
5050: 53 44 49 47 49 54 28 7a 41 72 67 5b 30 5d 29 20  SDIGIT(zArg[0]) 
5060: 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31  ){.      v = v*1
5070: 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30  0 + zArg[0] - '0
5080: 27 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b  ';.      zArg++;
5090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
50a0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
50b0: 4d 75 6c 74 29 2f 73 69 7a 65 6f 66 28 61 4d 75  Mult)/sizeof(aMu
50c0: 6c 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  lt[0]); i++){.  
50d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
50e0: 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e 7a  ricmp(aMult[i].z
50f0: 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d 30  Suffix, zArg)==0
5100: 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20 61   ){.      v *= a
5110: 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a 20  Mult[i].iMult;. 
5120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5130: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 76 3e 30 78  }.  }.  if( v>0x
5140: 37 66 66 66 66 66 66 66 20 29 20 66 61 74 61 6c  7fffffff ) fatal
5150: 45 72 72 6f 72 28 22 70 61 72 61 6d 65 74 65 72  Error("parameter
5160: 20 74 6f 6f 20 6c 61 72 67 65 20 2d 20 6d 61 78   too large - max
5170: 20 32 31 34 37 34 38 33 36 34 38 22 29 3b 0a 20   2147483648");. 
5180: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69 73   return (int)(is
5190: 4e 65 67 3f 20 2d 76 20 3a 20 76 29 3b 0a 7d 0a  Neg? -v : v);.}.
51a0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 73 6b 65  ./*.** Print ske
51b0: 74 63 68 79 20 64 6f 63 75 6d 65 6e 74 61 74 69  tchy documentati
51c0: 6f 6e 20 66 6f 72 20 74 68 69 73 20 75 74 69 6c  on for this util
51d0: 69 74 79 20 70 72 6f 67 72 61 6d 0a 2a 2f 0a 73  ity program.*/.s
51e0: 74 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77 48  tatic void showH
51f0: 65 6c 70 28 76 6f 69 64 29 7b 0a 20 20 70 72 69  elp(void){.  pri
5200: 6e 74 66 28 22 55 73 61 67 65 3a 20 25 73 20 5b  ntf("Usage: %s [
5210: 6f 70 74 69 6f 6e 73 5d 20 53 4f 55 52 43 45 2d  options] SOURCE-
5220: 44 42 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e 22 2c  DB ?ARGS...?\n",
5230: 20 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 70 72   g.zArgv0);.  pr
5240: 69 6e 74 66 28 0a 22 52 65 61 64 20 64 61 74 61  intf(."Read data
5250: 62 61 73 65 73 20 61 6e 64 20 53 51 4c 20 73 63  bases and SQL sc
5260: 72 69 70 74 73 20 66 72 6f 6d 20 53 4f 55 52 43  ripts from SOURC
5270: 45 2d 44 42 20 61 6e 64 20 65 78 65 63 75 74 65  E-DB and execute
5280: 20 65 61 63 68 20 73 63 72 69 70 74 20 61 67 61   each script aga
5290: 69 6e 73 74 5c 6e 22 0a 22 65 61 63 68 20 64 61  inst\n"."each da
52a0: 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
52b0: 20 66 6f 72 20 63 72 61 73 68 65 73 20 61 6e 64   for crashes and
52c0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 2e 5c 6e   memory leaks.\n
52d0: 22 0a 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22  "."Options:\n"."
52e0: 20 20 2d 2d 63 65 6c 6c 2d 73 69 7a 65 2d 63 68    --cell-size-ch
52f0: 65 63 6b 20 20 20 20 53 65 74 20 74 68 65 20 50  eck    Set the P
5300: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
5310: 63 68 65 63 6b 3d 4f 4e 5c 6e 22 0a 22 20 20 2d  check=ON\n"."  -
5320: 2d 64 62 69 64 20 4e 20 20 20 20 20 20 20 20 20  -dbid N         
5330: 20 20 20 20 55 73 65 20 6f 6e 6c 79 20 74 68 65      Use only the
5340: 20 64 61 74 61 62 61 73 65 20 77 68 65 72 65 20   database where 
5350: 64 62 69 64 3d 4e 5c 6e 22 0a 22 20 20 2d 2d 65  dbid=N\n"."  --e
5360: 78 70 6f 72 74 2d 64 62 20 44 49 52 20 20 20 20  xport-db DIR    
5370: 20 20 57 72 69 74 65 20 64 61 74 61 62 61 73 65    Write database
5380: 73 20 74 6f 20 66 69 6c 65 73 28 73 29 20 69 6e  s to files(s) in
5390: 20 44 49 52 2e 20 57 6f 72 6b 73 20 77 69 74 68   DIR. Works with
53a0: 20 2d 2d 64 62 69 64 5c 6e 22 0a 22 20 20 2d 2d   --dbid\n"."  --
53b0: 65 78 70 6f 72 74 2d 73 71 6c 20 44 49 52 20 20  export-sql DIR  
53c0: 20 20 20 57 72 69 74 65 20 53 51 4c 20 74 6f 20     Write SQL to 
53d0: 66 69 6c 65 28 73 29 20 69 6e 20 44 49 52 2e 20  file(s) in DIR. 
53e0: 41 6c 73 6f 20 77 6f 72 6b 73 20 77 69 74 68 20  Also works with 
53f0: 2d 2d 73 71 6c 69 64 5c 6e 22 0a 22 20 20 2d 2d  --sqlid\n"."  --
5400: 68 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20  help            
5410: 20 20 20 53 68 6f 77 20 74 68 69 73 20 68 65 6c     Show this hel
5420: 70 20 74 65 78 74 5c 6e 22 0a 22 20 20 2d 71 7c  p text\n"."  -q|
5430: 2d 2d 71 75 69 65 74 20 20 20 20 20 20 20 20 20  --quiet         
5440: 20 20 52 65 64 75 63 65 64 20 6f 75 74 70 75 74    Reduced output
5450: 5c 6e 22 0a 22 20 20 2d 2d 6c 69 6d 69 74 2d 6d  \n"."  --limit-m
5460: 65 6d 20 4e 20 20 20 20 20 20 20 20 4c 69 6d 69  em N        Limi
5470: 74 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  t memory used by
5480: 20 74 65 73 74 20 53 51 4c 69 74 65 20 69 6e 73   test SQLite ins
5490: 74 61 6e 63 65 20 74 6f 20 4e 20 62 79 74 65 73  tance to N bytes
54a0: 5c 6e 22 0a 22 20 20 2d 2d 6c 69 6d 69 74 2d 76  \n"."  --limit-v
54b0: 64 62 65 20 20 20 20 20 20 20 20 20 50 61 6e 69  dbe         Pani
54c0: 63 20 69 66 20 61 6e 79 20 74 65 73 74 20 72 75  c if any test ru
54d0: 6e 73 20 66 6f 72 20 6d 6f 72 65 20 74 68 61 6e  ns for more than
54e0: 20 31 30 30 2c 30 30 30 20 63 79 63 6c 65 73 5c   100,000 cycles\
54f0: 6e 22 0a 22 20 20 2d 2d 6c 6f 61 64 2d 73 71 6c  n"."  --load-sql
5500: 20 41 52 47 53 2e 2e 2e 20 20 20 4c 6f 61 64 20   ARGS...   Load 
5510: 53 51 4c 20 73 63 72 69 70 74 73 20 66 72 6f 20  SQL scripts fro 
5520: 66 69 6c 65 73 20 69 6e 74 6f 20 53 4f 55 52 43  files into SOURC
5530: 45 2d 44 42 5c 6e 22 0a 22 20 20 2d 2d 6c 6f 61  E-DB\n"."  --loa
5540: 64 2d 64 62 20 41 52 47 53 2e 2e 2e 20 20 20 20  d-db ARGS...    
5550: 4c 6f 61 64 20 74 65 6d 70 6c 61 74 65 20 64 61  Load template da
5560: 74 61 62 61 73 65 73 20 66 72 6f 6d 20 66 69 6c  tabases from fil
5570: 65 73 20 69 6e 74 6f 20 53 4f 55 52 43 45 5f 44  es into SOURCE_D
5580: 42 5c 6e 22 0a 22 20 20 2d 6d 20 54 45 58 54 20  B\n"."  -m TEXT 
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64               Add
55a0: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 74   a description t
55b0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 5c 6e  o the database\n
55c0: 22 0a 22 20 20 2d 2d 6e 61 74 69 76 65 2d 76 66  "."  --native-vf
55d0: 73 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68  s         Use th
55e0: 65 20 6e 61 74 69 76 65 20 56 46 53 20 66 6f 72  e native VFS for
55f0: 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
5600: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 5c   database files\
5610: 6e 22 0a 22 20 20 2d 2d 72 65 62 75 69 6c 64 20  n"."  --rebuild 
5620: 20 20 20 20 20 20 20 20 20 20 20 52 65 62 75 69             Rebui
5630: 6c 64 20 61 6e 64 20 76 61 63 75 75 6d 20 74 68  ld and vacuum th
5640: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 5c  e database file\
5650: 6e 22 0a 22 20 20 2d 2d 72 65 73 75 6c 74 2d 74  n"."  --result-t
5660: 72 61 63 65 20 20 20 20 20 20 20 53 68 6f 77 20  race       Show 
5670: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 65  the results of e
5680: 61 63 68 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 5c  ach SQL command\
5690: 6e 22 0a 22 20 20 2d 2d 73 71 6c 69 64 20 4e 20  n"."  --sqlid N 
56a0: 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 6f             Use o
56b0: 6e 6c 79 20 53 51 4c 20 77 68 65 72 65 20 73 71  nly SQL where sq
56c0: 6c 69 64 3d 4e 5c 6e 22 0a 22 20 20 2d 2d 74 69  lid=N\n"."  --ti
56d0: 6d 65 6f 75 74 20 4e 20 20 20 20 20 20 20 20 20  meout N         
56e0: 20 41 62 6f 72 74 20 69 66 20 61 6e 79 20 73 69   Abort if any si
56f0: 6e 67 6c 65 20 74 65 73 74 20 6e 65 65 64 73 20  ngle test needs 
5700: 6d 6f 72 65 20 74 68 61 6e 20 4e 20 73 65 63 6f  more than N seco
5710: 6e 64 73 5c 6e 22 0a 22 20 20 2d 76 7c 2d 2d 76  nds\n"."  -v|--v
5720: 65 72 62 6f 73 65 20 20 20 20 20 20 20 20 20 49  erbose         I
5730: 6e 63 72 65 61 73 65 64 20 6f 75 74 70 75 74 2e  ncreased output.
5740: 20 20 52 65 70 65 61 74 20 66 6f 72 20 6d 6f 72    Repeat for mor
5750: 65 20 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20 29  e output.\n".  )
5760: 3b 0a 7d 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e  ;.}..int main(in
5770: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
5780: 72 67 76 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rgv){.  sqlite3_
5790: 69 6e 74 36 34 20 69 42 65 67 69 6e 3b 20 20 20  int64 iBegin;   
57a0: 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 74 69       /* Start ti
57b0: 6d 65 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72  me of this progr
57c0: 61 6d 20 2a 2f 0a 20 20 69 6e 74 20 71 75 69 65  am */.  int quie
57d0: 74 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20  tFlag = 0;      
57e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
57f0: 2d 2d 71 75 69 65 74 20 6f 72 20 2d 71 20 2a 2f  --quiet or -q */
5800: 0a 20 20 69 6e 74 20 76 65 72 62 6f 73 65 46 6c  .  int verboseFl
5810: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
5820: 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72  /* True if --ver
5830: 62 6f 73 65 20 6f 72 20 2d 76 20 2a 2f 0a 20 20  bose or -v */.  
5840: 63 68 61 72 20 2a 7a 49 6e 73 53 71 6c 20 3d 20  char *zInsSql = 
5850: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
5860: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  SQL statement fo
5870: 72 20 2d 2d 6c 6f 61 64 2d 64 62 20 6f 72 20 2d  r --load-db or -
5880: 2d 6c 6f 61 64 2d 73 71 6c 20 2a 2f 0a 20 20 69  -load-sql */.  i
5890: 6e 74 20 69 46 69 72 73 74 49 6e 73 41 72 67 20  nt iFirstInsArg 
58a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  = 0;        /* F
58b0: 69 72 73 74 20 61 72 67 76 5b 5d 20 74 6f 20 75  irst argv[] to u
58c0: 73 65 20 66 6f 72 20 2d 2d 6c 6f 61 64 2d 64 62  se for --load-db
58d0: 20 6f 72 20 2d 2d 6c 6f 61 64 2d 73 71 6c 20 2a   or --load-sql *
58e0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
58f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5900: 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 64 61 74   /* The open dat
5910: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5920: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
5930: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
5940: 20 20 20 2f 2a 20 41 20 70 72 65 70 61 72 65 64     /* A prepared
5950: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
5960: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5980: 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
5990: 20 53 51 4c 69 74 65 20 69 6e 74 65 72 66 61 63   SQLite interfac
59a0: 65 20 63 61 6c 6c 73 20 2a 2f 0a 20 20 42 6c 6f  e calls */.  Blo
59b0: 62 20 2a 70 53 71 6c 3b 20 20 20 20 20 20 20 20  b *pSql;        
59c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
59d0: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 53 51   looping over SQ
59e0: 4c 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20 42  L scripts */.  B
59f0: 6c 6f 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20  lob *pDb;       
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
5a10: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
5a20: 74 65 6d 70 6c 61 74 65 20 64 61 74 61 62 61 73  template databas
5a30: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  es */.  int i;  
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a50: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 69 6e 64       /* Loop ind
5a60: 65 78 20 66 6f 72 20 74 68 65 20 61 72 67 76 5b  ex for the argv[
5a70: 5d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  ] loop */.  int 
5a80: 6f 6e 6c 79 53 71 6c 69 64 20 3d 20 2d 31 3b 20  onlySqlid = -1; 
5a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 73 71           /* --sq
5aa0: 6c 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c  lid */.  int onl
5ab0: 79 44 62 69 64 20 3d 20 2d 31 3b 20 20 20 20 20  yDbid = -1;     
5ac0: 20 20 20 20 20 20 2f 2a 20 2d 2d 64 62 69 64 20        /* --dbid 
5ad0: 2a 2f 0a 20 20 69 6e 74 20 6e 61 74 69 76 65 46  */.  int nativeF
5ae0: 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lag = 0;        
5af0: 20 20 2f 2a 20 2d 2d 6e 61 74 69 76 65 2d 76 66    /* --native-vf
5b00: 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 62 75 69  s */.  int rebui
5b10: 6c 64 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20  ldFlag = 0;     
5b20: 20 20 20 20 2f 2a 20 2d 2d 72 65 62 75 69 6c 64      /* --rebuild
5b30: 20 2a 2f 0a 20 20 69 6e 74 20 76 64 62 65 4c 69   */.  int vdbeLi
5b40: 6d 69 74 46 6c 61 67 20 3d 20 30 3b 20 20 20 20  mitFlag = 0;    
5b50: 20 20 20 2f 2a 20 2d 2d 6c 69 6d 69 74 2d 76 64     /* --limit-vd
5b60: 62 65 20 2a 2f 0a 20 20 69 6e 74 20 74 69 6d 65  be */.  int time
5b70: 6f 75 74 54 65 73 74 20 3d 20 30 3b 20 20 20 20  outTest = 0;    
5b80: 20 20 20 20 20 2f 2a 20 75 6e 64 6f 63 75 6d 65       /* undocume
5b90: 6e 74 65 64 20 2d 2d 74 69 6d 65 6f 75 74 2d 74  nted --timeout-t
5ba0: 65 73 74 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e  est flag */.  in
5bb0: 74 20 72 75 6e 46 6c 61 67 73 20 3d 20 30 3b 20  t runFlags = 0; 
5bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
5bd0: 61 67 73 20 73 65 6e 74 20 74 6f 20 72 75 6e 53  ags sent to runS
5be0: 71 6c 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ql() */.  char *
5bf0: 7a 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20  zMsg = 0;       
5c00: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
5c10: 69 73 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  is message */.  
5c20: 69 6e 74 20 6e 53 72 63 44 62 20 3d 20 30 3b 20  int nSrcDb = 0; 
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c40: 4e 75 6d 62 65 72 20 6f 66 20 73 6f 75 72 63 65  Number of source
5c50: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
5c60: 63 68 61 72 20 2a 2a 61 7a 53 72 63 44 62 20 3d  char **azSrcDb =
5c70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
5c80: 41 72 72 61 79 20 6f 66 20 73 6f 75 72 63 65 20  Array of source 
5c90: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 2a  database names *
5ca0: 2f 0a 20 20 69 6e 74 20 69 53 72 63 44 62 3b 20  /.  int iSrcDb; 
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cc0: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
5cd0: 6c 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  l source databas
5ce0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 73  es */.  int nTes
5cf0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
5d00: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
5d10: 6d 62 65 72 20 6f 66 20 74 65 73 74 73 20 70 65  mber of tests pe
5d20: 72 66 6f 72 6d 65 64 20 2a 2f 0a 20 20 63 68 61  rformed */.  cha
5d30: 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 22 3b  r *zDbName = "";
5d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
5d50: 72 65 76 69 61 74 65 64 20 6e 61 6d 65 20 6f 66  reviated name of
5d60: 20 61 20 73 6f 75 72 63 65 20 64 61 74 61 62 61   a source databa
5d70: 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  se */.  const ch
5d80: 61 72 20 2a 7a 46 61 69 6c 43 6f 64 65 20 3d 20  ar *zFailCode = 
5d90: 30 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66  0;   /* Value of
5da0: 20 74 68 65 20 54 45 53 54 5f 46 41 49 4c 55 52   the TEST_FAILUR
5db0: 45 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  E environment va
5dc0: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
5dd0: 63 65 6c 6c 53 7a 43 6b 46 6c 61 67 20 3d 20 30  cellSzCkFlag = 0
5de0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 63 65  ;        /* --ce
5df0: 6c 6c 2d 73 69 7a 65 2d 63 68 65 63 6b 20 2a 2f  ll-size-check */
5e00: 0a 20 20 69 6e 74 20 73 71 6c 46 75 7a 7a 20 3d  .  int sqlFuzz =
5e10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5e20: 2f 2a 20 54 72 75 65 20 66 6f 72 20 53 51 4c 20  /* True for SQL 
5e30: 66 75 7a 7a 20 74 65 73 74 69 6e 67 2e 20 46 61  fuzz testing. Fa
5e40: 6c 73 65 20 66 6f 72 20 44 42 20 66 75 7a 7a 20  lse for DB fuzz 
5e50: 2a 2f 0a 20 20 69 6e 74 20 69 54 69 6d 65 6f 75  */.  int iTimeou
5e60: 74 20 3d 20 31 32 30 3b 20 20 20 20 20 20 20 20  t = 120;        
5e70: 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 31 32 30    /* Default 120
5e80: 2d 73 65 63 6f 6e 64 20 74 69 6d 65 6f 75 74 20  -second timeout 
5e90: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 20 3d 20  */.  int nMem = 
5ea0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5eb0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6c 69 6d 69    /* Memory limi
5ec0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  t */.  char *zEx
5ed0: 70 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pDb = 0;        
5ee0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 44 61 74      /* Write Dat
5ef0: 61 62 61 73 65 73 20 74 6f 20 66 69 6c 65 73 20  abases to files 
5f00: 69 6e 20 74 68 69 73 20 64 69 72 65 63 74 6f 72  in this director
5f10: 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  y */.  char *zEx
5f20: 70 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pSql = 0;       
5f30: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 53 51 4c      /* Write SQL
5f40: 20 74 6f 20 66 69 6c 65 73 20 69 6e 20 74 68 69   to files in thi
5f50: 73 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  s directory */. 
5f60: 20 76 6f 69 64 20 2a 70 48 65 61 70 20 3d 20 30   void *pHeap = 0
5f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5f80: 20 48 65 61 70 20 66 6f 72 20 75 73 65 20 62 79   Heap for use by
5f90: 20 53 51 4c 69 74 65 20 2a 2f 0a 0a 20 20 69 42   SQLite */..  iB
5fa0: 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79  egin = timeOfDay
5fb0: 28 29 3b 0a 23 69 66 64 65 66 20 5f 5f 75 6e 69  ();.#ifdef __uni
5fc0: 78 5f 5f 0a 20 20 73 69 67 6e 61 6c 28 53 49 47  x__.  signal(SIG
5fd0: 41 4c 52 4d 2c 20 74 69 6d 65 6f 75 74 48 61 6e  ALRM, timeoutHan
5fe0: 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20  dler);.#endif.  
5ff0: 67 2e 7a 41 72 67 76 30 20 3d 20 61 72 67 76 5b  g.zArgv0 = argv[
6000: 30 5d 3b 0a 20 20 7a 46 61 69 6c 43 6f 64 65 20  0];.  zFailCode 
6010: 3d 20 67 65 74 65 6e 76 28 22 54 45 53 54 5f 46  = getenv("TEST_F
6020: 41 49 4c 55 52 45 22 29 3b 0a 20 20 66 6f 72 28  AILURE");.  for(
6030: 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=1; i<argc; i++
6040: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
6050: 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  r *z = argv[i];.
6060: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
6070: 27 20 29 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  ' ){.      z++;.
6080: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
6090: 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
60a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 63   if( strcmp(z,"c
60b0: 65 6c 6c 2d 73 69 7a 65 2d 63 68 65 63 6b 22 29  ell-size-check")
60c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
60d0: 65 6c 6c 53 7a 43 6b 46 6c 61 67 20 3d 20 31 3b  ellSzCkFlag = 1;
60e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
60f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
6100: 22 64 62 69 64 22 29 3d 3d 30 20 29 7b 0a 20 20  "dbid")==0 ){.  
6110: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67        if( i>=arg
6120: 63 2d 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72  c-1 ) fatalError
6130: 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  ("missing argume
6140: 6e 74 73 20 6f 6e 20 25 73 22 2c 20 61 72 67 76  nts on %s", argv
6150: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6f 6e  [i]);.        on
6160: 6c 79 44 62 69 64 20 3d 20 69 6e 74 65 67 65 72  lyDbid = integer
6170: 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29  Value(argv[++i])
6180: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
6190: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
61a0: 2c 22 65 78 70 6f 72 74 2d 64 62 22 29 3d 3d 30  ,"export-db")==0
61b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
61c0: 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61  i>=argc-1 ) fata
61d0: 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20  lError("missing 
61e0: 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 22  arguments on %s"
61f0: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
6200: 20 20 20 20 7a 45 78 70 44 62 20 3d 20 61 72 67      zExpDb = arg
6210: 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 7d 65  v[++i];.      }e
6220: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
6230: 72 63 6d 70 28 7a 2c 22 65 78 70 6f 72 74 2d 73  rcmp(z,"export-s
6240: 71 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ql")==0 ){.     
6250: 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31     if( i>=argc-1
6260: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d   ) fatalError("m
6270: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73  issing arguments
6280: 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69 5d   on %s", argv[i]
6290: 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 78 70 53  );.        zExpS
62a0: 71 6c 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a  ql = argv[++i];.
62b0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
62c0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
62d0: 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  help")==0 ){.   
62e0: 20 20 20 20 20 73 68 6f 77 48 65 6c 70 28 29 3b       showHelp();
62f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6300: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  0;.      }else. 
6310: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6320: 7a 2c 22 6c 69 6d 69 74 2d 6d 65 6d 22 29 3d 3d  z,"limit-mem")==
6330: 30 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  0 ){.#if !define
6340: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
6350: 4d 45 4d 53 59 53 33 29 20 26 26 20 21 64 65 66  MEMSYS3) && !def
6360: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6370: 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20  LE_MEMSYS5).    
6380: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
6390: 74 68 65 20 25 73 20 6f 70 74 69 6f 6e 20 72 65  the %s option re
63a0: 71 75 69 72 65 73 20 2d 44 53 51 4c 49 54 45 5f  quires -DSQLITE_
63b0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 6f  ENABLE_MEMSYS5 o
63c0: 72 20 5f 4d 45 4d 53 59 53 33 22 2c 0a 20 20 20  r _MEMSYS3",.   
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63e0: 61 72 67 76 5b 69 5d 29 3b 0a 23 65 6c 73 65 0a  argv[i]);.#else.
63f0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61          if( i>=a
6400: 72 67 63 2d 31 20 29 20 66 61 74 61 6c 45 72 72  rgc-1 ) fatalErr
6410: 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75  or("missing argu
6420: 6d 65 6e 74 73 20 6f 6e 20 25 73 22 2c 20 61 72  ments on %s", ar
6430: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  gv[i]);.        
6440: 6e 4d 65 6d 20 3d 20 69 6e 74 65 67 65 72 56 61  nMem = integerVa
6450: 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a  lue(argv[++i]);.
6460: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
6470: 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
6480: 63 6d 70 28 7a 2c 22 6c 69 6d 69 74 2d 76 64 62  cmp(z,"limit-vdb
6490: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
64a0: 20 20 76 64 62 65 4c 69 6d 69 74 46 6c 61 67 20    vdbeLimitFlag 
64b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
64c0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
64d0: 70 28 7a 2c 22 6c 6f 61 64 2d 73 71 6c 22 29 3d  p(z,"load-sql")=
64e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49  =0 ){.        zI
64f0: 6e 73 53 71 6c 20 3d 20 22 49 4e 53 45 52 54 20  nsSql = "INSERT 
6500: 49 4e 54 4f 20 78 73 71 6c 28 73 71 6c 74 65 78  INTO xsql(sqltex
6510: 74 29 20 56 41 4c 55 45 53 28 43 41 53 54 28 72  t) VALUES(CAST(r
6520: 65 61 64 66 69 6c 65 28 3f 31 29 20 41 53 20 74  eadfile(?1) AS t
6530: 65 78 74 29 29 22 3b 0a 20 20 20 20 20 20 20 20  ext))";.        
6540: 69 46 69 72 73 74 49 6e 73 41 72 67 20 3d 20 69  iFirstInsArg = i
6550: 2b 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  +1;.        brea
6560: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  k;.      }else. 
6570: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6580: 7a 2c 22 6c 6f 61 64 2d 64 62 22 29 3d 3d 30 20  z,"load-db")==0 
6590: 29 7b 0a 20 20 20 20 20 20 20 20 7a 49 6e 73 53  ){.        zInsS
65a0: 71 6c 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54  ql = "INSERT INT
65b0: 4f 20 64 62 28 64 62 63 6f 6e 74 65 6e 74 29 20  O db(dbcontent) 
65c0: 56 41 4c 55 45 53 28 72 65 61 64 66 69 6c 65 28  VALUES(readfile(
65d0: 3f 31 29 29 22 3b 0a 20 20 20 20 20 20 20 20 69  ?1))";.        i
65e0: 46 69 72 73 74 49 6e 73 41 72 67 20 3d 20 69 2b  FirstInsArg = i+
65f0: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
6600: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
6610: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6620: 2c 22 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,"m")==0 ){.    
6630: 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d      if( i>=argc-
6640: 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  1 ) fatalError("
6650: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
6660: 73 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69  s on %s", argv[i
6670: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67  ]);.        zMsg
6680: 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20   = argv[++i];.  
6690: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
66a0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 61  if( strcmp(z,"na
66b0: 74 69 76 65 2d 76 66 73 22 29 3d 3d 30 20 29 7b  tive-vfs")==0 ){
66c0: 0a 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 46  .        nativeF
66d0: 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  lag = 1;.      }
66e0: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
66f0: 74 72 63 6d 70 28 7a 2c 22 71 75 69 65 74 22 29  trcmp(z,"quiet")
6700: 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c  ==0 || strcmp(z,
6710: 22 71 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  "q")==0 ){.     
6720: 20 20 20 71 75 69 65 74 46 6c 61 67 20 3d 20 31     quietFlag = 1
6730: 3b 0a 20 20 20 20 20 20 20 20 76 65 72 62 6f 73  ;.        verbos
6740: 65 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 20  eFlag = 0;.     
6750: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
6760: 20 73 74 72 63 6d 70 28 7a 2c 22 72 65 62 75 69   strcmp(z,"rebui
6770: 6c 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ld")==0 ){.     
6780: 20 20 20 72 65 62 75 69 6c 64 46 6c 61 67 20 3d     rebuildFlag =
6790: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a   1;.      }else.
67a0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
67b0: 28 7a 2c 22 72 65 73 75 6c 74 2d 74 72 61 63 65  (z,"result-trace
67c0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
67d0: 20 72 75 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c   runFlags |= SQL
67e0: 5f 4f 55 54 50 55 54 3b 0a 20 20 20 20 20 20 7d  _OUTPUT;.      }
67f0: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
6800: 74 72 63 6d 70 28 7a 2c 22 73 71 6c 69 64 22 29  trcmp(z,"sqlid")
6810: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
6820: 66 28 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66  f( i>=argc-1 ) f
6830: 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69  atalError("missi
6840: 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20  ng arguments on 
6850: 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  %s", argv[i]);. 
6860: 20 20 20 20 20 20 20 6f 6e 6c 79 53 71 6c 69 64         onlySqlid
6870: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
6880: 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  argv[++i]);.    
6890: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
68a0: 28 20 73 74 72 63 6d 70 28 7a 2c 22 74 69 6d 65  ( strcmp(z,"time
68b0: 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  out")==0 ){.    
68c0: 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d      if( i>=argc-
68d0: 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  1 ) fatalError("
68e0: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
68f0: 73 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69  s on %s", argv[i
6900: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 54 69 6d  ]);.        iTim
6910: 65 6f 75 74 20 3d 20 69 6e 74 65 67 65 72 56 61  eout = integerVa
6920: 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a  lue(argv[++i]);.
6930: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
6940: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
6950: 74 69 6d 65 6f 75 74 2d 74 65 73 74 22 29 3d 3d  timeout-test")==
6960: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 69 6d  0 ){.        tim
6970: 65 6f 75 74 54 65 73 74 20 3d 20 31 3b 0a 23 69  eoutTest = 1;.#i
6980: 66 6e 64 65 66 20 5f 5f 75 6e 69 78 5f 5f 0a 20  fndef __unix__. 
6990: 20 20 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f         fatalErro
69a0: 72 28 22 74 69 6d 65 6f 75 74 20 69 73 20 6e 6f  r("timeout is no
69b0: 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 6e  t available on n
69c0: 6f 6e 2d 75 6e 69 78 20 73 79 73 74 65 6d 73 22  on-unix systems"
69d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
69e0: 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
69f0: 73 74 72 63 6d 70 28 7a 2c 22 76 65 72 62 6f 73  strcmp(z,"verbos
6a00: 65 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  e")==0 || strcmp
6a10: 28 7a 2c 22 76 22 29 3d 3d 30 20 29 7b 0a 20 20  (z,"v")==0 ){.  
6a20: 20 20 20 20 20 20 71 75 69 65 74 46 6c 61 67 20        quietFlag 
6a30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 76 65 72  = 0;.        ver
6a40: 62 6f 73 65 46 6c 61 67 2b 2b 3b 0a 20 20 20 20  boseFlag++;.    
6a50: 20 20 20 20 69 66 28 20 76 65 72 62 6f 73 65 46      if( verboseF
6a60: 6c 61 67 3e 31 20 29 20 72 75 6e 46 6c 61 67 73  lag>1 ) runFlags
6a70: 20 7c 3d 20 53 51 4c 5f 54 52 41 43 45 3b 0a 20   |= SQL_TRACE;. 
6a80: 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
6a90: 20 7b 0a 20 20 20 20 20 20 20 20 66 61 74 61 6c   {.        fatal
6aa0: 45 72 72 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f  Error("unknown o
6ab0: 70 74 69 6f 6e 3a 20 25 73 22 2c 20 61 72 67 76  ption: %s", argv
6ac0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
6ad0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
6ae0: 53 72 63 44 62 2b 2b 3b 0a 20 20 20 20 20 20 61  SrcDb++;.      a
6af0: 7a 53 72 63 44 62 20 3d 20 73 61 66 65 5f 72 65  zSrcDb = safe_re
6b00: 61 6c 6c 6f 63 28 61 7a 53 72 63 44 62 2c 20 6e  alloc(azSrcDb, n
6b10: 53 72 63 44 62 2a 73 69 7a 65 6f 66 28 61 7a 53  SrcDb*sizeof(azS
6b20: 72 63 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 20  rcDb[0]));.     
6b30: 20 61 7a 53 72 63 44 62 5b 6e 53 72 63 44 62 2d   azSrcDb[nSrcDb-
6b40: 31 5d 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20  1] = argv[i];.  
6b50: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53    }.  }.  if( nS
6b60: 72 63 44 62 3d 3d 30 20 29 20 66 61 74 61 6c 45  rcDb==0 ) fatalE
6b70: 72 72 6f 72 28 22 6e 6f 20 73 6f 75 72 63 65 20  rror("no source 
6b80: 64 61 74 61 62 61 73 65 20 73 70 65 63 69 66 69  database specifi
6b90: 65 64 22 29 3b 0a 20 20 69 66 28 20 6e 53 72 63  ed");.  if( nSrc
6ba0: 44 62 3e 31 20 29 7b 0a 20 20 20 20 69 66 28 20  Db>1 ){.    if( 
6bb0: 7a 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 66 61  zMsg ){.      fa
6bc0: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
6bd0: 20 63 68 61 6e 67 65 20 74 68 65 20 64 65 73 63   change the desc
6be0: 72 69 70 74 69 6f 6e 20 6f 66 20 6d 6f 72 65 20  ription of more 
6bf0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
6c00: 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e");.    }.    i
6c10: 66 28 20 7a 49 6e 73 53 71 6c 20 29 7b 0a 20 20  f( zInsSql ){.  
6c20: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
6c30: 63 61 6e 6e 6f 74 20 69 6d 70 6f 72 74 20 69 6e  cannot import in
6c40: 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
6c50: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
6c60: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f   }.  }..  /* Pro
6c70: 63 65 73 73 20 65 61 63 68 20 73 6f 75 72 63 65  cess each source
6c80: 20 64 61 74 61 62 61 73 65 20 73 65 70 61 72 61   database separa
6c90: 74 65 6c 79 20 2a 2f 0a 20 20 66 6f 72 28 69 53  tely */.  for(iS
6ca0: 72 63 44 62 3d 30 3b 20 69 53 72 63 44 62 3c 6e  rcDb=0; iSrcDb<n
6cb0: 53 72 63 44 62 3b 20 69 53 72 63 44 62 2b 2b 29  SrcDb; iSrcDb++)
6cc0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6cd0: 65 33 5f 6f 70 65 6e 28 61 7a 53 72 63 44 62 5b  e3_open(azSrcDb[
6ce0: 69 53 72 63 44 62 5d 2c 20 26 64 62 29 3b 0a 20  iSrcDb], &db);. 
6cf0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
6d00: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63     fatalError("c
6d10: 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63  annot open sourc
6d20: 65 20 64 61 74 61 62 61 73 65 20 25 73 20 2d 20  e database %s - 
6d30: 25 73 22 2c 0a 20 20 20 20 20 20 61 7a 53 72 63  %s",.      azSrc
6d40: 44 62 5b 69 53 72 63 44 62 5d 2c 20 73 71 6c 69  Db[iSrcDb], sqli
6d50: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
6d60: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
6d70: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
6d80: 0a 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20  .       "CREATE 
6d90: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
6da0: 53 54 53 20 64 62 28 5c 6e 22 0a 20 20 20 20 20  STS db(\n".     
6db0: 20 20 22 20 20 64 62 69 64 20 49 4e 54 45 47 45    "  dbid INTEGE
6dc0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 2d  R PRIMARY KEY, -
6dd0: 2d 20 64 61 74 61 62 61 73 65 20 69 64 5c 6e 22  - database id\n"
6de0: 0a 20 20 20 20 20 20 20 22 20 20 64 62 63 6f 6e  .       "  dbcon
6df0: 74 65 6e 74 20 42 4c 4f 42 20 20 20 20 20 20 20  tent BLOB       
6e00: 20 20 20 20 20 2d 2d 20 64 61 74 61 62 61 73 65       -- database
6e10: 20 64 69 73 6b 20 66 69 6c 65 20 69 6d 61 67 65   disk file image
6e20: 5c 6e 22 0a 20 20 20 20 20 20 20 22 29 3b 5c 6e  \n".       ");\n
6e30: 22 0a 20 20 20 20 20 20 20 22 43 52 45 41 54 45  ".       "CREATE
6e40: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
6e50: 49 53 54 53 20 78 73 71 6c 28 5c 6e 22 0a 20 20  ISTS xsql(\n".  
6e60: 20 20 20 20 20 22 20 20 73 71 6c 69 64 20 49 4e       "  sqlid IN
6e70: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6e80: 59 2c 20 20 20 2d 2d 20 53 51 4c 20 73 63 72 69  Y,   -- SQL scri
6e90: 70 74 20 69 64 5c 6e 22 0a 20 20 20 20 20 20 20  pt id\n".       
6ea0: 22 20 20 73 71 6c 74 65 78 74 20 54 45 58 54 20  "  sqltext TEXT 
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ec0: 2d 2d 20 54 65 78 74 20 6f 66 20 53 51 4c 20 73  -- Text of SQL s
6ed0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 72 75 6e  tatements to run
6ee0: 5c 6e 22 0a 20 20 20 20 20 20 20 22 29 3b 22 0a  \n".       ");".
6ef0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
6f00: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
6f10: 54 53 20 72 65 61 64 6d 65 28 5c 6e 22 0a 20 20  TS readme(\n".  
6f20: 20 20 20 20 20 22 20 20 6d 73 67 20 54 45 58 54       "  msg TEXT
6f30: 20 2d 2d 20 48 75 6d 61 6e 2d 72 65 61 64 61 62   -- Human-readab
6f40: 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  le description o
6f50: 66 20 74 68 69 73 20 66 69 6c 65 5c 6e 22 0a 20  f this file\n". 
6f60: 20 20 20 20 20 20 22 29 3b 22 2c 20 30 2c 20 30        ");", 0, 0
6f70: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
6f80: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63   ) fatalError("c
6f90: 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 73 63 68  annot create sch
6fa0: 65 6d 61 3a 20 25 73 22 2c 20 73 71 6c 69 74 65  ema: %s", sqlite
6fb0: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
6fc0: 20 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a 20     if( zMsg ){. 
6fd0: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b       char *zSql;
6fe0: 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
6ff0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44                "D
7010: 45 4c 45 54 45 20 46 52 4f 4d 20 72 65 61 64 6d  ELETE FROM readm
7020: 65 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 72  e; INSERT INTO r
7030: 65 61 64 6d 65 28 6d 73 67 29 20 56 41 4c 55 45  eadme(msg) VALUE
7040: 53 28 25 51 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  S(%Q)", zMsg);. 
7050: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7060: 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c  3_exec(db, zSql,
7070: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
7080: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
7090: 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ql);.      if( r
70a0: 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  c ) fatalError("
70b0: 63 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 64 65  cannot change de
70c0: 73 63 72 69 70 74 69 6f 6e 3a 20 25 73 22 2c 20  scription: %s", 
70d0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
70e0: 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  b));.    }.    i
70f0: 66 28 20 7a 49 6e 73 53 71 6c 20 29 7b 0a 20 20  f( zInsSql ){.  
7100: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
7110: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7120: 22 72 65 61 64 66 69 6c 65 22 2c 20 31 2c 20 53  "readfile", 1, S
7130: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 61               rea
7160: 64 66 69 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29  dfileFunc, 0, 0)
7170: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
7180: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7190: 64 62 2c 20 7a 49 6e 73 53 71 6c 2c 20 2d 31 2c  db, zInsSql, -1,
71a0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
71b0: 20 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61     if( rc ) fata
71c0: 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 70  lError("cannot p
71d0: 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74  repare statement
71e0: 20 5b 25 73 5d 3a 20 25 73 22 2c 0a 20 20 20 20   [%s]: %s",.    
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7200: 20 20 20 20 20 20 7a 49 6e 73 53 71 6c 2c 20 73        zInsSql, s
7210: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
7220: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
7230: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
7240: 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30  "BEGIN", 0, 0, 0
7250: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
7260: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61  ) fatalError("ca
7270: 6e 6e 6f 74 20 73 74 61 72 74 20 61 20 74 72 61  nnot start a tra
7280: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
7290: 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 49 6e    for(i=iFirstIn
72a0: 73 41 72 67 3b 20 69 3c 61 72 67 63 3b 20 69 2b  sArg; i<argc; i+
72b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
72c0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
72d0: 74 6d 74 2c 20 31 2c 20 61 72 67 76 5b 69 5d 2c  tmt, 1, argv[i],
72e0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
72f0: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  IC);.        sql
7300: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
7310: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
7320: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
7330: 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  mt);.        if(
7340: 20 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72   rc ) fatalError
7350: 28 22 69 6e 73 65 72 74 20 66 61 69 6c 65 64 20  ("insert failed 
7360: 66 6f 72 20 25 73 22 2c 20 61 72 67 76 5b 69 5d  for %s", argv[i]
7370: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7380: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
7390: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
73a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
73b0: 63 28 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  c(db, "COMMIT", 
73c0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
73d0: 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 45 72  if( rc ) fatalEr
73e0: 72 6f 72 28 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d  ror("cannot comm
73f0: 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
7400: 6f 6e 3a 20 25 73 22 2c 20 73 71 6c 69 74 65 33  on: %s", sqlite3
7410: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
7420: 20 20 20 20 72 65 62 75 69 6c 64 5f 64 61 74 61      rebuild_data
7430: 62 61 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20  base(db);.      
7440: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
7450: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7460: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
7470: 20 7a 45 78 70 44 62 21 3d 30 20 7c 7c 20 7a 45   zExpDb!=0 || zE
7480: 78 70 53 71 6c 21 3d 30 20 29 7b 0a 20 20 20 20  xpSql!=0 ){.    
7490: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
74a0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 77  _function(db, "w
74b0: 72 69 74 65 66 69 6c 65 22 2c 20 32 2c 20 53 51  ritefile", 2, SQ
74c0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
74f0: 65 66 69 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29  efileFunc, 0, 0)
7500: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 78 70  ;.      if( zExp
7510: 44 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db!=0 ){.       
7520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
7530: 44 62 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  Db = .          
7540: 22 53 45 4c 45 43 54 20 77 72 69 74 65 66 69 6c  "SELECT writefil
7550: 65 28 70 72 69 6e 74 66 28 27 25 73 2f 64 62 25  e(printf('%s/db%
7560: 30 36 64 2e 64 62 27 2c 3f 31 2c 64 62 69 64 29  06d.db',?1,dbid)
7570: 2c 64 62 63 6f 6e 74 65 6e 74 29 2c 22 0a 20 20  ,dbcontent),".  
7580: 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
7590: 64 62 69 64 2c 20 70 72 69 6e 74 66 28 27 25 73  dbid, printf('%s
75a0: 2f 64 62 25 30 36 64 2e 64 62 27 2c 3f 31 2c 64  /db%06d.db',?1,d
75b0: 62 69 64 29 2c 20 6c 65 6e 67 74 68 28 64 62 63  bid), length(dbc
75c0: 6f 6e 74 65 6e 74 29 22 0a 20 20 20 20 20 20 20  ontent)".       
75d0: 20 20 20 22 20 20 46 52 4f 4d 20 64 62 20 57 48     "  FROM db WH
75e0: 45 52 45 20 3f 32 3c 30 20 4f 52 20 64 62 69 64  ERE ?2<0 OR dbid
75f0: 3d 3f 32 3b 22 3b 0a 20 20 20 20 20 20 20 20 72  =?2;";.        r
7600: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
7610: 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 78 44 62  are_v2(db, zExDb
7620: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
7630: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
7640: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63   ) fatalError("c
7650: 61 6e 6e 6f 74 20 70 72 65 70 61 72 65 20 73 74  annot prepare st
7660: 61 74 65 6d 65 6e 74 20 5b 25 73 5d 3a 20 25 73  atement [%s]: %s
7670: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
7690: 45 78 44 62 2c 20 73 71 6c 69 74 65 33 5f 65 72  ExDb, sqlite3_er
76a0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
76b0: 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
76c0: 74 65 78 74 36 34 28 70 53 74 6d 74 2c 20 31 2c  text64(pStmt, 1,
76d0: 20 7a 45 78 70 44 62 2c 20 73 74 72 6c 65 6e 28   zExpDb, strlen(
76e0: 7a 45 78 70 44 62 29 2c 0a 20 20 20 20 20 20 20  zExpDb),.       
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7700: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54       SQLITE_STAT
7710: 49 43 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  IC, SQLITE_UTF8)
7720: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7730: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
7740: 2c 20 32 2c 20 6f 6e 6c 79 44 62 69 64 29 3b 0a  , 2, onlyDbid);.
7750: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73          while( s
7760: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
7770: 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
7780: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e  {.          prin
7790: 74 66 28 22 77 72 69 74 65 20 64 62 2d 25 64 20  tf("write db-%d 
77a0: 28 25 64 20 62 79 74 65 73 29 20 69 6e 74 6f 20  (%d bytes) into 
77b0: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
77c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
77d0: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 2c  mn_int(pStmt,1),
77e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
77f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
7800: 28 70 53 74 6d 74 2c 33 29 2c 0a 20 20 20 20 20  (pStmt,3),.     
7810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7820: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
7830: 74 2c 32 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  t,2));.        }
7840: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7850: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
7860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7870: 69 66 28 20 7a 45 78 70 53 71 6c 21 3d 30 20 29  if( zExpSql!=0 )
7880: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
7890: 63 68 61 72 20 2a 7a 45 78 53 71 6c 20 3d 20 0a  char *zExSql = .
78a0: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
78b0: 54 20 77 72 69 74 65 66 69 6c 65 28 70 72 69 6e  T writefile(prin
78c0: 74 66 28 27 25 73 2f 73 71 6c 25 30 36 64 2e 74  tf('%s/sql%06d.t
78d0: 78 74 27 2c 3f 31 2c 73 71 6c 69 64 29 2c 73 71  xt',?1,sqlid),sq
78e0: 6c 74 65 78 74 29 2c 22 0a 20 20 20 20 20 20 20  ltext),".       
78f0: 20 20 20 22 20 20 20 20 20 20 20 73 71 6c 69 64     "       sqlid
7900: 2c 20 70 72 69 6e 74 66 28 27 25 73 2f 73 71 6c  , printf('%s/sql
7910: 25 30 36 64 2e 74 78 74 27 2c 3f 31 2c 73 71 6c  %06d.txt',?1,sql
7920: 69 64 29 2c 20 6c 65 6e 67 74 68 28 73 71 6c 74  id), length(sqlt
7930: 65 78 74 29 22 0a 20 20 20 20 20 20 20 20 20 20  ext)".          
7940: 22 20 20 46 52 4f 4d 20 78 73 71 6c 20 57 48 45  "  FROM xsql WHE
7950: 52 45 20 3f 32 3c 30 20 4f 52 20 73 71 6c 69 64  RE ?2<0 OR sqlid
7960: 3d 3f 32 3b 22 3b 0a 20 20 20 20 20 20 20 20 72  =?2;";.        r
7970: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
7980: 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 78 53 71  are_v2(db, zExSq
7990: 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
79a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
79b0: 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  c ) fatalError("
79c0: 63 61 6e 6e 6f 74 20 70 72 65 70 61 72 65 20 73  cannot prepare s
79d0: 74 61 74 65 6d 65 6e 74 20 5b 25 73 5d 3a 20 25  tatement [%s]: %
79e0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 7a 45 78 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f  zExSql, sqlite3_
7a10: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
7a20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
7a30: 64 5f 74 65 78 74 36 34 28 70 53 74 6d 74 2c 20  d_text64(pStmt, 
7a40: 31 2c 20 7a 45 78 70 53 71 6c 2c 20 73 74 72 6c  1, zExpSql, strl
7a50: 65 6e 28 7a 45 78 70 53 71 6c 29 2c 0a 20 20 20  en(zExpSql),.   
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
7a80: 53 54 41 54 49 43 2c 20 53 51 4c 49 54 45 5f 55  STATIC, SQLITE_U
7a90: 54 46 38 29 3b 0a 20 20 20 20 20 20 20 20 73 71  TF8);.        sq
7aa0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
7ab0: 53 74 6d 74 2c 20 32 2c 20 6f 6e 6c 79 53 71 6c  Stmt, 2, onlySql
7ac0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  id);.        whi
7ad0: 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
7ae0: 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
7af0: 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ROW ){.         
7b00: 20 70 72 69 6e 74 66 28 22 77 72 69 74 65 20 73   printf("write s
7b10: 71 6c 2d 25 64 20 28 25 64 20 62 79 74 65 73 29  ql-%d (%d bytes)
7b20: 20 69 6e 74 6f 20 25 73 5c 6e 22 2c 0a 20 20 20   into %s\n",.   
7b30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7b40: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
7b50: 6d 74 2c 31 29 2c 0a 20 20 20 20 20 20 20 20 20  mt,1),.         
7b60: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
7b70: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 33 29 2c  mn_int(pStmt,3),
7b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
7b90: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
7ba0: 74 28 70 53 74 6d 74 2c 32 29 29 3b 0a 20 20 20  t(pStmt,2));.   
7bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
7bc0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
7bd0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pStmt);.      }.
7be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
7bf0: 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20 72  ose(db);.      r
7c00: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
7c10: 20 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 61 6c   .    /* Load al
7c20: 6c 20 53 51 4c 20 73 63 72 69 70 74 20 63 6f 6e  l SQL script con
7c30: 74 65 6e 74 20 61 6e 64 20 61 6c 6c 20 69 6e 69  tent and all ini
7c40: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 69 6d  tial database im
7c50: 61 67 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ages from the.  
7c60: 20 20 2a 2a 20 73 6f 75 72 63 65 20 64 62 0a 20    ** source db. 
7c70: 20 20 20 2a 2f 0a 20 20 20 20 62 6c 6f 62 4c 69     */.    blobLi
7c80: 73 74 4c 6f 61 64 46 72 6f 6d 44 62 28 64 62 2c  stLoadFromDb(db,
7c90: 20 22 53 45 4c 45 43 54 20 73 71 6c 69 64 2c 20   "SELECT sqlid, 
7ca0: 73 71 6c 74 65 78 74 20 46 52 4f 4d 20 78 73 71  sqltext FROM xsq
7cb0: 6c 22 2c 20 6f 6e 6c 79 53 71 6c 69 64 2c 0a 20  l", onlySqlid,. 
7cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cd0: 20 20 20 20 20 20 20 20 20 20 26 67 2e 6e 53 71            &g.nSq
7ce0: 6c 2c 20 26 67 2e 70 46 69 72 73 74 53 71 6c 29  l, &g.pFirstSql)
7cf0: 3b 0a 20 20 20 20 69 66 28 20 67 2e 6e 53 71 6c  ;.    if( g.nSql
7d00: 3d 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72  ==0 ) fatalError
7d10: 28 22 6e 65 65 64 20 61 74 20 6c 65 61 73 74 20  ("need at least 
7d20: 6f 6e 65 20 53 51 4c 20 73 63 72 69 70 74 22 29  one SQL script")
7d30: 3b 0a 20 20 20 20 62 6c 6f 62 4c 69 73 74 4c 6f  ;.    blobListLo
7d40: 61 64 46 72 6f 6d 44 62 28 64 62 2c 20 22 53 45  adFromDb(db, "SE
7d50: 4c 45 43 54 20 64 62 69 64 2c 20 64 62 63 6f 6e  LECT dbid, dbcon
7d60: 74 65 6e 74 20 46 52 4f 4d 20 64 62 22 2c 20 6f  tent FROM db", o
7d70: 6e 6c 79 44 62 69 64 2c 0a 20 20 20 20 20 20 20  nlyDbid,.       
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 26 67 2e 6e 44 62 2c 20 26 67 2e 70 46 69 72 73  &g.nDb, &g.pFirs
7da0: 74 44 62 29 3b 0a 20 20 20 20 69 66 28 20 67 2e  tDb);.    if( g.
7db0: 6e 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nDb==0 ){.      
7dc0: 67 2e 70 46 69 72 73 74 44 62 20 3d 20 73 61 66  g.pFirstDb = saf
7dd0: 65 5f 72 65 61 6c 6c 6f 63 28 30 2c 20 73 69 7a  e_realloc(0, siz
7de0: 65 6f 66 28 42 6c 6f 62 29 29 3b 0a 20 20 20 20  eof(Blob));.    
7df0: 20 20 6d 65 6d 73 65 74 28 67 2e 70 46 69 72 73    memset(g.pFirs
7e00: 74 44 62 2c 20 30 2c 20 73 69 7a 65 6f 66 28 42  tDb, 0, sizeof(B
7e10: 6c 6f 62 29 29 3b 0a 20 20 20 20 20 20 67 2e 70  lob));.      g.p
7e20: 46 69 72 73 74 44 62 2d 3e 69 64 20 3d 20 31 3b  FirstDb->id = 1;
7e30: 0a 20 20 20 20 20 20 67 2e 70 46 69 72 73 74 44  .      g.pFirstD
7e40: 62 2d 3e 73 65 71 20 3d 20 30 3b 0a 20 20 20 20  b->seq = 0;.    
7e50: 20 20 67 2e 6e 44 62 20 3d 20 31 3b 0a 20 20 20    g.nDb = 1;.   
7e60: 20 20 20 73 71 6c 46 75 7a 7a 20 3d 20 31 3b 0a     sqlFuzz = 1;.
7e70: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
7e80: 50 72 69 6e 74 20 74 68 65 20 64 65 73 63 72 69  Print the descri
7e90: 70 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ption, if there 
7ea0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 69 66  is one */.    if
7eb0: 28 20 21 71 75 69 65 74 46 6c 61 67 20 29 7b 0a  ( !quietFlag ){.
7ec0: 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20        zDbName = 
7ed0: 61 7a 53 72 63 44 62 5b 69 53 72 63 44 62 5d 3b  azSrcDb[iSrcDb];
7ee0: 0a 20 20 20 20 20 20 69 20 3d 20 28 69 6e 74 29  .      i = (int)
7ef0: 73 74 72 6c 65 6e 28 7a 44 62 4e 61 6d 65 29 20  strlen(zDbName) 
7f00: 2d 20 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  - 1;.      while
7f10: 28 20 69 3e 30 20 26 26 20 7a 44 62 4e 61 6d 65  ( i>0 && zDbName
7f20: 5b 69 2d 31 5d 21 3d 27 2f 27 20 26 26 20 7a 44  [i-1]!='/' && zD
7f30: 62 4e 61 6d 65 5b 69 2d 31 5d 21 3d 27 5c 5c 27  bName[i-1]!='\\'
7f40: 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
7f50: 20 7a 44 62 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20   zDbName += i;. 
7f60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65       sqlite3_pre
7f70: 70 61 72 65 5f 76 32 28 64 62 2c 20 22 53 45 4c  pare_v2(db, "SEL
7f80: 45 43 54 20 6d 73 67 20 46 52 4f 4d 20 72 65 61  ECT msg FROM rea
7f90: 64 6d 65 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74  dme", -1, &pStmt
7fa0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
7fb0: 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33  pStmt && sqlite3
7fc0: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
7fd0: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
7fe0: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 3a 20      printf("%s: 
7ff0: 25 73 5c 6e 22 2c 20 7a 44 62 4e 61 6d 65 2c 20  %s\n", zDbName, 
8000: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
8010: 65 78 74 28 70 53 74 6d 74 2c 30 29 29 3b 0a 20  ext(pStmt,0));. 
8020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
8030: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
8040: 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  tmt);.    }..   
8050: 20 2f 2a 20 52 65 62 75 69 6c 64 20 74 68 65 20   /* Rebuild the 
8060: 64 61 74 61 62 61 73 65 2c 20 69 66 20 72 65 71  database, if req
8070: 75 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69 66  uested */.    if
8080: 28 20 72 65 62 75 69 6c 64 46 6c 61 67 20 29 7b  ( rebuildFlag ){
8090: 0a 20 20 20 20 20 20 69 66 28 20 21 71 75 69 65  .      if( !quie
80a0: 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  tFlag ){.       
80b0: 20 70 72 69 6e 74 66 28 22 25 73 3a 20 72 65 62   printf("%s: reb
80c0: 75 69 6c 64 69 6e 67 2e 2e 2e 20 22 2c 20 7a 44  uilding... ", zD
80d0: 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
80e0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
80f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
8100: 62 75 69 6c 64 5f 64 61 74 61 62 61 73 65 28 64  build_database(d
8110: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 71  b);.      if( !q
8120: 75 69 65 74 46 6c 61 67 20 29 20 70 72 69 6e 74  uietFlag ) print
8130: 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 20  f("done\n");.   
8140: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6c 6f   }.  .    /* Clo
8150: 73 65 20 74 68 65 20 73 6f 75 72 63 65 20 64 61  se the source da
8160: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
8170: 74 68 61 74 20 6e 6f 20 53 51 4c 69 74 65 20 6d  that no SQLite m
8180: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
8190: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 6f 75 74  s are.    ** out
81a0: 73 74 61 6e 64 69 6e 67 2e 0a 20 20 20 20 2a 2f  standing..    */
81b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
81c0: 73 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  se(db);.    if( 
81d0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
81e0: 73 65 64 28 29 3e 30 20 29 7b 0a 20 20 20 20 20  sed()>0 ){.     
81f0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 53 51 4c   fatalError("SQL
8200: 69 74 65 20 68 61 73 20 6d 65 6d 6f 72 79 20 69  ite has memory i
8210: 6e 20 75 73 65 20 62 65 66 6f 72 65 20 74 68 65  n use before the
8220: 20 73 74 61 72 74 20 6f 66 20 74 65 73 74 69 6e   start of testin
8230: 67 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  g");.    }..    
8240: 2f 2a 20 4c 69 6d 69 74 20 61 76 61 69 6c 61 62  /* Limit availab
8250: 6c 65 20 6d 65 6d 6f 72 79 2c 20 69 66 20 72 65  le memory, if re
8260: 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 20 20 69  quested */.    i
8270: 66 28 20 6e 4d 65 6d 3e 30 20 29 7b 0a 20 20 20  f( nMem>0 ){.   
8280: 20 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64     sqlite3_shutd
8290: 6f 77 6e 28 29 3b 0a 20 20 20 20 20 20 70 48 65  own();.      pHe
82a0: 61 70 20 3d 20 6d 61 6c 6c 6f 63 28 6e 4d 65 6d  ap = malloc(nMem
82b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 65  );.      if( pHe
82c0: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
82d0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 66 61 69   fatalError("fai
82e0: 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  led to allocate 
82f0: 25 64 20 62 79 74 65 73 20 6f 66 20 68 65 61 70  %d bytes of heap
8300: 20 6d 65 6d 6f 72 79 22 2c 20 6e 4d 65 6d 29 3b   memory", nMem);
8310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
8320: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
8330: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50  LITE_CONFIG_HEAP
8340: 2c 20 70 48 65 61 70 2c 20 6e 4d 65 6d 2c 20 31  , pHeap, nMem, 1
8350: 32 38 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  28);.    }.  .  
8360: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
8370: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 76 69 72 74  e in-memory virt
8380: 75 61 6c 20 66 69 6c 65 73 79 73 74 65 6d 0a 20  ual filesystem. 
8390: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 6d 61 74     */.    format
83a0: 56 66 73 28 29 3b 0a 20 20 20 20 69 6e 6d 65 6d  Vfs();.    inmem
83b0: 56 66 73 52 65 67 69 73 74 65 72 28 29 3b 0a 20  VfsRegister();. 
83c0: 20 20 20 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61     .    /* Run a
83d0: 20 74 65 73 74 20 75 73 69 6e 67 20 65 61 63 68   test using each
83e0: 20 53 51 4c 20 73 63 72 69 70 74 20 61 67 61 69   SQL script agai
83f0: 6e 73 74 20 65 61 63 68 20 64 61 74 61 62 61 73  nst each databas
8400: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
8410: 28 20 21 76 65 72 62 6f 73 65 46 6c 61 67 20 26  ( !verboseFlag &
8420: 26 20 21 71 75 69 65 74 46 6c 61 67 20 29 20 70  & !quietFlag ) p
8430: 72 69 6e 74 66 28 22 25 73 3a 22 2c 20 7a 44 62  rintf("%s:", zDb
8440: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  Name);.    for(p
8450: 53 71 6c 3d 67 2e 70 46 69 72 73 74 53 71 6c 3b  Sql=g.pFirstSql;
8460: 20 70 53 71 6c 3b 20 70 53 71 6c 3d 70 53 71 6c   pSql; pSql=pSql
8470: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
8480: 66 6f 72 28 70 44 62 3d 67 2e 70 46 69 72 73 74  for(pDb=g.pFirst
8490: 44 62 3b 20 70 44 62 3b 20 70 44 62 3d 70 44 62  Db; pDb; pDb=pDb
84a0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
84b0: 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b    int openFlags;
84c0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
84d0: 68 61 72 20 2a 7a 56 66 73 20 3d 20 22 69 6e 6d  har *zVfs = "inm
84e0: 65 6d 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em";.        sql
84f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
8500: 7a 65 6f 66 28 67 2e 7a 54 65 73 74 4e 61 6d 65  zeof(g.zTestName
8510: 29 2c 20 67 2e 7a 54 65 73 74 4e 61 6d 65 2c 20  ), g.zTestName, 
8520: 22 73 71 6c 69 64 3d 25 64 2c 64 62 69 64 3d 25  "sqlid=%d,dbid=%
8530: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 71               pSq
8550: 6c 2d 3e 69 64 2c 20 70 44 62 2d 3e 69 64 29 3b  l->id, pDb->id);
8560: 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 65 72  .        if( ver
8570: 62 6f 73 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  boseFlag ){.    
8580: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 73        printf("%s
8590: 5c 6e 22 2c 20 67 2e 7a 54 65 73 74 4e 61 6d 65  \n", g.zTestName
85a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 66 6c  );.          ffl
85b0: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
85c0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
85d0: 71 75 69 65 74 46 6c 61 67 20 29 7b 0a 20 20 20  quietFlag ){.   
85e0: 20 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e         static in
85f0: 74 20 70 72 65 76 41 6d 74 20 3d 20 2d 31 3b 0a  t prevAmt = -1;.
8600: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 64            int id
8610: 78 20 3d 20 70 53 71 6c 2d 3e 73 65 71 2a 67 2e  x = pSql->seq*g.
8620: 6e 44 62 20 2b 20 70 44 62 2d 3e 69 64 20 2d 20  nDb + pDb->id - 
8630: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  1;.          int
8640: 20 61 6d 74 20 3d 20 69 64 78 2a 31 30 2f 28 67   amt = idx*10/(g
8650: 2e 6e 44 62 2a 67 2e 6e 53 71 6c 29 3b 0a 20 20  .nDb*g.nSql);.  
8660: 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 21          if( amt!
8670: 3d 70 72 65 76 41 6d 74 20 29 7b 0a 20 20 20 20  =prevAmt ){.    
8680: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
8690: 20 25 64 25 25 22 2c 20 61 6d 74 2a 31 30 29 3b   %d%%", amt*10);
86a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 66 6c  .            ffl
86b0: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
86c0: 20 20 20 20 20 20 20 20 20 70 72 65 76 41 6d 74           prevAmt
86d0: 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
86e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
86f0: 20 20 20 20 20 20 63 72 65 61 74 65 56 46 69 6c        createVFil
8700: 65 28 22 6d 61 69 6e 2e 64 62 22 2c 20 70 44 62  e("main.db", pDb
8710: 2d 3e 73 7a 2c 20 70 44 62 2d 3e 61 29 3b 0a 20  ->sz, pDb->a);. 
8720: 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73         openFlags
8730: 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   = SQLITE_OPEN_C
8740: 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
8750: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
8760: 20 20 20 20 20 20 20 69 66 28 20 6e 61 74 69 76         if( nativ
8770: 65 46 6c 61 67 20 26 26 20 70 44 62 2d 3e 73 7a  eFlag && pDb->sz
8780: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8790: 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 53 51   openFlags |= SQ
87a0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
87b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 56 66 73  ;.          zVfs
87c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
87d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
87e0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 22 6d 61  ite3_open_v2("ma
87f0: 69 6e 2e 64 62 22 2c 20 26 64 62 2c 20 6f 70 65  in.db", &db, ope
8800: 6e 46 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20  nFlags, zVfs);. 
8810: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
8820: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
8830: 6f 74 20 6f 70 65 6e 20 69 6e 6d 65 6d 20 64 61  ot open inmem da
8840: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
8850: 20 20 69 66 28 20 63 65 6c 6c 53 7a 43 6b 46 6c    if( cellSzCkFl
8860: 61 67 20 29 20 72 75 6e 53 71 6c 28 64 62 2c 20  ag ) runSql(db, 
8870: 22 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a  "PRAGMA cell_siz
8880: 65 5f 63 68 65 63 6b 3d 4f 4e 22 2c 20 72 75 6e  e_check=ON", run
8890: 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  Flags);.        
88a0: 73 65 74 41 6c 61 72 6d 28 69 54 69 6d 65 6f 75  setAlarm(iTimeou
88b0: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
88c0: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
88d0: 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20 20  _CALLBACK.      
88e0: 20 20 69 66 28 20 73 71 6c 46 75 7a 7a 20 7c 7c    if( sqlFuzz ||
88f0: 20 76 64 62 65 4c 69 6d 69 74 46 6c 61 67 20 29   vdbeLimitFlag )
8900: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8910: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
8920: 64 6c 65 72 28 64 62 2c 20 31 30 30 30 30 30 2c  dler(db, 100000,
8930: 20 70 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72   progressHandler
8940: 2c 20 26 76 64 62 65 4c 69 6d 69 74 46 6c 61 67  , &vdbeLimitFlag
8950: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
8960: 64 69 66 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a  dif.        do{.
8970: 20 20 20 20 20 20 20 20 20 20 72 75 6e 53 71 6c            runSql
8980: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 71 6c  (db, (char*)pSql
8990: 2d 3e 61 2c 20 72 75 6e 46 6c 61 67 73 29 3b 0a  ->a, runFlags);.
89a0: 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20          }while( 
89b0: 74 69 6d 65 6f 75 74 54 65 73 74 20 29 3b 0a 20  timeoutTest );. 
89c0: 20 20 20 20 20 20 20 73 65 74 41 6c 61 72 6d 28         setAlarm(
89d0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
89e0: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
89f0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
8a00: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
8a10: 3e 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  >0 ) fatalError(
8a20: 22 6d 65 6d 6f 72 79 20 6c 65 61 6b 22 29 3b 0a  "memory leak");.
8a30: 20 20 20 20 20 20 20 20 72 65 66 6f 72 6d 61 74          reformat
8a40: 56 66 73 28 29 3b 0a 20 20 20 20 20 20 20 20 6e  Vfs();.        n
8a50: 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Test++;.        
8a60: 67 2e 7a 54 65 73 74 4e 61 6d 65 5b 30 5d 20 3d  g.zTestName[0] =
8a70: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
8a80: 53 69 6d 75 6c 61 74 65 20 61 6e 20 65 72 72 6f  Simulate an erro
8a90: 72 20 69 66 20 74 68 65 20 54 45 53 54 5f 46 41  r if the TEST_FA
8aa0: 49 4c 55 52 45 20 65 6e 76 69 72 6f 6e 6d 65 6e  ILURE environmen
8ab0: 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 22 35  t variable is "5
8ac0: 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  "..        ** Th
8ad0: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 76 65  is is used to ve
8ae0: 72 69 66 79 20 74 68 61 74 20 61 75 74 6f 6d 61  rify that automa
8af0: 74 65 64 20 74 65 73 74 20 73 63 72 69 70 74 20  ted test script 
8b00: 72 65 61 6c 6c 79 20 64 6f 20 73 70 6f 74 0a 20  really do spot. 
8b10: 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
8b20: 20 74 68 61 74 20 6f 63 63 75 72 20 69 6e 20 74   that occur in t
8b30: 68 69 73 20 74 65 73 74 20 70 72 6f 67 72 61 6d  his test program
8b40: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
8b50: 20 20 20 20 20 69 66 28 20 7a 46 61 69 6c 43 6f       if( zFailCo
8b60: 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
8b70: 69 66 28 20 7a 46 61 69 6c 43 6f 64 65 5b 30 5d  if( zFailCode[0]
8b80: 3d 3d 27 35 27 20 26 26 20 7a 46 61 69 6c 43 6f  =='5' && zFailCo
8b90: 64 65 5b 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  de[1]==0 ){.    
8ba0: 20 20 20 20 20 20 20 20 66 61 74 61 6c 45 72 72          fatalErr
8bb0: 6f 72 28 22 73 69 6d 75 6c 61 74 65 64 20 66 61  or("simulated fa
8bc0: 69 6c 75 72 65 22 29 3b 0a 20 20 20 20 20 20 20  ilure");.       
8bd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 46 61     }else if( zFa
8be0: 69 6c 43 6f 64 65 5b 30 5d 21 3d 30 20 29 7b 0a  ilCode[0]!=0 ){.
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8c00: 66 20 54 45 53 54 5f 46 41 49 4c 55 52 45 20 69  f TEST_FAILURE i
8c10: 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
8c20: 72 20 74 68 61 6e 20 35 2c 20 6a 75 73 74 20 65  r than 5, just e
8c30: 78 69 74 20 74 68 65 20 74 65 73 74 0a 20 20 20  xit the test.   
8c40: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 61 72 6c           ** earl
8c50: 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  y */.           
8c60: 20 70 72 69 6e 74 66 28 22 5c 6e 45 78 69 74 20   printf("\nExit 
8c70: 65 61 72 6c 79 20 64 75 65 20 74 6f 20 54 45 53  early due to TES
8c80: 54 5f 46 41 49 4c 55 52 45 20 62 65 69 6e 67 20  T_FAILURE being 
8c90: 73 65 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  set\n");.       
8ca0: 20 20 20 20 20 69 53 72 63 44 62 20 3d 20 6e 53       iSrcDb = nS
8cb0: 72 63 44 62 2d 31 3b 0a 20 20 20 20 20 20 20 20  rcDb-1;.        
8cc0: 20 20 20 20 67 6f 74 6f 20 73 6f 75 72 63 65 64      goto sourced
8cd0: 62 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  b_cleanup;.     
8ce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8cf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8d00: 20 20 20 69 66 28 20 21 71 75 69 65 74 46 6c 61     if( !quietFla
8d10: 67 20 26 26 20 21 76 65 72 62 6f 73 65 46 6c 61  g && !verboseFla
8d20: 67 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  g ){.      print
8d30: 66 28 22 20 31 30 30 25 25 20 2d 20 25 64 20 74  f(" 100%% - %d t
8d40: 65 73 74 73 5c 6e 22 2c 20 67 2e 6e 44 62 2a 67  ests\n", g.nDb*g
8d50: 2e 6e 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  .nSql);.    }.  
8d60: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  .    /* Clean up
8d70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
8d80: 72 6f 63 65 73 73 69 6e 67 20 61 20 73 69 6e 67  rocessing a sing
8d90: 6c 65 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  le source databa
8da0: 73 65 0a 20 20 20 20 2a 2f 0a 20 20 73 6f 75 72  se.    */.  sour
8db0: 63 65 64 62 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  cedb_cleanup:.  
8dc0: 20 20 62 6c 6f 62 4c 69 73 74 46 72 65 65 28 67    blobListFree(g
8dd0: 2e 70 46 69 72 73 74 53 71 6c 29 3b 0a 20 20 20  .pFirstSql);.   
8de0: 20 62 6c 6f 62 4c 69 73 74 46 72 65 65 28 67 2e   blobListFree(g.
8df0: 70 46 69 72 73 74 44 62 29 3b 0a 20 20 20 20 72  pFirstDb);.    r
8e00: 65 66 6f 72 6d 61 74 56 66 73 28 29 3b 0a 20 0a  eformatVfs();. .
8e10: 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
8e20: 6f 76 65 72 20 61 6c 6c 20 73 6f 75 72 63 65 20  over all source 
8e30: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 0a 20 20  databases */..  
8e40: 69 66 28 20 21 71 75 69 65 74 46 6c 61 67 20 29  if( !quietFlag )
8e50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
8e60: 74 36 34 20 69 45 6c 61 70 73 65 20 3d 20 74 69  t64 iElapse = ti
8e70: 6d 65 4f 66 44 61 79 28 29 20 2d 20 69 42 65 67  meOfDay() - iBeg
8e80: 69 6e 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  in;.    printf("
8e90: 66 75 7a 7a 63 68 65 63 6b 3a 20 30 20 65 72 72  fuzzcheck: 0 err
8ea0: 6f 72 73 20 6f 75 74 20 6f 66 20 25 64 20 74 65  ors out of %d te
8eb0: 73 74 73 20 69 6e 20 25 64 2e 25 30 33 64 20 73  sts in %d.%03d s
8ec0: 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 20 20 20 20  econds\n".      
8ed0: 20 20 20 20 20 22 53 51 4c 69 74 65 20 25 73 20       "SQLite %s 
8ee0: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
8ef0: 20 20 6e 54 65 73 74 2c 20 28 69 6e 74 29 28 69    nTest, (int)(i
8f00: 45 6c 61 70 73 65 2f 31 30 30 30 29 2c 20 28 69  Elapse/1000), (i
8f10: 6e 74 29 28 69 45 6c 61 70 73 65 25 31 30 30 30  nt)(iElapse%1000
8f20: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71  ),.           sq
8f30: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
8f40: 28 29 2c 20 73 71 6c 69 74 65 33 5f 73 6f 75 72  (), sqlite3_sour
8f50: 63 65 69 64 28 29 29 3b 0a 20 20 7d 0a 20 20 66  ceid());.  }.  f
8f60: 72 65 65 28 61 7a 53 72 63 44 62 29 3b 0a 20 20  ree(azSrcDb);.  
8f70: 66 72 65 65 28 70 48 65 61 70 29 3b 0a 20 20 72  free(pHeap);.  r
8f80: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.