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

Artifact ee926f1d4090d053ed542899720d4e4d30811bcc:


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: 64 65 66 69 6e 65 20 49 53 53 50 41 43 45 28 58  define ISSPACE(X
0b40: 29 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ) isspace((unsig
0b50: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
0b60: 65 66 69 6e 65 20 49 53 44 49 47 49 54 28 58 29  efine ISDIGIT(X)
0b70: 20 69 73 64 69 67 69 74 28 28 75 6e 73 69 67 6e   isdigit((unsign
0b80: 65 64 20 63 68 61 72 29 28 58 29 29 0a 0a 0a 23  ed char)(X))...#
0b90: 69 66 64 65 66 20 5f 5f 75 6e 69 78 5f 5f 0a 23  ifdef __unix__.#
0ba0: 20 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61 6c   include <signal
0bb0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75  .h>.# include <u
0bc0: 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a  nistd.h>.#endif.
0bd0: 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 73 20 69 6e 20  ./*.** Files in 
0be0: 74 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  the virtual file
0bf0: 20 73 79 73 74 65 6d 2e 0a 2a 2f 0a 74 79 70 65   system..*/.type
0c00: 64 65 66 20 73 74 72 75 63 74 20 56 46 69 6c 65  def struct VFile
0c10: 20 56 46 69 6c 65 3b 0a 73 74 72 75 63 74 20 56   VFile;.struct V
0c20: 46 69 6c 65 20 7b 0a 20 20 63 68 61 72 20 2a 7a  File {.  char *z
0c30: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
0c40: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 2e 20 20 4e   /* Filename.  N
0c50: 55 4c 4c 20 66 6f 72 20 64 65 6c 65 74 65 2d 6f  ULL for delete-o
0c60: 6e 2d 63 6c 6f 73 65 2e 20 46 72 6f 6d 20 6d 61  n-close. From ma
0c70: 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 69 6e 74 20  lloc() */.  int 
0c80: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
0c90: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
0ca0: 68 65 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  he file in bytes
0cb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0cd0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   Number of refer
0ce0: 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 66 69  ences to this fi
0cf0: 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
0d00: 20 63 68 61 72 20 2a 61 3b 20 20 20 20 20 20 20   char *a;       
0d10: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
0d20: 65 20 66 69 6c 65 2e 20 20 46 72 6f 6d 20 6d 61  e file.  From ma
0d30: 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 74 79 70  lloc() */.};.typ
0d40: 65 64 65 66 20 73 74 72 75 63 74 20 56 48 61 6e  edef struct VHan
0d50: 64 6c 65 20 56 48 61 6e 64 6c 65 3b 0a 73 74 72  dle VHandle;.str
0d60: 75 63 74 20 56 48 61 6e 64 6c 65 20 7b 0a 20 20  uct VHandle {.  
0d70: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73  sqlite3_file bas
0d80: 65 3b 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20  e;      /* Base 
0d90: 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65 20  class.  Must be 
0da0: 66 69 72 73 74 20 2a 2f 0a 20 20 56 46 69 6c 65  first */.  VFile
0db0: 20 2a 70 56 46 69 6c 65 3b 20 20 20 20 20 20 20   *pVFile;       
0dc0: 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
0dd0: 79 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  ying file */.};.
0de0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ./*.** The value
0df0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 66   of a database f
0e00: 69 6c 65 20 74 65 6d 70 6c 61 74 65 2c 20 6f 72  ile template, or
0e10: 20 6f 66 20 61 6e 20 53 51 4c 20 73 63 72 69 70   of an SQL scrip
0e20: 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  t.*/.typedef str
0e30: 75 63 74 20 42 6c 6f 62 20 42 6c 6f 62 3b 0a 73  uct Blob Blob;.s
0e40: 74 72 75 63 74 20 42 6c 6f 62 20 7b 0a 20 20 42  truct Blob {.  B
0e50: 6c 6f 62 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  lob *pNext;     
0e60: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
0e70: 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  n a list */.  in
0e80: 74 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  t id;           
0e90: 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
0ea0: 68 69 73 20 42 6c 6f 62 20 2a 2f 0a 20 20 69 6e  his Blob */.  in
0eb0: 74 20 73 65 71 3b 20 20 20 20 20 20 20 20 20 20  t seq;          
0ec0: 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 63        /* Sequenc
0ed0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
0ee0: 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
0ef0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
0f00: 20 74 68 69 73 20 42 6c 6f 62 20 69 6e 20 62 79   this Blob in by
0f10: 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  tes */.  unsigne
0f20: 64 20 63 68 61 72 20 61 5b 31 5d 3b 20 20 20 20  d char a[1];    
0f30: 20 2f 2a 20 42 6c 6f 62 20 63 6f 6e 74 65 6e 74   /* Blob content
0f40: 2e 20 20 45 78 74 72 61 20 73 70 61 63 65 20 61  .  Extra space a
0f50: 6c 6c 6f 63 61 74 65 64 20 61 73 20 6e 65 65 64  llocated as need
0f60: 65 64 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ed. */.};../*.**
0f70: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
0f80: 6f 66 20 66 69 6c 65 73 20 69 6e 20 74 68 65 20  of files in the 
0f90: 69 6e 2d 6d 65 6d 6f 72 79 20 76 69 72 74 75 61  in-memory virtua
0fa0: 6c 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2f  l filesystem..*/
0fb0: 0a 23 64 65 66 69 6e 65 20 4d 58 5f 46 49 4c 45  .#define MX_FILE
0fc0: 20 20 31 30 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69    10../*.** Maxi
0fd0: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 66 69 6c 65  mum allowed file
0fe0: 20 73 69 7a 65 0a 2a 2f 0a 23 64 65 66 69 6e 65   size.*/.#define
0ff0: 20 4d 58 5f 46 49 4c 45 5f 53 5a 20 31 30 30 30   MX_FILE_SZ 1000
1000: 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  0000../*.** All 
1010: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
1020: 20 61 72 65 20 67 61 74 68 65 72 65 64 20 69 6e   are gathered in
1030: 74 6f 20 74 68 65 20 22 67 22 20 73 69 6e 67 6c  to the "g" singl
1040: 65 74 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eton..*/.static 
1050: 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 56 61 72  struct GlobalVar
1060: 73 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s {.  const char
1070: 20 2a 7a 41 72 67 76 30 3b 20 20 20 20 20 20 20   *zArgv0;       
1080: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1090: 66 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20 56  f program */.  V
10a0: 46 69 6c 65 20 61 46 69 6c 65 5b 4d 58 5f 46 49  File aFile[MX_FI
10b0: 4c 45 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  LE];            
10c0: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
10d0: 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 69  ilesystem */.  i
10e0: 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 6d  /* Number of tem
1110: 70 6c 61 74 65 20 64 61 74 61 62 61 73 65 73 20  plate databases 
1120: 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 46 69 72 73  */.  Blob *pFirs
1130: 74 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  tDb;            
1140: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
1150: 20 6f 66 20 66 69 72 73 74 20 74 65 6d 70 6c 61   of first templa
1160: 74 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  te database */. 
1170: 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20 20   int nSql;      
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
11a0: 51 4c 20 73 63 72 69 70 74 73 20 2a 2f 0a 20 20  QL scripts */.  
11b0: 42 6c 6f 62 20 2a 70 46 69 72 73 74 53 71 6c 3b  Blob *pFirstSql;
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 2f 2a 20 46 69 72 73 74 20 53 51 4c 20 73 63   /* First SQL sc
11e0: 72 69 70 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  ript */.  char z
11f0: 54 65 73 74 4e 61 6d 65 5b 31 30 30 5d 3b 20 20  TestName[100];  
1200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1210: 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  me of current te
1220: 73 74 20 2a 2f 0a 7d 20 67 3b 0a 0a 2f 2a 0a 2a  st */.} g;../*.*
1230: 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  * Print an error
1240: 20 6d 65 73 73 61 67 65 20 61 6e 64 20 71 75 69   message and qui
1250: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1260: 64 20 66 61 74 61 6c 45 72 72 6f 72 28 63 6f 6e  d fatalError(con
1270: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1280: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1290: 74 20 61 70 3b 0a 20 20 69 66 28 20 67 2e 7a 54  t ap;.  if( g.zT
12a0: 65 73 74 4e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  estName[0] ){.  
12b0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
12c0: 2c 20 22 25 73 20 28 25 73 29 3a 20 22 2c 20 67  , "%s (%s): ", g
12d0: 2e 7a 41 72 67 76 30 2c 20 67 2e 7a 54 65 73 74  .zArgv0, g.zTest
12e0: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
12f0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
1300: 72 72 2c 20 22 25 73 3a 20 22 2c 20 67 2e 7a 41  rr, "%s: ", g.zA
1310: 72 67 76 30 29 3b 0a 20 20 7d 0a 20 20 76 61 5f  rgv0);.  }.  va_
1320: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1330: 74 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 73  t);.  vfprintf(s
1340: 74 64 65 72 72 2c 20 7a 46 6f 72 6d 61 74 2c 20  tderr, zFormat, 
1350: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1360: 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  );.  fprintf(std
1370: 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 20 20 65 78  err, "\n");.  ex
1380: 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  it(1);.}../*.** 
1390: 54 69 6d 65 6f 75 74 20 68 61 6e 64 6c 65 72 0a  Timeout handler.
13a0: 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 75 6e 69 78  */.#ifdef __unix
13b0: 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  __.static void t
13c0: 69 6d 65 6f 75 74 48 61 6e 64 6c 65 72 28 69 6e  imeoutHandler(in
13d0: 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 28 76  t NotUsed){.  (v
13e0: 6f 69 64 29 4e 6f 74 55 73 65 64 3b 0a 20 20 66  oid)NotUsed;.  f
13f0: 61 74 61 6c 45 72 72 6f 72 28 22 74 69 6d 65 6f  atalError("timeo
1400: 75 74 5c 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69 66  ut\n");.}.#endif
1410: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1420: 61 6e 20 61 6c 61 72 6d 20 74 6f 20 67 6f 20 6f  an alarm to go o
1430: 66 66 20 61 66 74 65 72 20 4e 20 73 65 63 6f 6e  ff after N secon
1440: 64 73 2e 20 20 44 69 73 61 62 6c 65 20 74 68 65  ds.  Disable the
1450: 20 61 6c 61 72 6d 0a 2a 2a 20 69 66 20 4e 3d 3d   alarm.** if N==
1460: 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  0.*/.static void
1470: 20 73 65 74 41 6c 61 72 6d 28 69 6e 74 20 4e 29   setAlarm(int N)
1480: 7b 0a 23 69 66 64 65 66 20 5f 5f 75 6e 69 78 5f  {.#ifdef __unix_
1490: 5f 0a 20 20 61 6c 61 72 6d 28 4e 29 3b 0a 23 65  _.  alarm(N);.#e
14a0: 6c 73 65 0a 20 20 28 76 6f 69 64 29 4e 3b 0a 23  lse.  (void)N;.#
14b0: 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66  endif.}..#ifndef
14c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
14d0: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
14e0: 2a 0a 2a 2a 20 54 68 69 73 20 61 6e 20 53 51 4c  *.** This an SQL
14f0: 20 70 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65   progress handle
1500: 72 2e 20 20 41 66 74 65 72 20 61 6e 20 53 51 4c  r.  After an SQL
1510: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 72   statement has r
1520: 75 6e 20 66 6f 72 0a 2a 2a 20 6d 61 6e 79 20 73  un for.** many s
1530: 74 65 70 73 2c 20 77 65 20 77 61 6e 74 20 74 6f  teps, we want to
1540: 20 69 6e 74 65 72 72 75 70 74 20 69 74 2e 20 20   interrupt it.  
1550: 54 68 69 73 20 67 75 61 72 64 73 20 61 67 61 69  This guards agai
1560: 6e 73 74 20 69 6e 66 69 6e 69 74 65 0a 2a 2a 20  nst infinite.** 
1570: 6c 6f 6f 70 73 20 66 72 6f 6d 20 72 65 63 75 72  loops from recur
1580: 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c  sive common tabl
1590: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a  e expressions..*
15a0: 2a 0a 2a 2a 20 2a 70 56 64 62 65 4c 69 6d 69 74  *.** *pVdbeLimit
15b0: 46 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  Flag is true if 
15c0: 74 68 65 20 2d 2d 6c 69 6d 69 74 2d 76 64 62 65  the --limit-vdbe
15d0: 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
15e0: 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2a  tion is used..**
15f0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 68   In that case, h
1600: 69 74 74 69 6e 67 20 74 68 65 20 70 72 6f 67 72  itting the progr
1610: 65 73 73 20 68 61 6e 64 6c 65 72 20 69 73 20 61  ess handler is a
1620: 20 66 61 74 61 6c 20 65 72 72 6f 72 2e 0a 2a 2f   fatal error..*/
1630: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 67  .static int prog
1640: 72 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69 64  ressHandler(void
1650: 20 2a 70 56 64 62 65 4c 69 6d 69 74 46 6c 61 67   *pVdbeLimitFlag
1660: 29 7b 0a 20 20 69 66 28 20 2a 28 69 6e 74 2a 29  ){.  if( *(int*)
1670: 70 56 64 62 65 4c 69 6d 69 74 46 6c 61 67 20 29  pVdbeLimitFlag )
1680: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74 6f 6f   fatalError("too
1690: 20 6d 61 6e 79 20 56 44 42 45 20 63 79 63 6c 65   many VDBE cycle
16a0: 73 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  s");.  return 1;
16b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16c0: 20 52 65 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f   Reallocate memo
16d0: 72 79 2e 20 20 53 68 6f 77 20 61 6e 64 20 65 72  ry.  Show and er
16e0: 72 6f 72 20 61 6e 64 20 71 75 69 74 20 69 66 20  ror and quit if 
16f0: 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  unable..*/.stati
1700: 63 20 76 6f 69 64 20 2a 73 61 66 65 5f 72 65 61  c void *safe_rea
1710: 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64 2c  lloc(void *pOld,
1720: 20 69 6e 74 20 73 7a 4e 65 77 29 7b 0a 20 20 76   int szNew){.  v
1730: 6f 69 64 20 2a 70 4e 65 77 20 3d 20 72 65 61 6c  oid *pNew = real
1740: 6c 6f 63 28 70 4f 6c 64 2c 20 73 7a 4e 65 77 29  loc(pOld, szNew)
1750: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1760: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75 6e  ) fatalError("un
1770: 61 62 6c 65 20 74 6f 20 72 65 61 6c 6c 6f 63 20  able to realloc 
1780: 66 6f 72 20 25 64 20 62 79 74 65 73 22 2c 20 73  for %d bytes", s
1790: 7a 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20  zNew);.  return 
17a0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pNew;.}../*.** I
17b0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 76 69  nitialize the vi
17c0: 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
17d0: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
17e0: 64 20 66 6f 72 6d 61 74 56 66 73 28 76 6f 69 64  d formatVfs(void
17f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1800: 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 46 49 4c 45  r(i=0; i<MX_FILE
1810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 67 2e 61 46  ; i++){.    g.aF
1820: 69 6c 65 5b 69 5d 2e 73 7a 20 3d 20 2d 31 3b 0a  ile[i].sz = -1;.
1830: 20 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a      g.aFile[i].z
1840: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
1850: 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 61 20 3d    g.aFile[i].a =
1860: 20 30 3b 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b   0;.    g.aFile[
1870: 69 5d 2e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 7d  i].nRef = 0;.  }
1880: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  .}.../*.** Erase
1890: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
18a0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
18b0: 66 69 6c 65 20 73 79 73 74 65 6d 2e 0a 2a 2f 0a  file system..*/.
18c0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 66 6f  static void refo
18d0: 72 6d 61 74 56 66 73 28 76 6f 69 64 29 7b 0a 20  rmatVfs(void){. 
18e0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
18f0: 30 3b 20 69 3c 4d 58 5f 46 49 4c 45 3b 20 69 2b  0; i<MX_FILE; i+
1900: 2b 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 61 46  +){.    if( g.aF
1910: 69 6c 65 5b 69 5d 2e 73 7a 3c 30 20 29 20 63 6f  ile[i].sz<0 ) co
1920: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1930: 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46 69 6c 65  g.aFile[i].zFile
1940: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 72  name ){.      fr
1950: 65 65 28 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46  ee(g.aFile[i].zF
1960: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
1970: 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46 69 6c 65  g.aFile[i].zFile
1980: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  name = 0;.    }.
1990: 20 20 20 20 69 66 28 20 67 2e 61 46 69 6c 65 5b      if( g.aFile[
19a0: 69 5d 2e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  i].nRef>0 ){.   
19b0: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 66     fatalError("f
19c0: 69 6c 65 20 25 64 20 73 74 69 6c 6c 20 6f 70 65  ile %d still ope
19d0: 6e 2e 20 20 6e 52 65 66 3d 25 64 22 2c 20 69 2c  n.  nRef=%d", i,
19e0: 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 6e 52 65 66   g.aFile[i].nRef
19f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 2e 61  );.    }.    g.a
1a00: 46 69 6c 65 5b 69 5d 2e 73 7a 20 3d 20 2d 31 3b  File[i].sz = -1;
1a10: 0a 20 20 20 20 66 72 65 65 28 67 2e 61 46 69 6c  .    free(g.aFil
1a20: 65 5b 69 5d 2e 61 29 3b 0a 20 20 20 20 67 2e 61  e[i].a);.    g.a
1a30: 46 69 6c 65 5b 69 5d 2e 61 20 3d 20 30 3b 0a 20  File[i].a = 0;. 
1a40: 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 6e 52     g.aFile[i].nR
1a50: 65 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ef = 0;.  }.}../
1a60: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 56 46 69 6c  *.** Find a VFil
1a70: 65 20 62 79 20 6e 61 6d 65 0a 2a 2f 0a 73 74 61  e by name.*/.sta
1a80: 74 69 63 20 56 46 69 6c 65 20 2a 66 69 6e 64 56  tic VFile *findV
1a90: 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
1aa0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
1ab0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
1ac0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
1ad0: 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 46 49 4c  or(i=0; i<MX_FIL
1ae0: 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  E; i++){.    if(
1af0: 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46 69 6c   g.aFile[i].zFil
1b00: 65 6e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69  ename==0 ) conti
1b10: 6e 75 65 3b 20 20 20 0a 20 20 20 20 69 66 28 20  nue;   .    if( 
1b20: 73 74 72 63 6d 70 28 67 2e 61 46 69 6c 65 5b 69  strcmp(g.aFile[i
1b30: 5d 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4e 61  ].zFilename, zNa
1b40: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
1b50: 26 67 2e 61 46 69 6c 65 5b 69 5d 3b 0a 20 20 7d  &g.aFile[i];.  }
1b60: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1b70: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 56 46 69  /*.** Find a VFi
1b80: 6c 65 20 62 79 20 6e 61 6d 65 2e 20 20 43 72 65  le by name.  Cre
1b90: 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
1ba0: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
1bb0: 69 73 74 20 61 6e 64 0a 2a 2a 20 69 6e 69 74 69  ist and.** initi
1bc0: 61 6c 69 7a 65 20 69 74 20 74 6f 20 74 68 65 20  alize it to the 
1bd0: 73 69 7a 65 20 61 6e 64 20 63 6f 6e 74 65 6e 74  size and content
1be0: 20 67 69 76 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65   given..**.** Re
1bf0: 74 75 72 6e 20 4e 55 4c 4c 20 6f 6e 6c 79 20 69  turn NULL only i
1c00: 66 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  f the filesystem
1c10: 20 69 73 20 66 75 6c 6c 2e 0a 2a 2f 0a 73 74 61   is full..*/.sta
1c20: 74 69 63 20 56 46 69 6c 65 20 2a 63 72 65 61 74  tic VFile *creat
1c30: 65 56 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61  eVFile(const cha
1c40: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 73 7a  r *zName, int sz
1c50: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
1c60: 2a 70 44 61 74 61 29 7b 0a 20 20 56 46 69 6c 65  *pData){.  VFile
1c70: 20 2a 70 4e 65 77 20 3d 20 66 69 6e 64 56 46 69   *pNew = findVFi
1c80: 6c 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74  le(zName);.  int
1c90: 20 69 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29   i;.  if( pNew )
1ca0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20 20   return pNew;.  
1cb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 46 49  for(i=0; i<MX_FI
1cc0: 4c 45 20 26 26 20 67 2e 61 46 69 6c 65 5b 69 5d  LE && g.aFile[i]
1cd0: 2e 73 7a 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20  .sz>=0; i++){}. 
1ce0: 20 69 66 28 20 69 3e 3d 4d 58 5f 46 49 4c 45 20   if( i>=MX_FILE 
1cf0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
1d00: 65 77 20 3d 20 26 67 2e 61 46 69 6c 65 5b 69 5d  ew = &g.aFile[i]
1d10: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
1d20: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  .    pNew->zFile
1d30: 6e 61 6d 65 20 3d 20 73 61 66 65 5f 72 65 61 6c  name = safe_real
1d40: 6c 6f 63 28 30 2c 20 73 74 72 6c 65 6e 28 7a 4e  loc(0, strlen(zN
1d50: 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 6d 65 6d  ame)+1);.    mem
1d60: 63 70 79 28 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  cpy(pNew->zFilen
1d70: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 73 74 72 6c  ame, zName, strl
1d80: 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20 20  en(zName)+1);.  
1d90: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
1da0: 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  >zFilename = 0;.
1db0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66    }.  pNew->nRef
1dc0: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73 7a   = 0;.  pNew->sz
1dd0: 20 3d 20 73 7a 3b 0a 20 20 70 4e 65 77 2d 3e 61   = sz;.  pNew->a
1de0: 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28   = safe_realloc(
1df0: 30 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 73 7a  0, sz);.  if( sz
1e00: 3e 30 20 29 20 6d 65 6d 63 70 79 28 70 4e 65 77  >0 ) memcpy(pNew
1e10: 2d 3e 61 2c 20 70 44 61 74 61 2c 20 73 7a 29 3b  ->a, pData, sz);
1e20: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1e30: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  }.../*.** Implem
1e40: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1e50: 22 72 65 61 64 66 69 6c 65 28 58 29 22 20 53 51  "readfile(X)" SQ
1e60: 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  L function.  The
1e70: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 0a   entire content.
1e80: 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6e  ** of the file n
1e90: 61 6d 65 64 20 58 20 69 73 20 72 65 61 64 20 61  amed X is read a
1ea0: 6e 64 20 72 65 74 75 72 6e 65 64 20 61 73 20 61  nd returned as a
1eb0: 20 42 4c 4f 42 2e 20 20 4e 55 4c 4c 20 69 73 20   BLOB.  NULL is 
1ec0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20 74  returned.** if t
1ed0: 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1ee0: 20 65 78 69 73 74 20 6f 72 20 69 73 20 75 6e 72   exist or is unr
1ef0: 65 61 64 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  eadable..*/.stat
1f00: 69 63 20 76 6f 69 64 20 72 65 61 64 66 69 6c 65  ic void readfile
1f10: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1f20: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1f30: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1f40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1f50: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
1f60: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 46  char *zName;.  F
1f70: 49 4c 45 20 2a 69 6e 3b 0a 20 20 6c 6f 6e 67 20  ILE *in;.  long 
1f80: 6e 49 6e 3b 0a 20 20 76 6f 69 64 20 2a 70 42 75  nIn;.  void *pBu
1f90: 66 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 28 63  f;..  zName = (c
1fa0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1fb0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
1fc0: 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a 4e  gv[0]);.  if( zN
1fd0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
1fe0: 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e  .  in = fopen(zN
1ff0: 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 69 66  ame, "rb");.  if
2000: 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
2010: 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c  ;.  fseek(in, 0,
2020: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49   SEEK_END);.  nI
2030: 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20  n = ftell(in);. 
2040: 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70   rewind(in);.  p
2050: 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Buf = sqlite3_ma
2060: 6c 6c 6f 63 36 34 28 20 6e 49 6e 20 29 3b 0a 20  lloc64( nIn );. 
2070: 20 69 66 28 20 70 42 75 66 20 26 26 20 31 3d 3d   if( pBuf && 1==
2080: 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c  fread(pBuf, nIn,
2090: 20 31 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 73   1, in) ){.    s
20a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c  qlite3_result_bl
20b0: 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 42 75 66  ob(context, pBuf
20c0: 2c 20 6e 49 6e 2c 20 73 71 6c 69 74 65 33 5f 66  , nIn, sqlite3_f
20d0: 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ree);.  }else{. 
20e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20f0: 70 42 75 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  pBuf);.  }.  fcl
2100: 6f 73 65 28 69 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ose(in);.}../*.*
2110: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2120: 20 6f 66 20 74 68 65 20 22 77 72 69 74 65 66 69   of the "writefi
2130: 6c 65 28 58 2c 59 29 22 20 53 51 4c 20 66 75 6e  le(X,Y)" SQL fun
2140: 63 74 69 6f 6e 2e 20 20 54 68 65 20 61 72 67 75  ction.  The argu
2150: 6d 65 6e 74 20 59 0a 2a 2a 20 69 73 20 77 72 69  ment Y.** is wri
2160: 74 74 65 6e 20 69 6e 74 6f 20 66 69 6c 65 20 58  tten into file X
2170: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
2180: 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 69   bytes written i
2190: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 4f 72 0a  s returned.  Or.
21a0: 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  ** NULL is retur
21b0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
21c0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 73 75 63   goes wrong, suc
21d0: 68 20 61 73 20 62 65 69 6e 67 20 75 6e 61 62 6c  h as being unabl
21e0: 65 20 74 6f 20 6f 70 65 6e 0a 2a 2a 20 66 69 6c  e to open.** fil
21f0: 65 20 58 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  e X for writing.
2200: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2210: 77 72 69 74 65 66 69 6c 65 46 75 6e 63 28 0a 20  writefileFunc(. 
2220: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
2230: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
2240: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
2250: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
2260: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20 20  .  FILE *out;.  
2270: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2280: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 72   sqlite3_int64 r
2290: 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  c;.  const char 
22a0: 2a 7a 46 69 6c 65 3b 0a 0a 20 20 28 76 6f 69 64  *zFile;..  (void
22b0: 29 61 72 67 63 3b 0a 20 20 7a 46 69 6c 65 20 3d  )argc;.  zFile =
22c0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
22d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
22e0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
22f0: 20 7a 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75   zFile==0 ) retu
2300: 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 70 65  rn;.  out = fope
2310: 6e 28 7a 46 69 6c 65 2c 20 22 77 62 22 29 3b 0a  n(zFile, "wb");.
2320: 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 20 72    if( out==0 ) r
2330: 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 28 63 6f  eturn;.  z = (co
2340: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2350: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
2360: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  v[1]);.  if( z==
2370: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  0 ){.    rc = 0;
2380: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2390: 20 3d 20 66 77 72 69 74 65 28 7a 2c 20 31 2c 20   = fwrite(z, 1, 
23a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
23b0: 74 65 73 28 61 72 67 76 5b 31 5d 29 2c 20 6f 75  tes(argv[1]), ou
23c0: 74 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  t);.  }.  fclose
23d0: 28 6f 75 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  (out);.  sqlite3
23e0: 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f  _result_int64(co
23f0: 6e 74 65 78 74 2c 20 72 63 29 3b 0a 7d 0a 0a 0a  ntext, rc);.}...
2400: 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 20 6c 69 73  /*.** Load a lis
2410: 74 20 6f 66 20 42 6c 6f 62 20 6f 62 6a 65 63 74  t of Blob object
2420: 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
2430: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ase.*/.static vo
2440: 69 64 20 62 6c 6f 62 4c 69 73 74 4c 6f 61 64 46  id blobListLoadF
2450: 72 6f 6d 44 62 28 0a 20 20 73 71 6c 69 74 65 33  romDb(.  sqlite3
2460: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
2470: 20 20 2f 2a 20 52 65 61 64 20 66 72 6f 6d 20 74    /* Read from t
2480: 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  his database */.
2490: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
24a0: 71 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 51 75  ql,        /* Qu
24b0: 65 72 79 20 75 73 65 64 20 74 6f 20 65 78 74 72  ery used to extr
24c0: 61 63 74 20 74 68 65 20 62 6c 6f 62 73 20 2a 2f  act the blobs */
24d0: 0a 20 20 69 6e 74 20 6f 6e 6c 79 49 64 2c 20 20  .  int onlyId,  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24f0: 6e 6c 79 20 6c 6f 61 64 20 77 68 65 72 65 20 69  nly load where i
2500: 64 20 69 73 20 74 68 69 73 20 76 61 6c 75 65 20  d is this value 
2510: 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 2c 20 20 20  */.  int *pN,   
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2530: 20 4f 55 54 3a 20 57 72 69 74 65 20 6e 75 6d 62   OUT: Write numb
2540: 65 72 20 6f 66 20 62 6c 6f 62 73 20 6c 6f 61 64  er of blobs load
2550: 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 42 6c 6f  ed here */.  Blo
2560: 62 20 2a 2a 70 70 4c 69 73 74 20 20 20 20 20 20  b **ppList      
2570: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72        /* OUT: Wr
2580: 69 74 65 20 74 68 65 20 68 65 61 64 20 6f 66 20  ite the head of 
2590: 74 68 65 20 62 6c 6f 62 20 6c 69 73 74 20 68 65  the blob list he
25a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 6c 6f 62 20  re */.){.  Blob 
25b0: 68 65 61 64 3b 0a 20 20 42 6c 6f 62 20 2a 70 3b  head;.  Blob *p;
25c0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
25d0: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 6e 20  *pStmt;.  int n 
25e0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
25f0: 20 63 68 61 72 20 2a 7a 32 3b 0a 0a 20 20 69 66   char *z2;..  if
2600: 28 20 6f 6e 6c 79 49 64 3e 30 20 29 7b 0a 20 20  ( onlyId>0 ){.  
2610: 20 20 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f 6d    z2 = sqlite3_m
2620: 70 72 69 6e 74 66 28 22 25 73 20 57 48 45 52 45  printf("%s WHERE
2630: 20 72 6f 77 69 64 3d 25 64 22 2c 20 7a 53 71 6c   rowid=%d", zSql
2640: 2c 20 6f 6e 6c 79 49 64 29 3b 0a 20 20 7d 65 6c  , onlyId);.  }el
2650: 73 65 7b 0a 20 20 20 20 7a 32 20 3d 20 73 71 6c  se{.    z2 = sql
2660: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
2670: 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  ", zSql);.  }.  
2680: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2690: 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 32 2c 20  pare_v2(db, z2, 
26a0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
26b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26c0: 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 66  2);.  if( rc ) f
26d0: 61 74 61 6c 45 72 72 6f 72 28 22 25 73 22 2c 20  atalError("%s", 
26e0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
26f0: 62 29 29 3b 0a 20 20 68 65 61 64 2e 70 4e 65 78  b));.  head.pNex
2700: 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 26 68 65  t = 0;.  p = &he
2710: 61 64 3b 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  ad;.  while( SQL
2720: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2730: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
2740: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 71 6c      int sz = sql
2750: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2760: 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  s(pStmt, 1);.   
2770: 20 42 6c 6f 62 20 2a 70 4e 65 77 20 3d 20 73 61   Blob *pNew = sa
2780: 66 65 5f 72 65 61 6c 6c 6f 63 28 30 2c 20 73 69  fe_realloc(0, si
2790: 7a 65 6f 66 28 2a 70 4e 65 77 29 2b 73 7a 20 29  zeof(*pNew)+sz )
27a0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 64 20 3d  ;.    pNew->id =
27b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27c0: 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20  int(pStmt, 0);. 
27d0: 20 20 20 70 4e 65 77 2d 3e 73 7a 20 3d 20 73 7a     pNew->sz = sz
27e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 71 20  ;.    pNew->seq 
27f0: 3d 20 6e 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d  = n++;.    pNew-
2800: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
2810: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 61 2c 20  memcpy(pNew->a, 
2820: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2830: 6c 6f 62 28 70 53 74 6d 74 2c 31 29 2c 20 73 7a  lob(pStmt,1), sz
2840: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 73  );.    pNew->a[s
2850: 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  z] = 0;.    p->p
2860: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
2870: 20 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20   p = pNew;.  }. 
2880: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2890: 65 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 4e 20  e(pStmt);.  *pN 
28a0: 3d 20 6e 3b 0a 20 20 2a 70 70 4c 69 73 74 20 3d  = n;.  *ppList =
28b0: 20 68 65 61 64 2e 70 4e 65 78 74 3b 0a 7d 0a 0a   head.pNext;.}..
28c0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 6c 69 73  /*.** Free a lis
28d0: 74 20 6f 66 20 42 6c 6f 62 20 6f 62 6a 65 63 74  t of Blob object
28e0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
28f0: 20 62 6c 6f 62 4c 69 73 74 46 72 65 65 28 42 6c   blobListFree(Bl
2900: 6f 62 20 2a 70 29 7b 0a 20 20 42 6c 6f 62 20 2a  ob *p){.  Blob *
2910: 70 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28 20  pNext;.  while( 
2920: 70 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  p ){.    pNext =
2930: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 66   p->pNext;.    f
2940: 72 65 65 28 70 29 3b 0a 20 20 20 20 70 20 3d 20  ree(p);.    p = 
2950: 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  pNext;.  }.}.../
2960: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
2970: 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20  rent wall-clock 
2980: 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 73  time */.static s
2990: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 69 6d  qlite3_int64 tim
29a0: 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a 20 20  eOfDay(void){.  
29b0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
29c0: 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20 30  fs *clockVfs = 0
29d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
29e0: 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b  4 t;.  if( clock
29f0: 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56 66  Vfs==0 ) clockVf
2a00: 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
2a10: 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 63  find(0);.  if( c
2a20: 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73 69 6f  lockVfs->iVersio
2a30: 6e 3e 3d 31 20 26 26 20 63 6c 6f 63 6b 56 66 73  n>=1 && clockVfs
2a40: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
2a50: 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20 63 6c  t64!=0 ){.    cl
2a60: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
2a70: 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b 56  TimeInt64(clockV
2a80: 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73 65  fs, &t);.  }else
2a90: 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a  {.    double r;.
2aa0: 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43      clockVfs->xC
2ab0: 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63 6b  urrentTime(clock
2ac0: 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20 74 20  Vfs, &r);.    t 
2ad0: 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  = (sqlite3_int64
2ae0: 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30 29 3b  )(r*86400000.0);
2af0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b  .  }.  return t;
2b00: 0a 7d 0a 0a 2f 2a 20 4d 65 74 68 6f 64 73 20 66  .}../* Methods f
2b10: 6f 72 20 74 68 65 20 56 48 61 6e 64 6c 65 20 6f  or the VHandle o
2b20: 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20  bject.*/.static 
2b30: 69 6e 74 20 69 6e 6d 65 6d 43 6c 6f 73 65 28 73  int inmemClose(s
2b40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2b50: 6c 65 29 7b 0a 20 20 56 48 61 6e 64 6c 65 20 2a  le){.  VHandle *
2b60: 70 20 3d 20 28 56 48 61 6e 64 6c 65 2a 29 70 46  p = (VHandle*)pF
2b70: 69 6c 65 3b 0a 20 20 56 46 69 6c 65 20 2a 70 56  ile;.  VFile *pV
2b80: 46 69 6c 65 20 3d 20 70 2d 3e 70 56 46 69 6c 65  File = p->pVFile
2b90: 3b 0a 20 20 70 56 46 69 6c 65 2d 3e 6e 52 65 66  ;.  pVFile->nRef
2ba0: 2d 2d 3b 0a 20 20 69 66 28 20 70 56 46 69 6c 65  --;.  if( pVFile
2bb0: 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 56 46  ->nRef==0 && pVF
2bc0: 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile->zFilename==
2bd0: 30 20 29 7b 0a 20 20 20 20 70 56 46 69 6c 65 2d  0 ){.    pVFile-
2be0: 3e 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 66 72  >sz = -1;.    fr
2bf0: 65 65 28 70 56 46 69 6c 65 2d 3e 61 29 3b 0a 20  ee(pVFile->a);. 
2c00: 20 20 20 70 56 46 69 6c 65 2d 3e 61 20 3d 20 30     pVFile->a = 0
2c10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2c20: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
2c30: 69 63 20 69 6e 74 20 69 6e 6d 65 6d 52 65 61 64  ic int inmemRead
2c40: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
2c50: 20 2a 70 46 69 6c 65 2c 20 20 20 2f 2a 20 52 65   *pFile,   /* Re
2c60: 61 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 65  ad from this ope
2c70: 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69 64  n file */.  void
2c80: 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
2c90: 20 20 20 2f 2a 20 53 74 6f 72 65 20 63 6f 6e 74     /* Store cont
2ca0: 65 6e 74 20 69 6e 20 74 68 69 73 20 62 75 66 66  ent in this buff
2cb0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 41 6d 74  er */.  int iAmt
2cc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2cd0: 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
2ce0: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nt */.  sqlite3_
2cf0: 69 6e 74 36 34 20 69 4f 66 73 74 20 20 20 20 2f  int64 iOfst    /
2d00: 2a 20 53 74 61 72 74 20 72 65 61 64 69 6e 67 20  * Start reading 
2d10: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 48 61  here */.){.  VHa
2d20: 6e 64 6c 65 20 2a 70 48 61 6e 64 6c 65 20 3d 20  ndle *pHandle = 
2d30: 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c 65 3b  (VHandle*)pFile;
2d40: 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69 6c 65  .  VFile *pVFile
2d50: 20 3d 20 70 48 61 6e 64 6c 65 2d 3e 70 56 46 69   = pHandle->pVFi
2d60: 6c 65 3b 0a 20 20 69 66 28 20 69 4f 66 73 74 3c  le;.  if( iOfst<
2d70: 30 20 7c 7c 20 69 4f 66 73 74 3e 3d 70 56 46 69  0 || iOfst>=pVFi
2d80: 6c 65 2d 3e 73 7a 20 29 7b 0a 20 20 20 20 6d 65  le->sz ){.    me
2d90: 6d 73 65 74 28 70 44 61 74 61 2c 20 30 2c 20 69  mset(pData, 0, i
2da0: 41 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Amt);.    return
2db0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
2dc0: 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20  ORT_READ;.  }.  
2dd0: 69 66 28 20 69 4f 66 73 74 2b 69 41 6d 74 3e 70  if( iOfst+iAmt>p
2de0: 56 46 69 6c 65 2d 3e 73 7a 20 29 7b 0a 20 20 20  VFile->sz ){.   
2df0: 20 6d 65 6d 73 65 74 28 70 44 61 74 61 2c 20 30   memset(pData, 0
2e00: 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 69 41 6d  , iAmt);.    iAm
2e10: 74 20 3d 20 28 69 6e 74 29 28 70 56 46 69 6c 65  t = (int)(pVFile
2e20: 2d 3e 73 7a 20 2d 20 69 4f 66 73 74 29 3b 0a 20  ->sz - iOfst);. 
2e30: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
2e40: 20 70 56 46 69 6c 65 2d 3e 61 2c 20 69 41 6d 74   pVFile->a, iAmt
2e50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2e60: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
2e70: 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6d 65 6d  _READ;.  }.  mem
2e80: 63 70 79 28 70 44 61 74 61 2c 20 70 56 46 69 6c  cpy(pData, pVFil
2e90: 65 2d 3e 61 20 2b 20 69 4f 66 73 74 2c 20 69 41  e->a + iOfst, iA
2ea0: 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mt);.  return SQ
2eb0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
2ec0: 63 20 69 6e 74 20 69 6e 6d 65 6d 57 72 69 74 65  c int inmemWrite
2ed0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
2ee0: 20 2a 70 46 69 6c 65 2c 20 20 20 2f 2a 20 57 72   *pFile,   /* Wr
2ef0: 69 74 65 20 74 6f 20 74 68 69 73 20 66 69 6c 65  ite to this file
2f00: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2f10: 20 2a 70 44 61 74 61 2c 20 20 20 20 20 2f 2a 20   *pData,     /* 
2f20: 43 6f 6e 74 65 6e 74 20 74 6f 20 77 72 69 74 65  Content to write
2f30: 20 2a 2f 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20   */.  int iAmt, 
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f50: 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a  bytes to write *
2f60: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
2f70: 34 20 69 4f 66 73 74 20 20 20 20 2f 2a 20 53 74  4 iOfst    /* St
2f80: 61 72 74 20 77 72 69 74 69 6e 67 20 68 65 72 65  art writing here
2f90: 20 2a 2f 0a 29 7b 0a 20 20 56 48 61 6e 64 6c 65   */.){.  VHandle
2fa0: 20 2a 70 48 61 6e 64 6c 65 20 3d 20 28 56 48 61   *pHandle = (VHa
2fb0: 6e 64 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 56  ndle*)pFile;.  V
2fc0: 46 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20 70  File *pVFile = p
2fd0: 48 61 6e 64 6c 65 2d 3e 70 56 46 69 6c 65 3b 0a  Handle->pVFile;.
2fe0: 20 20 69 66 28 20 69 4f 66 73 74 2b 69 41 6d 74    if( iOfst+iAmt
2ff0: 20 3e 20 70 56 46 69 6c 65 2d 3e 73 7a 20 29 7b   > pVFile->sz ){
3000: 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74 2b 69  .    if( iOfst+i
3010: 41 6d 74 20 3e 3d 20 4d 58 5f 46 49 4c 45 5f 53  Amt >= MX_FILE_S
3020: 5a 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  Z ){.      retur
3030: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
3040: 20 20 20 7d 0a 20 20 20 20 70 56 46 69 6c 65 2d     }.    pVFile-
3050: 3e 61 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c 6f  >a = safe_reallo
3060: 63 28 70 56 46 69 6c 65 2d 3e 61 2c 20 28 69 6e  c(pVFile->a, (in
3070: 74 29 28 69 4f 66 73 74 2b 69 41 6d 74 29 29 3b  t)(iOfst+iAmt));
3080: 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74 20 3e  .    if( iOfst >
3090: 20 70 56 46 69 6c 65 2d 3e 73 7a 20 29 7b 0a 20   pVFile->sz ){. 
30a0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 56 46 69       memset(pVFi
30b0: 6c 65 2d 3e 61 20 2b 20 70 56 46 69 6c 65 2d 3e  le->a + pVFile->
30c0: 73 7a 2c 20 30 2c 20 28 69 6e 74 29 28 69 4f 66  sz, 0, (int)(iOf
30d0: 73 74 20 2d 20 70 56 46 69 6c 65 2d 3e 73 7a 29  st - pVFile->sz)
30e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 56 46  );.    }.    pVF
30f0: 69 6c 65 2d 3e 73 7a 20 3d 20 28 69 6e 74 29 28  ile->sz = (int)(
3100: 69 4f 66 73 74 20 2b 20 69 41 6d 74 29 3b 0a 20  iOfst + iAmt);. 
3110: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 56 46 69   }.  memcpy(pVFi
3120: 6c 65 2d 3e 61 20 2b 20 69 4f 66 73 74 2c 20 70  le->a + iOfst, p
3130: 44 61 74 61 2c 20 69 41 6d 74 29 3b 0a 20 20 72  Data, iAmt);.  r
3140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3150: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  .}.static int in
3160: 6d 65 6d 54 72 75 6e 63 61 74 65 28 73 71 6c 69  memTruncate(sqli
3170: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
3180: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
3190: 53 69 7a 65 29 7b 0a 20 20 56 48 61 6e 64 6c 65  Size){.  VHandle
31a0: 20 2a 70 48 61 6e 64 6c 65 20 3d 20 28 56 48 61   *pHandle = (VHa
31b0: 6e 64 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 56  ndle*)pFile;.  V
31c0: 46 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20 70  File *pVFile = p
31d0: 48 61 6e 64 6c 65 2d 3e 70 56 46 69 6c 65 3b 0a  Handle->pVFile;.
31e0: 20 20 69 66 28 20 70 56 46 69 6c 65 2d 3e 73 7a    if( pVFile->sz
31f0: 3e 69 53 69 7a 65 20 26 26 20 69 53 69 7a 65 3e  >iSize && iSize>
3200: 3d 30 20 29 20 70 56 46 69 6c 65 2d 3e 73 7a 20  =0 ) pVFile->sz 
3210: 3d 20 28 69 6e 74 29 69 53 69 7a 65 3b 0a 20 20  = (int)iSize;.  
3220: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3230: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ;.}.static int i
3240: 6e 6d 65 6d 53 79 6e 63 28 73 71 6c 69 74 65 33  nmemSync(sqlite3
3250: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
3260: 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75  t flags){.  retu
3270: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3280: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d  static int inmem
3290: 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
32a0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71  _file *pFile, sq
32b0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69  lite3_int64 *pSi
32c0: 7a 65 29 7b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ze){.  *pSize = 
32d0: 28 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c 65  ((VHandle*)pFile
32e0: 29 2d 3e 70 56 46 69 6c 65 2d 3e 73 7a 3b 0a 20  )->pVFile->sz;. 
32f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3300: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
3310: 69 6e 6d 65 6d 4c 6f 63 6b 28 73 71 6c 69 74 65  inmemLock(sqlite
3320: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
3330: 6e 74 20 74 79 70 65 29 7b 0a 20 20 72 65 74 75  nt type){.  retu
3340: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3350: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d  static int inmem
3360: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
3370: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
3380: 74 79 70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  type){.  return 
3390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
33a0: 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 43 68 65  tic int inmemChe
33b0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
33c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
33d0: 6c 65 2c 20 69 6e 74 20 2a 70 4f 75 74 29 7b 0a  le, int *pOut){.
33e0: 20 20 2a 70 4f 75 74 20 3d 20 30 3b 0a 20 20 72    *pOut = 0;.  r
33f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3400: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  .}.static int in
3410: 6d 65 6d 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  memFileControl(s
3420: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
3430: 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  le, int op, void
3440: 20 2a 70 41 72 67 29 7b 0a 20 20 72 65 74 75 72   *pArg){.  retur
3450: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
3460: 44 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  D;.}.static int 
3470: 69 6e 6d 65 6d 53 65 63 74 6f 72 53 69 7a 65 28  inmemSectorSize(
3480: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
3490: 69 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 35  ile){.  return 5
34a0: 31 32 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  12;.}.static int
34b0: 20 69 6e 6d 65 6d 44 65 76 69 63 65 43 68 61 72   inmemDeviceChar
34c0: 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
34d0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
34e0: 7b 0a 20 20 72 65 74 75 72 6e 0a 20 20 20 20 20  {.  return.     
34f0: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
3500: 46 45 5f 41 50 50 45 4e 44 20 7c 0a 20 20 20 20  FE_APPEND |.    
3510: 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55    SQLITE_IOCAP_U
3520: 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
3530: 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 53 51 4c  OPEN |.      SQL
3540: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
3550: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 7d  AFE_OVERWRITE;.}
3560: 0a 0a 0a 2f 2a 20 4d 65 74 68 6f 64 20 74 61 62  .../* Method tab
3570: 6c 65 20 66 6f 72 20 56 48 61 6e 64 6c 65 0a 2a  le for VHandle.*
3580: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
3590: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 56 48 61 6e  _io_methods VHan
35a0: 64 6c 65 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  dleMethods = {. 
35b0: 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 20 2a 2f   /* iVersion  */
35c0: 20 20 20 20 31 2c 0a 20 20 2f 2a 20 78 43 6c 6f      1,.  /* xClo
35d0: 73 65 20 20 20 20 2a 2f 20 20 20 20 69 6e 6d 65  se    */    inme
35e0: 6d 43 6c 6f 73 65 2c 0a 20 20 2f 2a 20 78 52 65  mClose,.  /* xRe
35f0: 61 64 20 20 20 20 20 2a 2f 20 20 20 20 69 6e 6d  ad     */    inm
3600: 65 6d 52 65 61 64 2c 0a 20 20 2f 2a 20 78 57 72  emRead,.  /* xWr
3610: 69 74 65 20 20 20 20 2a 2f 20 20 20 20 69 6e 6d  ite    */    inm
3620: 65 6d 57 72 69 74 65 2c 0a 20 20 2f 2a 20 78 54  emWrite,.  /* xT
3630: 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 69 6e  runcate */    in
3640: 6d 65 6d 54 72 75 6e 63 61 74 65 2c 0a 20 20 2f  memTruncate,.  /
3650: 2a 20 78 53 79 6e 63 20 20 20 20 20 2a 2f 20 20  * xSync     */  
3660: 20 20 69 6e 6d 65 6d 53 79 6e 63 2c 0a 20 20 2f    inmemSync,.  /
3670: 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20  * xFileSize */  
3680: 20 20 69 6e 6d 65 6d 46 69 6c 65 53 69 7a 65 2c    inmemFileSize,
3690: 0a 20 20 2f 2a 20 78 4c 6f 63 6b 20 20 20 20 20  .  /* xLock     
36a0: 2a 2f 20 20 20 20 69 6e 6d 65 6d 4c 6f 63 6b 2c  */    inmemLock,
36b0: 0a 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 20 20  .  /* xUnlock   
36c0: 2a 2f 20 20 20 20 69 6e 6d 65 6d 55 6e 6c 6f 63  */    inmemUnloc
36d0: 6b 2c 0a 20 20 2f 2a 20 78 43 68 65 63 6b 2e 2e  k,.  /* xCheck..
36e0: 2e 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 43 68 65  . */    inmemChe
36f0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a  ckReservedLock,.
3700: 20 20 2f 2a 20 78 46 69 6c 65 43 74 72 6c 20 2a    /* xFileCtrl *
3710: 2f 20 20 20 20 69 6e 6d 65 6d 46 69 6c 65 43 6f  /    inmemFileCo
3720: 6e 74 72 6f 6c 2c 0a 20 20 2f 2a 20 78 53 65 63  ntrol,.  /* xSec
3730: 74 6f 72 53 7a 20 2a 2f 20 20 20 20 69 6e 6d 65  torSz */    inme
3740: 6d 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20 2f  mSectorSize,.  /
3750: 2a 20 78 44 65 76 63 68 61 72 20 20 2a 2f 20 20  * xDevchar  */  
3760: 20 20 69 6e 6d 65 6d 44 65 76 69 63 65 43 68 61    inmemDeviceCha
3770: 72 61 63 74 65 72 69 73 74 69 63 73 2c 0a 20 20  racteristics,.  
3780: 2f 2a 20 78 53 68 6d 4d 61 70 20 20 20 2a 2f 20  /* xShmMap   */ 
3790: 20 20 20 30 2c 0a 20 20 2f 2a 20 78 53 68 6d 4c     0,.  /* xShmL
37a0: 6f 63 6b 20 20 2a 2f 20 20 20 20 30 2c 0a 20 20  ock  */    0,.  
37b0: 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
37c0: 2f 20 20 30 2c 0a 20 20 2f 2a 20 78 53 68 6d 55  /  0,.  /* xShmU
37d0: 6e 6d 61 70 20 2a 2f 20 20 20 20 30 2c 0a 20 20  nmap */    0,.  
37e0: 2f 2a 20 78 46 65 74 63 68 20 20 20 20 2a 2f 20  /* xFetch    */ 
37f0: 20 20 20 30 2c 0a 20 20 2f 2a 20 78 55 6e 66 65     0,.  /* xUnfe
3800: 74 63 68 20 20 2a 2f 20 20 20 20 30 0a 7d 3b 0a  tch  */    0.};.
3810: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
3820: 77 20 66 69 6c 65 20 69 6e 20 74 68 65 20 69 6e  w file in the in
3830: 6d 65 6d 20 56 46 53 2e 20 20 41 6c 6c 20 66 69  mem VFS.  All fi
3840: 6c 65 73 20 61 72 65 20 61 6e 6f 6e 79 6d 6f 75  les are anonymou
3850: 73 20 61 6e 64 20 61 72 65 0a 2a 2a 20 64 65 6c  s and are.** del
3860: 65 74 65 2d 6f 6e 2d 63 6c 6f 73 65 2e 0a 2a 2f  ete-on-close..*/
3870: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65  .static int inme
3880: 6d 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  mOpen(.  sqlite3
3890: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f  _vfs *pVfs,.  co
38a0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
38b0: 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66  ame,.  sqlite3_f
38c0: 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e  ile *pFile,.  in
38d0: 74 20 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 69  t openFlags,.  i
38e0: 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b  nt *pOutFlags.){
38f0: 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69 6c 65  .  VFile *pVFile
3900: 20 3d 20 63 72 65 61 74 65 56 46 69 6c 65 28 7a   = createVFile(z
3910: 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 28 75 6e  Filename, 0, (un
3920: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 22 22 29  signed char*)"")
3930: 3b 0a 20 20 56 48 61 6e 64 6c 65 20 2a 70 48 61  ;.  VHandle *pHa
3940: 6e 64 6c 65 20 3d 20 28 56 48 61 6e 64 6c 65 2a  ndle = (VHandle*
3950: 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 56  )pFile;.  if( pV
3960: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  File==0 ){.    r
3970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
3980: 4c 3b 0a 20 20 7d 0a 20 20 70 48 61 6e 64 6c 65  L;.  }.  pHandle
3990: 2d 3e 70 56 46 69 6c 65 20 3d 20 70 56 46 69 6c  ->pVFile = pVFil
39a0: 65 3b 0a 20 20 70 56 46 69 6c 65 2d 3e 6e 52 65  e;.  pVFile->nRe
39b0: 66 2b 2b 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  f++;.  pFile->pM
39c0: 65 74 68 6f 64 73 20 3d 20 26 56 48 61 6e 64 6c  ethods = &VHandl
39d0: 65 4d 65 74 68 6f 64 73 3b 0a 20 20 69 66 28 20  eMethods;.  if( 
39e0: 70 4f 75 74 46 6c 61 67 73 20 29 20 2a 70 4f 75  pOutFlags ) *pOu
39f0: 74 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  tFlags = openFla
3a00: 67 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  gs;.  return SQL
3a10: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3a20: 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65 20 62   Delete a file b
3a30: 79 20 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63  y name.*/.static
3a40: 20 69 6e 74 20 69 6e 6d 65 6d 44 65 6c 65 74 65   int inmemDelete
3a50: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
3a60: 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *pVfs,.  const c
3a70: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a  har *zFilename,.
3a80: 20 20 69 6e 74 20 73 79 6e 63 64 69 72 0a 29 7b    int syncdir.){
3a90: 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69 6c 65  .  VFile *pVFile
3aa0: 20 3d 20 66 69 6e 64 56 46 69 6c 65 28 7a 46 69   = findVFile(zFi
3ab0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
3ac0: 56 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  VFile==0 ) retur
3ad0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
3ae0: 66 28 20 70 56 46 69 6c 65 2d 3e 6e 52 65 66 3d  f( pVFile->nRef=
3af0: 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28 70  =0 ){.    free(p
3b00: 56 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  VFile->zFilename
3b10: 29 3b 0a 20 20 20 20 70 56 46 69 6c 65 2d 3e 7a  );.    pVFile->z
3b20: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
3b30: 20 20 70 56 46 69 6c 65 2d 3e 73 7a 20 3d 20 2d    pVFile->sz = -
3b40: 31 3b 0a 20 20 20 20 66 72 65 65 28 70 56 46 69  1;.    free(pVFi
3b50: 6c 65 2d 3e 61 29 3b 0a 20 20 20 20 70 56 46 69  le->a);.    pVFi
3b60: 6c 65 2d 3e 61 20 3d 20 30 3b 0a 20 20 20 20 72  le->a = 0;.    r
3b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3b80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3b90: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
3ba0: 45 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 66  E;.}../* Check f
3bb0: 6f 72 20 74 68 65 20 65 78 69 73 74 61 6e 63 65  or the existance
3bc0: 20 6f 66 20 61 20 66 69 6c 65 0a 2a 2f 0a 73 74   of a file.*/.st
3bd0: 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 41 63  atic int inmemAc
3be0: 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
3bf0: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e  vfs *pVfs,.  con
3c00: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
3c10: 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  me,.  int flags,
3c20: 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a  .  int *pResOut.
3c30: 29 7b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69  ){.  VFile *pVFi
3c40: 6c 65 20 3d 20 66 69 6e 64 56 46 69 6c 65 28 7a  le = findVFile(z
3c50: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 70 52  Filename);.  *pR
3c60: 65 73 4f 75 74 20 3d 20 20 70 56 46 69 6c 65 21  esOut =  pVFile!
3c70: 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  =0;.  return SQL
3c80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 47 65  ITE_OK;.}../* Ge
3c90: 74 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  t the canonical 
3ca0: 70 61 74 68 6e 61 6d 65 20 66 6f 72 20 61 20 66  pathname for a f
3cb0: 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ile.*/.static in
3cc0: 74 20 69 6e 6d 65 6d 46 75 6c 6c 50 61 74 68 6e  t inmemFullPathn
3cd0: 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
3ce0: 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73  fs *pVfs,.  cons
3cf0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
3d00: 65 2c 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 0a 20  e,.  int nOut,. 
3d10: 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20   char *zOut.){. 
3d20: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3d30: 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25  f(nOut, zOut, "%
3d40: 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
3d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3d60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 47 65 74 4c 61 73  OK;.}../* GetLas
3d70: 74 45 72 72 6f 72 28 29 20 69 73 20 6e 65 76 65  tError() is neve
3d80: 72 20 75 73 65 64 20 2a 2f 0a 73 74 61 74 69 63  r used */.static
3d90: 20 69 6e 74 20 69 6e 6d 65 6d 47 65 74 4c 61 73   int inmemGetLas
3da0: 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
3db0: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 2c  fs *pVfs, int n,
3dc0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 72 65 74   char *z){.  ret
3dd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3de0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
3df0: 20 74 68 65 20 56 46 53 20 74 68 61 74 20 72 65   the VFS that re
3e00: 61 64 73 20 66 72 6f 6d 20 74 68 65 20 67 2e 61  ads from the g.a
3e10: 46 69 6c 65 5b 5d 20 73 65 74 20 6f 66 20 66 69  File[] set of fi
3e20: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
3e30: 6f 69 64 20 69 6e 6d 65 6d 56 66 73 52 65 67 69  oid inmemVfsRegi
3e40: 73 74 65 72 28 76 6f 69 64 29 7b 0a 20 20 73 74  ster(void){.  st
3e50: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
3e60: 20 69 6e 6d 65 6d 56 66 73 3b 0a 20 20 73 71 6c   inmemVfs;.  sql
3e70: 69 74 65 33 5f 76 66 73 20 2a 70 44 65 66 61 75  ite3_vfs *pDefau
3e80: 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  lt = sqlite3_vfs
3e90: 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 6e 6d 65  _find(0);.  inme
3ea0: 6d 56 66 73 2e 69 56 65 72 73 69 6f 6e 20 3d 20  mVfs.iVersion = 
3eb0: 31 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 73 7a  1;.  inmemVfs.sz
3ec0: 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28  OsFile = sizeof(
3ed0: 56 48 61 6e 64 6c 65 29 3b 0a 20 20 69 6e 6d 65  VHandle);.  inme
3ee0: 6d 56 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20  mVfs.mxPathname 
3ef0: 3d 20 32 30 30 3b 0a 20 20 69 6e 6d 65 6d 56 66  = 200;.  inmemVf
3f00: 73 2e 7a 4e 61 6d 65 20 3d 20 22 69 6e 6d 65 6d  s.zName = "inmem
3f10: 22 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78 4f  ";.  inmemVfs.xO
3f20: 70 65 6e 20 3d 20 69 6e 6d 65 6d 4f 70 65 6e 3b  pen = inmemOpen;
3f30: 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78 44 65 6c  .  inmemVfs.xDel
3f40: 65 74 65 20 3d 20 69 6e 6d 65 6d 44 65 6c 65 74  ete = inmemDelet
3f50: 65 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78 41  e;.  inmemVfs.xA
3f60: 63 63 65 73 73 20 3d 20 69 6e 6d 65 6d 41 63 63  ccess = inmemAcc
3f70: 65 73 73 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e  ess;.  inmemVfs.
3f80: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  xFullPathname = 
3f90: 69 6e 6d 65 6d 46 75 6c 6c 50 61 74 68 6e 61 6d  inmemFullPathnam
3fa0: 65 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78 52  e;.  inmemVfs.xR
3fb0: 61 6e 64 6f 6d 6e 65 73 73 20 3d 20 70 44 65 66  andomness = pDef
3fc0: 61 75 6c 74 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73  ault->xRandomnes
3fd0: 73 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78 53  s;.  inmemVfs.xS
3fe0: 6c 65 65 70 20 3d 20 70 44 65 66 61 75 6c 74 2d  leep = pDefault-
3ff0: 3e 78 53 6c 65 65 70 3b 0a 20 20 69 6e 6d 65 6d  >xSleep;.  inmem
4000: 56 66 73 2e 78 43 75 72 72 65 6e 74 54 69 6d 65  Vfs.xCurrentTime
4010: 20 3d 20 70 44 65 66 61 75 6c 74 2d 3e 78 43 75   = pDefault->xCu
4020: 72 72 65 6e 74 54 69 6d 65 3b 0a 20 20 69 6e 6d  rrentTime;.  inm
4030: 65 6d 56 66 73 2e 78 47 65 74 4c 61 73 74 45 72  emVfs.xGetLastEr
4040: 72 6f 72 20 3d 20 69 6e 6d 65 6d 47 65 74 4c 61  ror = inmemGetLa
4050: 73 74 45 72 72 6f 72 3b 0a 20 20 73 71 6c 69 74  stError;.  sqlit
4060: 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
4070: 26 69 6e 6d 65 6d 56 66 73 2c 20 30 29 3b 0a 7d  &inmemVfs, 0);.}
4080: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
4090: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
40a0: 72 75 6e 46 6c 61 67 73 20 70 61 72 61 6d 65 74  runFlags paramet
40b0: 65 72 20 74 6f 20 72 75 6e 53 71 6c 28 29 0a 2a  er to runSql().*
40c0: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 54 52  /.#define SQL_TR
40d0: 41 43 45 20 20 30 78 30 30 30 31 20 20 20 20 20  ACE  0x0001     
40e0: 2f 2a 20 50 72 69 6e 74 20 65 61 63 68 20 53 51  /* Print each SQ
40f0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20 69  L statement as i
4100: 74 20 69 73 20 70 72 65 70 61 72 65 64 20 2a 2f  t is prepared */
4110: 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 4f 55 54  .#define SQL_OUT
4120: 50 55 54 20 30 78 30 30 30 32 20 20 20 20 20 2f  PUT 0x0002     /
4130: 2a 20 53 68 6f 77 20 74 68 65 20 53 51 4c 20 6f  * Show the SQL o
4140: 75 74 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  utput */../*.** 
4150: 52 75 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6d  Run multiple com
4160: 6d 61 6e 64 73 20 6f 66 20 53 51 4c 2e 20 20 53  mands of SQL.  S
4170: 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
4180: 33 5f 65 78 65 63 28 29 2c 20 62 75 74 20 64 6f  3_exec(), but do
4190: 65 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 70 20 69  es not.** stop i
41a0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
41b0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
41c0: 61 74 69 63 20 76 6f 69 64 20 72 75 6e 53 71 6c  atic void runSql
41d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
41e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
41f0: 75 6e 73 69 67 6e 65 64 20 20 72 75 6e 46 6c 61  unsigned  runFla
4200: 67 73 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  gs){.  const cha
4210: 72 20 2a 7a 4d 6f 72 65 3b 0a 20 20 73 71 6c 69  r *zMore;.  sqli
4220: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
4230: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 20  ..  while( zSql 
4240: 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20  && zSql[0] ){.  
4250: 20 20 7a 4d 6f 72 65 20 3d 20 30 3b 0a 20 20 20    zMore = 0;.   
4260: 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
4270: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
4280: 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
4290: 20 26 70 53 74 6d 74 2c 20 26 7a 4d 6f 72 65 29   &pStmt, &zMore)
42a0: 3b 0a 20 20 20 20 69 66 28 20 7a 4d 6f 72 65 3d  ;.    if( zMore=
42b0: 3d 7a 53 71 6c 20 29 20 62 72 65 61 6b 3b 0a 20  =zSql ) break;. 
42c0: 20 20 20 69 66 28 20 72 75 6e 46 6c 61 67 73 20     if( runFlags 
42d0: 26 20 53 51 4c 5f 54 52 41 43 45 20 29 7b 0a 20  & SQL_TRACE ){. 
42e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
42f0: 2a 7a 20 3d 20 7a 53 71 6c 3b 0a 20 20 20 20 20  *z = zSql;.     
4300: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 77 68   int n;.      wh
4310: 69 6c 65 28 20 7a 3c 7a 4d 6f 72 65 20 26 26 20  ile( z<zMore && 
4320: 49 53 53 50 41 43 45 28 7a 5b 30 5d 29 20 29 20  ISSPACE(z[0]) ) 
4330: 7a 2b 2b 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28  z++;.      n = (
4340: 69 6e 74 29 28 7a 4d 6f 72 65 20 2d 20 7a 29 3b  int)(zMore - z);
4350: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e  .      while( n>
4360: 30 20 26 26 20 49 53 53 50 41 43 45 28 7a 5b 6e  0 && ISSPACE(z[n
4370: 2d 31 5d 29 20 29 20 6e 2d 2d 3b 0a 20 20 20 20  -1]) ) n--;.    
4380: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 62 72 65    if( n==0 ) bre
4390: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  ak;.      if( pS
43a0: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tmt==0 ){.      
43b0: 20 20 70 72 69 6e 74 66 28 22 54 52 41 43 45 3a    printf("TRACE:
43c0: 20 25 2e 2a 73 20 28 65 72 72 6f 72 3a 20 25 73   %.*s (error: %s
43d0: 29 5c 6e 22 2c 20 6e 2c 20 7a 2c 20 73 71 6c 69  )\n", n, z, sqli
43e0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
43f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
4400: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 54 52        printf("TR
4410: 41 43 45 3a 20 25 2e 2a 73 5c 6e 22 2c 20 6e 2c  ACE: %.*s\n", n,
4420: 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   z);.      }.   
4430: 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4d   }.    zSql = zM
4440: 6f 72 65 3b 0a 20 20 20 20 69 66 28 20 70 53 74  ore;.    if( pSt
4450: 6d 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  mt ){.      if( 
4460: 28 72 75 6e 46 6c 61 67 73 20 26 20 53 51 4c 5f  (runFlags & SQL_
4470: 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20  OUTPUT)==0 ){.  
4480: 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
4490: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
44a0: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 7d  _step(pStmt) ){}
44b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
44c0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
44d0: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69   -1;.        whi
44e0: 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
44f0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
4500: 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mt) ){.         
4510: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
4520: 20 20 69 66 28 20 6e 43 6f 6c 3c 30 20 29 7b 0a    if( nCol<0 ){.
4530: 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
4540: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
4550: 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
4560: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
4570: 69 66 28 20 6e 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( nCol>0 ){.  
4580: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
4590: 28 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ("--------------
45a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
45c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
45d0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
45e0: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
45f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
4600: 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33   eType = sqlite3
4610: 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74  _column_type(pSt
4620: 6d 74 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  mt,i);.         
4630: 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 3d 20     printf("%s = 
4640: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
4650: 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  n_name(pStmt,i))
4660: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 77  ;.            sw
4670: 69 74 63 68 28 20 65 54 79 70 65 20 29 7b 0a 20  itch( eType ){. 
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
4690: 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
46a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
46b0: 20 70 72 69 6e 74 66 28 22 4e 55 4c 4c 5c 6e 22   printf("NULL\n"
46c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
46d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
46e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
46f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
4700: 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
4720: 72 69 6e 74 66 28 22 49 4e 54 20 25 73 5c 6e 22  rintf("INT %s\n"
4730: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
4740: 5f 74 65 78 74 28 70 53 74 6d 74 2c 69 29 29 3b  _text(pStmt,i));
4750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4760: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4780: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
4790: 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
47a0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
47b0: 66 28 22 46 4c 4f 41 54 20 25 73 5c 6e 22 2c 20  f("FLOAT %s\n", 
47c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
47d0: 65 78 74 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ext(pStmt,i));. 
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
47f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
4800: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4810: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4820: 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
4830: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
4840: 54 45 58 54 20 5b 25 73 5d 5c 6e 22 2c 20 73 71  TEXT [%s]\n", sq
4850: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
4860: 74 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  t(pStmt,i));.   
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
4880: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
4890: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
48a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
48b0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
48c0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 42 4c        printf("BL
48d0: 4f 42 20 28 25 64 20 62 79 74 65 73 29 5c 6e 22  OB (%d bytes)\n"
48e0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
48f0: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 69 29 29  _bytes(pStmt,i))
4900: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4910: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4930: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4940: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
4950: 20 20 20 7d 20 20 20 20 20 20 20 20 20 0a 20 20     }         .  
4960: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
4970: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
4980: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4990: 52 65 62 75 69 6c 64 20 74 68 65 20 64 61 74 61  Rebuild the data
49a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
49b0: 20 20 20 20 28 31 29 20 20 52 65 6d 6f 76 65 20      (1)  Remove 
49c0: 64 75 70 6c 69 63 61 74 65 20 65 6e 74 72 69 65  duplicate entrie
49d0: 73 0a 2a 2a 20 20 20 20 28 32 29 20 20 50 75 74  s.**    (2)  Put
49e0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20   all entries in 
49f0: 6f 72 64 65 72 0a 2a 2a 20 20 20 20 28 33 29 20  order.**    (3) 
4a00: 20 56 61 63 75 75 6d 0a 2a 2f 0a 73 74 61 74 69   Vacuum.*/.stati
4a10: 63 20 76 6f 69 64 20 72 65 62 75 69 6c 64 5f 64  c void rebuild_d
4a20: 61 74 61 62 61 73 65 28 73 71 6c 69 74 65 33 20  atabase(sqlite3 
4a30: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *db){.  int rc;.
4a40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
4a50: 78 65 63 28 64 62 2c 20 0a 20 20 20 20 20 22 42  xec(db, .     "B
4a60: 45 47 49 4e 3b 5c 6e 22 0a 20 20 20 20 20 22 43  EGIN;\n".     "C
4a70: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
4a80: 20 64 62 78 20 41 53 20 53 45 4c 45 43 54 20 44   dbx AS SELECT D
4a90: 49 53 54 49 4e 43 54 20 64 62 63 6f 6e 74 65 6e  ISTINCT dbconten
4aa0: 74 20 46 52 4f 4d 20 64 62 3b 5c 6e 22 0a 20 20  t FROM db;\n".  
4ab0: 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
4ac0: 64 62 3b 5c 6e 22 0a 20 20 20 20 20 22 49 4e 53  db;\n".     "INS
4ad0: 45 52 54 20 49 4e 54 4f 20 64 62 28 64 62 69 64  ERT INTO db(dbid
4ae0: 2c 20 64 62 63 6f 6e 74 65 6e 74 29 20 53 45 4c  , dbcontent) SEL
4af0: 45 43 54 20 4e 55 4c 4c 2c 20 64 62 63 6f 6e 74  ECT NULL, dbcont
4b00: 65 6e 74 20 46 52 4f 4d 20 64 62 78 20 4f 52 44  ent FROM dbx ORD
4b10: 45 52 20 42 59 20 32 3b 5c 6e 22 0a 20 20 20 20  ER BY 2;\n".    
4b20: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 64 62 78   "DROP TABLE dbx
4b30: 3b 5c 6e 22 0a 20 20 20 20 20 22 43 52 45 41 54  ;\n".     "CREAT
4b40: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73 78 20  E TEMP TABLE sx 
4b50: 41 53 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e  AS SELECT DISTIN
4b60: 43 54 20 73 71 6c 74 65 78 74 20 46 52 4f 4d 20  CT sqltext FROM 
4b70: 78 73 71 6c 3b 5c 6e 22 0a 20 20 20 20 20 22 44  xsql;\n".     "D
4b80: 45 4c 45 54 45 20 46 52 4f 4d 20 78 73 71 6c 3b  ELETE FROM xsql;
4b90: 5c 6e 22 0a 20 20 20 20 20 22 49 4e 53 45 52 54  \n".     "INSERT
4ba0: 20 49 4e 54 4f 20 78 73 71 6c 28 73 71 6c 69 64   INTO xsql(sqlid
4bb0: 2c 73 71 6c 74 65 78 74 29 20 53 45 4c 45 43 54  ,sqltext) SELECT
4bc0: 20 4e 55 4c 4c 2c 20 73 71 6c 74 65 78 74 20 46   NULL, sqltext F
4bd0: 52 4f 4d 20 73 78 20 4f 52 44 45 52 20 42 59 20  ROM sx ORDER BY 
4be0: 32 3b 5c 6e 22 0a 20 20 20 20 20 22 44 52 4f 50  2;\n".     "DROP
4bf0: 20 54 41 42 4c 45 20 73 78 3b 5c 6e 22 0a 20 20   TABLE sx;\n".  
4c00: 20 20 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 0a 20     "COMMIT;\n". 
4c10: 20 20 20 20 22 50 52 41 47 4d 41 20 70 61 67 65      "PRAGMA page
4c20: 5f 73 69 7a 65 3d 31 30 32 34 3b 5c 6e 22 0a 20  _size=1024;\n". 
4c30: 20 20 20 20 22 56 41 43 55 55 4d 3b 5c 6e 22 2c      "VACUUM;\n",
4c40: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
4c50: 20 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72   rc ) fatalError
4c60: 28 22 63 61 6e 6e 6f 74 20 72 65 62 75 69 6c 64  ("cannot rebuild
4c70: 3a 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  : %s", sqlite3_e
4c80: 72 72 6d 73 67 28 64 62 29 29 3b 0a 7d 0a 0a 2f  rrmsg(db));.}../
4c90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4ca0: 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64  value of a hexad
4cb0: 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52  ecimal digit.  R
4cc0: 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
4cd0: 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
4ce0: 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a  a hex digit..*/.
4cf0: 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69  static int hexDi
4d00: 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29  gitValue(char c)
4d10: 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26  {.  if( c>='0' &
4d20: 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72  & c<='9' ) retur
4d30: 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28  n c - '0';.  if(
4d40: 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66   c>='a' && c<='f
4d50: 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
4d60: 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63  a' + 10;.  if( c
4d70: 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20  >='A' && c<='F' 
4d80: 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27  ) return c - 'A'
4d90: 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20   + 10;.  return 
4da0: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  -1;.}../*.** Int
4db0: 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61  erpret zArg as a
4dc0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c  n integer value,
4dd0: 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73   possibly with s
4de0: 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74  uffixes..*/.stat
4df0: 69 63 20 69 6e 74 20 69 6e 74 65 67 65 72 56 61  ic int integerVa
4e00: 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lue(const char *
4e10: 7a 41 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33  zArg){.  sqlite3
4e20: 5f 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20  _int64 v = 0;.  
4e30: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
4e40: 75 63 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66  uct { char *zSuf
4e50: 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20  fix; int iMult; 
4e60: 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20  } aMult[] = {.  
4e70: 20 20 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20    { "KiB", 1024 
4e80: 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20  },.    { "MiB", 
4e90: 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20  1024*1024 },.   
4ea0: 20 7b 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31   { "GiB", 1024*1
4eb0: 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20  024*1024 },.    
4ec0: 7b 20 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c  { "KB",  1000 },
4ed0: 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30  .    { "MB",  10
4ee0: 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22  00000 },.    { "
4ef0: 47 42 22 2c 20 20 31 30 30 30 30 30 30 30 30 30  GB",  1000000000
4f00: 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20   },.    { "K",  
4f10: 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22   1000 },.    { "
4f20: 4d 22 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c  M",   1000000 },
4f30: 0a 20 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30  .    { "G",   10
4f40: 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b  00000000 },.  };
4f50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
4f60: 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28  isNeg = 0;.  if(
4f70: 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b   zArg[0]=='-' ){
4f80: 0a 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a  .    isNeg = 1;.
4f90: 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65      zArg++;.  }e
4fa0: 6c 73 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  lse if( zArg[0]=
4fb0: 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67  ='+' ){.    zArg
4fc0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41  ++;.  }.  if( zA
4fd0: 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41  rg[0]=='0' && zA
4fe0: 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  rg[1]=='x' ){.  
4ff0: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72    int x;.    zAr
5000: 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c  g += 2;.    whil
5010: 65 28 20 28 78 20 3d 20 68 65 78 44 69 67 69 74  e( (x = hexDigit
5020: 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e  Value(zArg[0]))>
5030: 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
5040: 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20  (v<<4) + x;.    
5050: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a    zArg++;.    }.
5060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
5070: 6c 65 28 20 49 53 44 49 47 49 54 28 7a 41 72 67  le( ISDIGIT(zArg
5080: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20  [0]) ){.      v 
5090: 3d 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d  = v*10 + zArg[0]
50a0: 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41   - '0';.      zA
50b0: 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rg++;.    }.  }.
50c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
50d0: 65 6f 66 28 61 4d 75 6c 74 29 2f 73 69 7a 65 6f  eof(aMult)/sizeo
50e0: 66 28 61 4d 75 6c 74 5b 30 5d 29 3b 20 69 2b 2b  f(aMult[0]); i++
50f0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
5100: 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74  e3_stricmp(aMult
5110: 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72  [i].zSuffix, zAr
5120: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  g)==0 ){.      v
5130: 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75   *= aMult[i].iMu
5140: 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt;.      break;
5150: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5160: 20 76 3e 30 78 37 66 66 66 66 66 66 66 20 29 20   v>0x7fffffff ) 
5170: 66 61 74 61 6c 45 72 72 6f 72 28 22 70 61 72 61  fatalError("para
5180: 6d 65 74 65 72 20 74 6f 6f 20 6c 61 72 67 65 20  meter too large 
5190: 2d 20 6d 61 78 20 32 31 34 37 34 38 33 36 34 38  - max 2147483648
51a0: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  ");.  return (in
51b0: 74 29 28 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76  t)(isNeg? -v : v
51c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  );.}../*.** Prin
51d0: 74 20 73 6b 65 74 63 68 79 20 64 6f 63 75 6d 65  t sketchy docume
51e0: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ntation for this
51f0: 20 75 74 69 6c 69 74 79 20 70 72 6f 67 72 61 6d   utility program
5200: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5210: 73 68 6f 77 48 65 6c 70 28 76 6f 69 64 29 7b 0a  showHelp(void){.
5220: 20 20 70 72 69 6e 74 66 28 22 55 73 61 67 65 3a    printf("Usage:
5230: 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 53 4f   %s [options] SO
5240: 55 52 43 45 2d 44 42 20 3f 41 52 47 53 2e 2e 2e  URCE-DB ?ARGS...
5250: 3f 5c 6e 22 2c 20 67 2e 7a 41 72 67 76 30 29 3b  ?\n", g.zArgv0);
5260: 0a 20 20 70 72 69 6e 74 66 28 0a 22 52 65 61 64  .  printf(."Read
5270: 20 64 61 74 61 62 61 73 65 73 20 61 6e 64 20 53   databases and S
5280: 51 4c 20 73 63 72 69 70 74 73 20 66 72 6f 6d 20  QL scripts from 
5290: 53 4f 55 52 43 45 2d 44 42 20 61 6e 64 20 65 78  SOURCE-DB and ex
52a0: 65 63 75 74 65 20 65 61 63 68 20 73 63 72 69 70  ecute each scrip
52b0: 74 20 61 67 61 69 6e 73 74 5c 6e 22 0a 22 65 61  t against\n"."ea
52c0: 63 68 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  ch database, che
52d0: 63 6b 69 6e 67 20 66 6f 72 20 63 72 61 73 68 65  cking for crashe
52e0: 73 20 61 6e 64 20 6d 65 6d 6f 72 79 20 6c 65 61  s and memory lea
52f0: 6b 73 2e 5c 6e 22 0a 22 4f 70 74 69 6f 6e 73 3a  ks.\n"."Options:
5300: 5c 6e 22 0a 22 20 20 2d 2d 63 65 6c 6c 2d 73 69  \n"."  --cell-si
5310: 7a 65 2d 63 68 65 63 6b 20 20 20 20 20 53 65 74  ze-check     Set
5320: 20 74 68 65 20 50 52 41 47 4d 41 20 63 65 6c 6c   the PRAGMA cell
5330: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 5c 6e  _size_check=ON\n
5340: 22 0a 22 20 20 2d 2d 64 62 69 64 20 4e 20 20 20  "."  --dbid N   
5350: 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 6f             Use o
5360: 6e 6c 79 20 74 68 65 20 64 61 74 61 62 61 73 65  nly the database
5370: 20 77 68 65 72 65 20 64 62 69 64 3d 4e 5c 6e 22   where dbid=N\n"
5380: 0a 22 20 20 2d 2d 65 78 70 6f 72 74 2d 64 62 20  ."  --export-db 
5390: 44 49 52 20 20 20 20 20 20 20 57 72 69 74 65 20  DIR       Write 
53a0: 64 61 74 61 62 61 73 65 73 20 74 6f 20 66 69 6c  databases to fil
53b0: 65 73 28 73 29 20 69 6e 20 44 49 52 2e 20 57 6f  es(s) in DIR. Wo
53c0: 72 6b 73 20 77 69 74 68 20 2d 2d 64 62 69 64 5c  rks with --dbid\
53d0: 6e 22 0a 22 20 20 2d 2d 65 78 70 6f 72 74 2d 73  n"."  --export-s
53e0: 71 6c 20 44 49 52 20 20 20 20 20 20 57 72 69 74  ql DIR      Writ
53f0: 65 20 53 51 4c 20 74 6f 20 66 69 6c 65 28 73 29  e SQL to file(s)
5400: 20 69 6e 20 44 49 52 2e 20 41 6c 73 6f 20 77 6f   in DIR. Also wo
5410: 72 6b 73 20 77 69 74 68 20 2d 2d 73 71 6c 69 64  rks with --sqlid
5420: 5c 6e 22 0a 22 20 20 2d 2d 68 65 6c 70 20 20 20  \n"."  --help   
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
5440: 77 20 74 68 69 73 20 68 65 6c 70 20 74 65 78 74  w this help text
5450: 5c 6e 22 0a 22 20 20 2d 71 20 20 20 20 20 20 20  \n"."  -q       
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65 64               Red
5470: 75 63 65 64 20 6f 75 74 70 75 74 5c 6e 22 0a 22  uced output\n"."
5480: 20 20 2d 2d 71 75 69 65 74 20 20 20 20 20 20 20    --quiet       
5490: 20 20 20 20 20 20 20 20 52 65 64 75 63 65 64 20          Reduced 
54a0: 6f 75 74 70 75 74 5c 6e 22 0a 22 20 20 2d 2d 6c  output\n"."  --l
54b0: 69 6d 69 74 2d 6d 65 6d 20 4e 20 20 20 20 20 20  imit-mem N      
54c0: 20 20 20 4c 69 6d 69 74 20 6d 65 6d 6f 72 79 20     Limit memory 
54d0: 75 73 65 64 20 62 79 20 74 65 73 74 20 53 51 4c  used by test SQL
54e0: 69 74 65 20 69 6e 73 74 61 6e 63 65 20 74 6f 20  ite instance to 
54f0: 4e 20 62 79 74 65 73 5c 6e 22 0a 22 20 20 2d 2d  N bytes\n"."  --
5500: 6c 69 6d 69 74 2d 76 64 62 65 20 20 20 20 20 20  limit-vdbe      
5510: 20 20 20 20 50 61 6e 69 63 20 69 66 20 61 6e 20      Panic if an 
5520: 73 79 6e 63 20 53 51 4c 20 72 75 6e 73 20 66 6f  sync SQL runs fo
5530: 72 20 6d 6f 72 65 20 74 68 61 6e 20 31 30 30 2c  r more than 100,
5540: 30 30 30 20 63 79 63 6c 65 73 5c 6e 22 0a 22 20  000 cycles\n"." 
5550: 20 2d 2d 6c 6f 61 64 2d 73 71 6c 20 41 52 47 53   --load-sql ARGS
5560: 2e 2e 2e 20 20 20 20 4c 6f 61 64 20 53 51 4c 20  ...    Load SQL 
5570: 73 63 72 69 70 74 73 20 66 72 6f 20 66 69 6c 65  scripts fro file
5580: 73 20 69 6e 74 6f 20 53 4f 55 52 43 45 2d 44 42  s into SOURCE-DB
5590: 5c 6e 22 0a 22 20 20 2d 2d 6c 6f 61 64 2d 64 62  \n"."  --load-db
55a0: 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 4c 6f 61   ARGS...     Loa
55b0: 64 20 74 65 6d 70 6c 61 74 65 20 64 61 74 61 62  d template datab
55c0: 61 73 65 73 20 66 72 6f 6d 20 66 69 6c 65 73 20  ases from files 
55d0: 69 6e 74 6f 20 53 4f 55 52 43 45 5f 44 42 5c 6e  into SOURCE_DB\n
55e0: 22 0a 22 20 20 2d 6d 20 54 45 58 54 20 20 20 20  "."  -m TEXT    
55f0: 20 20 20 20 20 20 20 20 20 20 20 41 64 64 20 61             Add a
5600: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 74 6f 20   description to 
5610: 74 68 65 20 64 61 74 61 62 61 73 65 5c 6e 22 0a  the database\n".
5620: 22 20 20 2d 2d 6e 61 74 69 76 65 2d 76 66 73 20  "  --native-vfs 
5630: 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68 65           Use the
5640: 20 6e 61 74 69 76 65 20 56 46 53 20 66 6f 72 20   native VFS for 
5650: 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 20  initially empty 
5660: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 5c 6e  database files\n
5670: 22 0a 22 20 20 2d 2d 72 65 62 75 69 6c 64 20 20  "."  --rebuild  
5680: 20 20 20 20 20 20 20 20 20 20 20 52 65 62 75 69             Rebui
5690: 6c 64 20 61 6e 64 20 76 61 63 75 75 6d 20 74 68  ld and vacuum th
56a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 5c  e database file\
56b0: 6e 22 0a 22 20 20 2d 2d 72 65 73 75 6c 74 2d 74  n"."  --result-t
56c0: 72 61 63 65 20 20 20 20 20 20 20 20 53 68 6f 77  race        Show
56d0: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
56e0: 65 61 63 68 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  each SQL command
56f0: 5c 6e 22 0a 22 20 20 2d 2d 73 71 6c 69 64 20 4e  \n"."  --sqlid N
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
5710: 20 6f 6e 6c 79 20 53 51 4c 20 77 68 65 72 65 20   only SQL where 
5720: 73 71 6c 69 64 3d 4e 5c 6e 22 0a 22 20 20 2d 2d  sqlid=N\n"."  --
5730: 74 69 6d 65 6f 75 74 20 4e 20 20 20 20 20 20 20  timeout N       
5740: 20 20 20 20 41 62 6f 72 74 20 69 66 20 61 6e 79      Abort if any
5750: 20 73 69 6e 67 6c 65 20 74 65 73 74 20 63 61 73   single test cas
5760: 65 20 6e 65 65 64 73 20 6d 6f 72 65 20 74 68 61  e needs more tha
5770: 6e 20 4e 20 73 65 63 6f 6e 64 73 5c 6e 22 0a 22  n N seconds\n"."
5780: 20 20 2d 76 20 20 20 20 20 20 20 20 20 20 20 20    -v            
5790: 20 20 20 20 20 20 20 20 49 6e 63 72 65 61 73 65          Increase
57a0: 64 20 6f 75 74 70 75 74 5c 6e 22 0a 22 20 20 2d  d output\n"."  -
57b0: 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20 20 20  -verbose        
57c0: 20 20 20 20 20 49 6e 63 72 65 61 73 65 64 20 6f       Increased o
57d0: 75 74 70 75 74 5c 6e 22 0a 20 20 29 3b 0a 7d 0a  utput\n".  );.}.
57e0: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
57f0: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
5800: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
5810: 34 20 69 42 65 67 69 6e 3b 20 20 20 20 20 20 20  4 iBegin;       
5820: 20 2f 2a 20 53 74 61 72 74 20 74 69 6d 65 20 6f   /* Start time o
5830: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20 2a  f this program *
5840: 2f 0a 20 20 69 6e 74 20 71 75 69 65 74 46 6c 61  /.  int quietFla
5850: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
5860: 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 71 75   /* True if --qu
5870: 69 65 74 20 6f 72 20 2d 71 20 2a 2f 0a 20 20 69  iet or -q */.  i
5880: 6e 74 20 76 65 72 62 6f 73 65 46 6c 61 67 20 3d  nt verboseFlag =
5890: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
58a0: 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65  rue if --verbose
58b0: 20 6f 72 20 2d 76 20 2a 2f 0a 20 20 63 68 61 72   or -v */.  char
58c0: 20 2a 7a 49 6e 73 53 71 6c 20 3d 20 30 3b 20 20   *zInsSql = 0;  
58d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20           /* SQL 
58e0: 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 2d 2d  statement for --
58f0: 6c 6f 61 64 2d 64 62 20 6f 72 20 2d 2d 6c 6f 61  load-db or --loa
5900: 64 2d 73 71 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  d-sql */.  int i
5910: 46 69 72 73 74 49 6e 73 41 72 67 20 3d 20 30 3b  FirstInsArg = 0;
5920: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5930: 20 61 72 67 76 5b 5d 20 74 6f 20 75 73 65 20 66   argv[] to use f
5940: 6f 72 20 2d 2d 6c 6f 61 64 2d 64 62 20 6f 72 20  or --load-db or 
5950: 2d 2d 6c 6f 61 64 2d 73 71 6c 20 2a 2f 0a 20 20  --load-sql */.  
5960: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5980: 54 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  The open databas
5990: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
59a0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
59b0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 2f  pStmt;         /
59c0: 2a 20 41 20 70 72 65 70 61 72 65 64 20 73 74 61  * A prepared sta
59d0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
59e0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
59f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
5a00: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 53 51 4c  lt code from SQL
5a10: 69 74 65 20 69 6e 74 65 72 66 61 63 65 20 63 61  ite interface ca
5a20: 6c 6c 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70  lls */.  Blob *p
5a30: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
5a40: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
5a50: 70 69 6e 67 20 6f 76 65 72 20 53 51 4c 20 73 63  ping over SQL sc
5a60: 72 69 70 74 73 20 2a 2f 0a 20 20 42 6c 6f 62 20  ripts */.  Blob 
5a70: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
5a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
5a90: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 65 6d 70  ooping over temp
5aa0: 6c 61 74 65 20 64 61 74 61 62 61 73 65 73 20 2a  late databases *
5ab0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 2f 2a 20 4c 6f 6f 70 20 69 6e 64 65 78 20 66   /* Loop index f
5ae0: 6f 72 20 74 68 65 20 61 72 67 76 5b 5d 20 6c 6f  or the argv[] lo
5af0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c 79  op */.  int only
5b00: 53 71 6c 69 64 20 3d 20 2d 31 3b 20 20 20 20 20  Sqlid = -1;     
5b10: 20 20 20 20 20 2f 2a 20 2d 2d 73 71 6c 69 64 20       /* --sqlid 
5b20: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c 79 44 62 69  */.  int onlyDbi
5b30: 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
5b40: 20 20 2f 2a 20 2d 2d 64 62 69 64 20 2a 2f 0a 20    /* --dbid */. 
5b50: 20 69 6e 74 20 6e 61 74 69 76 65 46 6c 61 67 20   int nativeFlag 
5b60: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
5b70: 20 2d 2d 6e 61 74 69 76 65 2d 76 66 73 20 2a 2f   --native-vfs */
5b80: 0a 20 20 69 6e 74 20 72 65 62 75 69 6c 64 46 6c  .  int rebuildFl
5b90: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
5ba0: 2f 2a 20 2d 2d 72 65 62 75 69 6c 64 20 2a 2f 0a  /* --rebuild */.
5bb0: 20 20 69 6e 74 20 76 64 62 65 4c 69 6d 69 74 46    int vdbeLimitF
5bc0: 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  lag = 0;       /
5bd0: 2a 20 2d 2d 6c 69 6d 69 74 2d 76 64 62 65 20 2a  * --limit-vdbe *
5be0: 2f 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 54  /.  int timeoutT
5bf0: 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
5c00: 20 2f 2a 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64   /* undocumented
5c10: 20 2d 2d 74 69 6d 65 6f 75 74 2d 74 65 73 74 20   --timeout-test 
5c20: 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 72 75  flag */.  int ru
5c30: 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
5c40: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
5c50: 73 65 6e 74 20 74 6f 20 72 75 6e 53 71 6c 28 29  sent to runSql()
5c60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67   */.  char *zMsg
5c70: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5c80: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
5c90: 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  essage */.  int 
5ca0: 6e 53 72 63 44 62 20 3d 20 30 3b 20 20 20 20 20  nSrcDb = 0;     
5cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5cc0: 65 72 20 6f 66 20 73 6f 75 72 63 65 20 64 61 74  er of source dat
5cd0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 63 68 61 72  abases */.  char
5ce0: 20 2a 2a 61 7a 53 72 63 44 62 20 3d 20 30 3b 20   **azSrcDb = 0; 
5cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
5d00: 79 20 6f 66 20 73 6f 75 72 63 65 20 64 61 74 61  y of source data
5d10: 62 61 73 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  base names */.  
5d20: 69 6e 74 20 69 53 72 63 44 62 3b 20 20 20 20 20  int iSrcDb;     
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5d40: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 6f  Loop over all so
5d50: 75 72 63 65 20 64 61 74 61 62 61 73 65 73 20 2a  urce databases *
5d60: 2f 0a 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20  /.  int nTest = 
5d70: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
5d80: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
5d90: 20 6f 66 20 74 65 73 74 73 20 70 65 72 66 6f 72   of tests perfor
5da0: 6d 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  med */.  char *z
5db0: 44 62 4e 61 6d 65 20 3d 20 22 22 3b 20 20 20 20  DbName = "";    
5dc0: 20 20 20 20 20 20 2f 2a 20 41 70 70 72 65 76 69        /* Apprevi
5dd0: 61 74 65 64 20 6e 61 6d 65 20 6f 66 20 61 20 73  ated name of a s
5de0: 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 2a  ource database *
5df0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5e00: 7a 46 61 69 6c 43 6f 64 65 20 3d 20 30 3b 20 20  zFailCode = 0;  
5e10: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
5e20: 20 54 45 53 54 5f 46 41 49 4c 55 52 45 20 65 6e   TEST_FAILURE en
5e30: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
5e40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  le */.  int cell
5e50: 53 7a 43 6b 46 6c 61 67 20 3d 20 30 3b 20 20 20  SzCkFlag = 0;   
5e60: 20 20 20 20 20 2f 2a 20 2d 2d 63 65 6c 6c 2d 73       /* --cell-s
5e70: 69 7a 65 2d 63 68 65 63 6b 20 2a 2f 0a 20 20 69  ize-check */.  i
5e80: 6e 74 20 73 71 6c 46 75 7a 7a 20 3d 20 30 3b 20  nt sqlFuzz = 0; 
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5ea0: 72 75 65 20 66 6f 72 20 53 51 4c 20 66 75 7a 7a  rue for SQL fuzz
5eb0: 20 74 65 73 74 69 6e 67 2e 20 46 61 6c 73 65 20   testing. False 
5ec0: 66 6f 72 20 44 42 20 66 75 7a 7a 20 2a 2f 0a 20  for DB fuzz */. 
5ed0: 20 69 6e 74 20 69 54 69 6d 65 6f 75 74 20 3d 20   int iTimeout = 
5ee0: 31 32 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  120;          /*
5ef0: 20 44 65 66 61 75 6c 74 20 31 32 30 2d 73 65 63   Default 120-sec
5f00: 6f 6e 64 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20  ond timeout */. 
5f10: 20 69 6e 74 20 6e 4d 65 6d 20 3d 20 30 3b 20 20   int nMem = 0;  
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f30: 20 4d 65 6d 6f 72 79 20 6c 69 6d 69 74 20 2a 2f   Memory limit */
5f40: 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 44 62 20  .  char *zExpDb 
5f50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5f60: 2f 2a 20 57 72 69 74 65 20 44 61 74 61 62 61 73  /* Write Databas
5f70: 65 73 20 74 6f 20 66 69 6c 65 73 20 69 6e 20 74  es to files in t
5f80: 68 69 73 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  his directory */
5f90: 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 53 71 6c  .  char *zExpSql
5fa0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5fb0: 2f 2a 20 57 72 69 74 65 20 53 51 4c 20 74 6f 20  /* Write SQL to 
5fc0: 66 69 6c 65 73 20 69 6e 20 74 68 69 73 20 64 69  files in this di
5fd0: 72 65 63 74 6f 72 79 20 2a 2f 0a 0a 20 20 69 42  rectory */..  iB
5fe0: 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79  egin = timeOfDay
5ff0: 28 29 3b 0a 23 69 66 64 65 66 20 5f 5f 75 6e 69  ();.#ifdef __uni
6000: 78 5f 5f 0a 20 20 73 69 67 6e 61 6c 28 53 49 47  x__.  signal(SIG
6010: 41 4c 52 4d 2c 20 74 69 6d 65 6f 75 74 48 61 6e  ALRM, timeoutHan
6020: 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20  dler);.#endif.  
6030: 67 2e 7a 41 72 67 76 30 20 3d 20 61 72 67 76 5b  g.zArgv0 = argv[
6040: 30 5d 3b 0a 20 20 7a 46 61 69 6c 43 6f 64 65 20  0];.  zFailCode 
6050: 3d 20 67 65 74 65 6e 76 28 22 54 45 53 54 5f 46  = getenv("TEST_F
6060: 41 49 4c 55 52 45 22 29 3b 0a 20 20 66 6f 72 28  AILURE");.  for(
6070: 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=1; i<argc; i++
6080: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
6090: 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  r *z = argv[i];.
60a0: 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
60b0: 27 20 29 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  ' ){.      z++;.
60c0: 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
60d0: 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  '-' ) z++;.     
60e0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 63   if( strcmp(z,"c
60f0: 65 6c 6c 2d 73 69 7a 65 2d 63 68 65 63 6b 22 29  ell-size-check")
6100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
6110: 65 6c 6c 53 7a 43 6b 46 6c 61 67 20 3d 20 31 3b  ellSzCkFlag = 1;
6120: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
6130: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
6140: 22 64 62 69 64 22 29 3d 3d 30 20 29 7b 0a 20 20  "dbid")==0 ){.  
6150: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67        if( i>=arg
6160: 63 2d 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72  c-1 ) fatalError
6170: 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  ("missing argume
6180: 6e 74 73 20 6f 6e 20 25 73 22 2c 20 61 72 67 76  nts on %s", argv
6190: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6f 6e  [i]);.        on
61a0: 6c 79 44 62 69 64 20 3d 20 69 6e 74 65 67 65 72  lyDbid = integer
61b0: 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29  Value(argv[++i])
61c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
61d0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
61e0: 2c 22 65 78 70 6f 72 74 2d 64 62 22 29 3d 3d 30  ,"export-db")==0
61f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6200: 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61  i>=argc-1 ) fata
6210: 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20  lError("missing 
6220: 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 22  arguments on %s"
6230: 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  , argv[i]);.    
6240: 20 20 20 20 7a 45 78 70 44 62 20 3d 20 61 72 67      zExpDb = arg
6250: 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 7d 65  v[++i];.      }e
6260: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
6270: 72 63 6d 70 28 7a 2c 22 65 78 70 6f 72 74 2d 73  rcmp(z,"export-s
6280: 71 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ql")==0 ){.     
6290: 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31     if( i>=argc-1
62a0: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d   ) fatalError("m
62b0: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73  issing arguments
62c0: 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69 5d   on %s", argv[i]
62d0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 78 70 53  );.        zExpS
62e0: 71 6c 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a  ql = argv[++i];.
62f0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
6300: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
6310: 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  help")==0 ){.   
6320: 20 20 20 20 20 73 68 6f 77 48 65 6c 70 28 29 3b       showHelp();
6330: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6340: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  0;.      }else. 
6350: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6360: 7a 2c 22 6c 69 6d 69 74 2d 6d 65 6d 22 29 3d 3d  z,"limit-mem")==
6370: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
6380: 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61 74   i>=argc-1 ) fat
6390: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  alError("missing
63a0: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73   arguments on %s
63b0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
63c0: 20 20 20 20 20 6e 4d 65 6d 20 3d 20 69 6e 74 65       nMem = inte
63d0: 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b  gerValue(argv[++
63e0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  i]);.      }else
63f0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
6400: 70 28 7a 2c 22 6c 69 6d 69 74 2d 76 64 62 65 22  p(z,"limit-vdbe"
6410: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6420: 76 64 62 65 4c 69 6d 69 74 46 6c 61 67 20 3d 20  vdbeLimitFlag = 
6430: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  1;.      }else. 
6440: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6450: 7a 2c 22 6c 6f 61 64 2d 73 71 6c 22 29 3d 3d 30  z,"load-sql")==0
6460: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49 6e 73   ){.        zIns
6470: 53 71 6c 20 3d 20 22 49 4e 53 45 52 54 20 49 4e  Sql = "INSERT IN
6480: 54 4f 20 78 73 71 6c 28 73 71 6c 74 65 78 74 29  TO xsql(sqltext)
6490: 20 56 41 4c 55 45 53 28 43 41 53 54 28 72 65 61   VALUES(CAST(rea
64a0: 64 66 69 6c 65 28 3f 31 29 20 41 53 20 74 65 78  dfile(?1) AS tex
64b0: 74 29 29 22 3b 0a 20 20 20 20 20 20 20 20 69 46  t))";.        iF
64c0: 69 72 73 74 49 6e 73 41 72 67 20 3d 20 69 2b 31  irstInsArg = i+1
64d0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
64e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
64f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
6500: 22 6c 6f 61 64 2d 64 62 22 29 3d 3d 30 20 29 7b  "load-db")==0 ){
6510: 0a 20 20 20 20 20 20 20 20 7a 49 6e 73 53 71 6c  .        zInsSql
6520: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
6530: 64 62 28 64 62 63 6f 6e 74 65 6e 74 29 20 56 41  db(dbcontent) VA
6540: 4c 55 45 53 28 72 65 61 64 66 69 6c 65 28 3f 31  LUES(readfile(?1
6550: 29 29 22 3b 0a 20 20 20 20 20 20 20 20 69 46 69  ))";.        iFi
6560: 72 73 74 49 6e 73 41 72 67 20 3d 20 69 2b 31 3b  rstInsArg = i+1;
6570: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
6580: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
6590: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
65a0: 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  m")==0 ){.      
65b0: 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20    if( i>=argc-1 
65c0: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69  ) fatalError("mi
65d0: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20  ssing arguments 
65e0: 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29  on %s", argv[i])
65f0: 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  ;.        zMsg =
6600: 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20   argv[++i];.    
6610: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
6620: 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 61 74 69  ( strcmp(z,"nati
6630: 76 65 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20  ve-vfs")==0 ){. 
6640: 20 20 20 20 20 20 20 6e 61 74 69 76 65 46 6c 61         nativeFla
6650: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 1;.      }el
6660: 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
6670: 63 6d 70 28 7a 2c 22 71 75 69 65 74 22 29 3d 3d  cmp(z,"quiet")==
6680: 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 71  0 || strcmp(z,"q
6690: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
66a0: 20 71 75 69 65 74 46 6c 61 67 20 3d 20 31 3b 0a   quietFlag = 1;.
66b0: 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 46          verboseF
66c0: 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  lag = 0;.      }
66d0: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
66e0: 74 72 63 6d 70 28 7a 2c 22 72 65 62 75 69 6c 64  trcmp(z,"rebuild
66f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
6700: 20 72 65 62 75 69 6c 64 46 6c 61 67 20 3d 20 31   rebuildFlag = 1
6710: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
6720: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6730: 2c 22 72 65 73 75 6c 74 2d 74 72 61 63 65 22 29  ,"result-trace")
6740: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
6750: 75 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c 5f 4f  unFlags |= SQL_O
6760: 55 54 50 55 54 3b 0a 20 20 20 20 20 20 7d 65 6c  UTPUT;.      }el
6770: 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  se.      if( str
6780: 63 6d 70 28 7a 2c 22 73 71 6c 69 64 22 29 3d 3d  cmp(z,"sqlid")==
6790: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
67a0: 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61 74   i>=argc-1 ) fat
67b0: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  alError("missing
67c0: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73   arguments on %s
67d0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
67e0: 20 20 20 20 20 6f 6e 6c 79 53 71 6c 69 64 20 3d       onlySqlid =
67f0: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72   integerValue(ar
6800: 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20  gv[++i]);.      
6810: 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
6820: 73 74 72 63 6d 70 28 7a 2c 22 74 69 6d 65 6f 75  strcmp(z,"timeou
6830: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
6840: 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20    if( i>=argc-1 
6850: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69  ) fatalError("mi
6860: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20  ssing arguments 
6870: 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29  on %s", argv[i])
6880: 3b 0a 20 20 20 20 20 20 20 20 69 54 69 6d 65 6f  ;.        iTimeo
6890: 75 74 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75  ut = integerValu
68a0: 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20  e(argv[++i]);.  
68b0: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
68c0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 74 69  if( strcmp(z,"ti
68d0: 6d 65 6f 75 74 2d 74 65 73 74 22 29 3d 3d 30 20  meout-test")==0 
68e0: 29 7b 0a 20 20 20 20 20 20 20 20 74 69 6d 65 6f  ){.        timeo
68f0: 75 74 54 65 73 74 20 3d 20 31 3b 0a 23 69 66 6e  utTest = 1;.#ifn
6900: 64 65 66 20 5f 5f 75 6e 69 78 5f 5f 0a 20 20 20  def __unix__.   
6910: 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28       fatalError(
6920: 22 74 69 6d 65 6f 75 74 20 69 73 20 6e 6f 74 20  "timeout is not 
6930: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 6e 6f 6e  available on non
6940: 2d 75 6e 69 78 20 73 79 73 74 65 6d 73 22 29 3b  -unix systems");
6950: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
6960: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
6970: 72 63 6d 70 28 7a 2c 22 76 65 72 62 6f 73 65 22  rcmp(z,"verbose"
6980: 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  )==0 || strcmp(z
6990: 2c 22 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,"v")==0 ){.    
69a0: 20 20 20 20 71 75 69 65 74 46 6c 61 67 20 3d 20      quietFlag = 
69b0: 30 3b 0a 20 20 20 20 20 20 20 20 76 65 72 62 6f  0;.        verbo
69c0: 73 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  seFlag = 1;.    
69d0: 20 20 20 20 72 75 6e 46 6c 61 67 73 20 7c 3d 20      runFlags |= 
69e0: 53 51 4c 5f 54 52 41 43 45 3b 0a 20 20 20 20 20  SQL_TRACE;.     
69f0: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20   }else.      {. 
6a00: 20 20 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f         fatalErro
6a10: 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  r("unknown optio
6a20: 6e 3a 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29  n: %s", argv[i])
6a30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6a40: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 72 63 44  lse{.      nSrcD
6a50: 62 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 53 72 63  b++;.      azSrc
6a60: 44 62 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c 6f  Db = safe_reallo
6a70: 63 28 61 7a 53 72 63 44 62 2c 20 6e 53 72 63 44  c(azSrcDb, nSrcD
6a80: 62 2a 73 69 7a 65 6f 66 28 61 7a 53 72 63 44 62  b*sizeof(azSrcDb
6a90: 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 61 7a 53  [0]));.      azS
6aa0: 72 63 44 62 5b 6e 53 72 63 44 62 2d 31 5d 20 3d  rcDb[nSrcDb-1] =
6ab0: 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 7d 0a   argv[i];.    }.
6ac0: 20 20 7d 0a 20 20 69 66 28 20 6e 53 72 63 44 62    }.  if( nSrcDb
6ad0: 3d 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72  ==0 ) fatalError
6ae0: 28 22 6e 6f 20 73 6f 75 72 63 65 20 64 61 74 61  ("no source data
6af0: 62 61 73 65 20 73 70 65 63 69 66 69 65 64 22 29  base specified")
6b00: 3b 0a 20 20 69 66 28 20 6e 53 72 63 44 62 3e 31  ;.  if( nSrcDb>1
6b10: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 4d 73 67   ){.    if( zMsg
6b20: 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 45   ){.      fatalE
6b30: 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 63 68 61  rror("cannot cha
6b40: 6e 67 65 20 74 68 65 20 64 65 73 63 72 69 70 74  nge the descript
6b50: 69 6f 6e 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e  ion of more than
6b60: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 22 29 3b   one database");
6b70: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
6b80: 49 6e 73 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  InsSql ){.      
6b90: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
6ba0: 6f 74 20 69 6d 70 6f 72 74 20 69 6e 74 6f 20 6d  ot import into m
6bb0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
6bc0: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 0a 20  abase");.    }. 
6bd0: 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73   }..  /* Process
6be0: 20 65 61 63 68 20 73 6f 75 72 63 65 20 64 61 74   each source dat
6bf0: 61 62 61 73 65 20 73 65 70 61 72 61 74 65 6c 79  abase separately
6c00: 20 2a 2f 0a 20 20 66 6f 72 28 69 53 72 63 44 62   */.  for(iSrcDb
6c10: 3d 30 3b 20 69 53 72 63 44 62 3c 6e 53 72 63 44  =0; iSrcDb<nSrcD
6c20: 62 3b 20 69 53 72 63 44 62 2b 2b 29 7b 0a 20 20  b; iSrcDb++){.  
6c30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
6c40: 70 65 6e 28 61 7a 53 72 63 44 62 5b 69 53 72 63  pen(azSrcDb[iSrc
6c50: 44 62 5d 2c 20 26 64 62 29 3b 0a 20 20 20 20 69  Db], &db);.    i
6c60: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66  f( rc ){.      f
6c70: 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f  atalError("canno
6c80: 74 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61  t open source da
6c90: 74 61 62 61 73 65 20 25 73 20 2d 20 25 73 22 2c  tabase %s - %s",
6ca0: 0a 20 20 20 20 20 20 61 7a 53 72 63 44 62 5b 69  .      azSrcDb[i
6cb0: 53 72 63 44 62 5d 2c 20 73 71 6c 69 74 65 33 5f  SrcDb], sqlite3_
6cc0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
6cd0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
6ce0: 74 65 33 5f 65 78 65 63 28 64 62 2c 0a 20 20 20  te3_exec(db,.   
6cf0: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
6d00: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
6d10: 64 62 28 5c 6e 22 0a 20 20 20 20 20 20 20 22 20  db(\n".       " 
6d20: 20 64 62 69 64 20 49 4e 54 45 47 45 52 20 50 52   dbid INTEGER PR
6d30: 49 4d 41 52 59 20 4b 45 59 2c 20 2d 2d 20 64 61  IMARY KEY, -- da
6d40: 74 61 62 61 73 65 20 69 64 5c 6e 22 0a 20 20 20  tabase id\n".   
6d50: 20 20 20 20 22 20 20 64 62 63 6f 6e 74 65 6e 74      "  dbcontent
6d60: 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20   BLOB           
6d70: 20 2d 2d 20 64 61 74 61 62 61 73 65 20 64 69 73   -- database dis
6d80: 6b 20 66 69 6c 65 20 69 6d 61 67 65 5c 6e 22 0a  k file image\n".
6d90: 20 20 20 20 20 20 20 22 29 3b 5c 6e 22 0a 20 20         ");\n".  
6da0: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
6db0: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
6dc0: 20 78 73 71 6c 28 5c 6e 22 0a 20 20 20 20 20 20   xsql(\n".      
6dd0: 20 22 20 20 73 71 6c 69 64 20 49 4e 54 45 47 45   "  sqlid INTEGE
6de0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20  R PRIMARY KEY,  
6df0: 20 2d 2d 20 53 51 4c 20 73 63 72 69 70 74 20 69   -- SQL script i
6e00: 64 5c 6e 22 0a 20 20 20 20 20 20 20 22 20 20 73  d\n".       "  s
6e10: 71 6c 74 65 78 74 20 54 45 58 54 20 20 20 20 20  qltext TEXT     
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 54              -- T
6e30: 65 78 74 20 6f 66 20 53 51 4c 20 73 74 61 74 65  ext of SQL state
6e40: 6d 65 6e 74 73 20 74 6f 20 72 75 6e 5c 6e 22 0a  ments to run\n".
6e50: 20 20 20 20 20 20 20 22 29 3b 22 0a 20 20 20 20         ");".    
6e60: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
6e70: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 72   IF NOT EXISTS r
6e80: 65 61 64 6d 65 28 5c 6e 22 0a 20 20 20 20 20 20  eadme(\n".      
6e90: 20 22 20 20 6d 73 67 20 54 45 58 54 20 2d 2d 20   "  msg TEXT -- 
6ea0: 48 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64  Human-readable d
6eb0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
6ec0: 69 73 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20  is file\n".     
6ed0: 20 20 22 29 3b 22 2c 20 30 2c 20 30 2c 20 30 29    ");", 0, 0, 0)
6ee0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 66  ;.    if( rc ) f
6ef0: 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f  atalError("canno
6f00: 74 20 63 72 65 61 74 65 20 73 63 68 65 6d 61 3a  t create schema:
6f10: 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72   %s", sqlite3_er
6f20: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 69  rmsg(db));.    i
6f30: 66 28 20 7a 4d 73 67 20 29 7b 0a 20 20 20 20 20  f( zMsg ){.     
6f40: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
6f50: 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
6f60: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
6f70: 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54            "DELET
6f80: 45 20 46 52 4f 4d 20 72 65 61 64 6d 65 3b 20 49  E FROM readme; I
6f90: 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 61 64 6d  NSERT INTO readm
6fa0: 65 28 6d 73 67 29 20 56 41 4c 55 45 53 28 25 51  e(msg) VALUES(%Q
6fb0: 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  )", zMsg);.     
6fc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
6fd0: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  ec(db, zSql, 0, 
6fe0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
6ff0: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
7000: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
7010: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
7020: 6f 74 20 63 68 61 6e 67 65 20 64 65 73 63 72 69  ot change descri
7030: 70 74 69 6f 6e 3a 20 25 73 22 2c 20 73 71 6c 69  ption: %s", sqli
7040: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
7050: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
7060: 49 6e 73 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  InsSql ){.      
7070: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7080: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 72 65 61  unction(db, "rea
7090: 64 66 69 6c 65 22 2c 20 31 2c 20 53 51 4c 49 54  dfile", 1, SQLIT
70a0: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70c0: 20 20 20 20 20 20 20 20 20 72 65 61 64 66 69 6c           readfil
70d0: 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  eFunc, 0, 0);.  
70e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
70f0: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
7100: 7a 49 6e 73 53 71 6c 2c 20 2d 31 2c 20 26 70 53  zInsSql, -1, &pS
7110: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tmt, 0);.      i
7120: 66 28 20 72 63 20 29 20 66 61 74 61 6c 45 72 72  f( rc ) fatalErr
7130: 6f 72 28 22 63 61 6e 6e 6f 74 20 70 72 65 70 61  or("cannot prepa
7140: 72 65 20 73 74 61 74 65 6d 65 6e 74 20 5b 25 73  re statement [%s
7150: 5d 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ]: %s",.        
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 7a 49 6e 73 53 71 6c 2c 20 73 71 6c 69 74    zInsSql, sqlit
7180: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
7190: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
71a0: 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42 45 47  e3_exec(db, "BEG
71b0: 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  IN", 0, 0, 0);. 
71c0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 66 61       if( rc ) fa
71d0: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
71e0: 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
71f0: 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f  tion");.      fo
7200: 72 28 69 3d 69 46 69 72 73 74 49 6e 73 41 72 67  r(i=iFirstInsArg
7210: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
7220: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7230: 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
7240: 20 31 2c 20 61 72 67 76 5b 69 5d 2c 20 2d 31 2c   1, argv[i], -1,
7250: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
7260: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7270: 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
7280: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7290: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
72a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
72b0: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 69 6e  ) fatalError("in
72c0: 73 65 72 74 20 66 61 69 6c 65 64 20 66 6f 72 20  sert failed for 
72d0: 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20  %s", argv[i]);. 
72e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
72f0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
7300: 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tmt);.      rc =
7310: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62   sqlite3_exec(db
7320: 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
7330: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
7340: 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  rc ) fatalError(
7350: 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74  "cannot commit t
7360: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 3a 20  he transaction: 
7370: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  %s", sqlite3_err
7380: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
7390: 72 65 62 75 69 6c 64 5f 64 61 74 61 62 61 73 65  rebuild_database
73a0: 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (db);.      sqli
73b0: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
73c0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
73d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 78     }.    if( zEx
73e0: 70 44 62 21 3d 30 20 7c 7c 20 7a 45 78 70 53 71  pDb!=0 || zExpSq
73f0: 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  l!=0 ){.      sq
7400: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7410: 63 74 69 6f 6e 28 64 62 2c 20 22 77 72 69 74 65  ction(db, "write
7420: 66 69 6c 65 22 2c 20 32 2c 20 53 51 4c 49 54 45  file", 2, SQLITE
7430: 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 20 20 20 20 20 20 20 20 77 72 69 74 65 66 69 6c          writefil
7460: 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  eFunc, 0, 0);.  
7470: 20 20 20 20 69 66 28 20 7a 45 78 70 44 62 21 3d      if( zExpDb!=
7480: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  0 ){.        con
7490: 73 74 20 63 68 61 72 20 2a 7a 45 78 44 62 20 3d  st char *zExDb =
74a0: 20 0a 20 20 20 20 20 20 20 20 20 20 22 53 45 4c   .          "SEL
74b0: 45 43 54 20 77 72 69 74 65 66 69 6c 65 28 70 72  ECT writefile(pr
74c0: 69 6e 74 66 28 27 25 73 2f 64 62 25 30 36 64 2e  intf('%s/db%06d.
74d0: 64 62 27 2c 3f 31 2c 64 62 69 64 29 2c 64 62 63  db',?1,dbid),dbc
74e0: 6f 6e 74 65 6e 74 29 2c 22 0a 20 20 20 20 20 20  ontent),".      
74f0: 20 20 20 20 22 20 20 20 20 20 20 20 64 62 69 64      "       dbid
7500: 2c 20 70 72 69 6e 74 66 28 27 25 73 2f 64 62 25  , printf('%s/db%
7510: 30 36 64 2e 64 62 27 2c 3f 31 2c 64 62 69 64 29  06d.db',?1,dbid)
7520: 2c 20 6c 65 6e 67 74 68 28 64 62 63 6f 6e 74 65  , length(dbconte
7530: 6e 74 29 22 0a 20 20 20 20 20 20 20 20 20 20 22  nt)".          "
7540: 20 20 46 52 4f 4d 20 64 62 20 57 48 45 52 45 20    FROM db WHERE 
7550: 3f 32 3c 30 20 4f 52 20 64 62 69 64 3d 3f 32 3b  ?2<0 OR dbid=?2;
7560: 22 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ";.        rc = 
7570: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
7580: 76 32 28 64 62 2c 20 7a 45 78 44 62 2c 20 2d 31  v2(db, zExDb, -1
7590: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
75a0: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 66        if( rc ) f
75b0: 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f  atalError("canno
75c0: 74 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d  t prepare statem
75d0: 65 6e 74 20 5b 25 73 5d 3a 20 25 73 22 2c 0a 20  ent [%s]: %s",. 
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 20 20 20 20 20 20 20 20 20 7a 45 78 44 62             zExDb
7600: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
7610: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  (db));.        s
7620: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
7630: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 7a 45 78  64(pStmt, 1, zEx
7640: 70 44 62 2c 20 73 74 72 6c 65 6e 28 7a 45 78 70  pDb, strlen(zExp
7650: 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Db),.           
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 2c 20   SQLITE_STATIC, 
7680: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
7690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
76a0: 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c  nd_int(pStmt, 2,
76b0: 20 6f 6e 6c 79 44 62 69 64 29 3b 0a 20 20 20 20   onlyDbid);.    
76c0: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
76d0: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
76e0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
76f0: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
7700: 77 72 69 74 65 20 64 62 2d 25 64 20 28 25 64 20  write db-%d (%d 
7710: 62 79 74 65 73 29 20 69 6e 74 6f 20 25 73 5c 6e  bytes) into %s\n
7720: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7730: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
7740: 6e 74 28 70 53 74 6d 74 2c 31 29 2c 0a 20 20 20  nt(pStmt,1),.   
7750: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7760: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
7770: 6d 74 2c 33 29 2c 0a 20 20 20 20 20 20 20 20 20  mt,3),.         
7780: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
7790: 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29  mn_text(pStmt,2)
77a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
77b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
77c0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
77d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
77e0: 7a 45 78 70 53 71 6c 21 3d 30 20 29 7b 0a 20 20  zExpSql!=0 ){.  
77f0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
7800: 20 2a 7a 45 78 53 71 6c 20 3d 20 0a 20 20 20 20   *zExSql = .    
7810: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 77 72        "SELECT wr
7820: 69 74 65 66 69 6c 65 28 70 72 69 6e 74 66 28 27  itefile(printf('
7830: 25 73 2f 73 71 6c 25 30 36 64 2e 74 78 74 27 2c  %s/sql%06d.txt',
7840: 3f 31 2c 73 71 6c 69 64 29 2c 73 71 6c 74 65 78  ?1,sqlid),sqltex
7850: 74 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22  t),".          "
7860: 20 20 20 20 20 20 20 73 71 6c 69 64 2c 20 70 72         sqlid, pr
7870: 69 6e 74 66 28 27 25 73 2f 73 71 6c 25 30 36 64  intf('%s/sql%06d
7880: 2e 74 78 74 27 2c 3f 31 2c 73 71 6c 69 64 29 2c  .txt',?1,sqlid),
7890: 20 6c 65 6e 67 74 68 28 73 71 6c 74 65 78 74 29   length(sqltext)
78a0: 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 46  ".          "  F
78b0: 52 4f 4d 20 78 73 71 6c 20 57 48 45 52 45 20 3f  ROM xsql WHERE ?
78c0: 32 3c 30 20 4f 52 20 73 71 6c 69 64 3d 3f 32 3b  2<0 OR sqlid=?2;
78d0: 22 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ";.        rc = 
78e0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
78f0: 76 32 28 64 62 2c 20 7a 45 78 53 71 6c 2c 20 2d  v2(db, zExSql, -
7900: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
7910: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
7920: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
7930: 6f 74 20 70 72 65 70 61 72 65 20 73 74 61 74 65  ot prepare state
7940: 6d 65 6e 74 20 5b 25 73 5d 3a 20 25 73 22 2c 0a  ment [%s]: %s",.
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 78 53              zExS
7970: 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ql, sqlite3_errm
7980: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20  sg(db));.       
7990: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
79a0: 78 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 7a  xt64(pStmt, 1, z
79b0: 45 78 70 53 71 6c 2c 20 73 74 72 6c 65 6e 28 7a  ExpSql, strlen(z
79c0: 45 78 70 53 71 6c 29 2c 0a 20 20 20 20 20 20 20  ExpSql),.       
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54       SQLITE_STAT
79f0: 49 43 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  IC, SQLITE_UTF8)
7a00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7a10: 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
7a20: 2c 20 32 2c 20 6f 6e 6c 79 53 71 6c 69 64 29 3b  , 2, onlySqlid);
7a30: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
7a40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
7a50: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
7a60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  ){.          pri
7a70: 6e 74 66 28 22 77 72 69 74 65 20 73 71 6c 2d 25  ntf("write sql-%
7a80: 64 20 28 25 64 20 62 79 74 65 73 29 20 69 6e 74  d (%d bytes) int
7a90: 6f 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  o %s\n",.       
7aa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
7ab0: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31  lumn_int(pStmt,1
7ac0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
7ad0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
7ae0: 6e 74 28 70 53 74 6d 74 2c 33 29 2c 0a 20 20 20  nt(pStmt,3),.   
7af0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7b00: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
7b10: 74 6d 74 2c 32 29 29 3b 0a 20 20 20 20 20 20 20  tmt,2));.       
7b20: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
7b30: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
7b40: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
7b50: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
7b60: 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  db);.      retur
7b70: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  n 0;.    }.  .  
7b80: 20 20 2f 2a 20 4c 6f 61 64 20 61 6c 6c 20 53 51    /* Load all SQ
7b90: 4c 20 73 63 72 69 70 74 20 63 6f 6e 74 65 6e 74  L script content
7ba0: 20 61 6e 64 20 61 6c 6c 20 69 6e 69 74 69 61 6c   and all initial
7bb0: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 73   database images
7bc0: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
7bd0: 20 73 6f 75 72 63 65 20 64 62 0a 20 20 20 20 2a   source db.    *
7be0: 2f 0a 20 20 20 20 62 6c 6f 62 4c 69 73 74 4c 6f  /.    blobListLo
7bf0: 61 64 46 72 6f 6d 44 62 28 64 62 2c 20 22 53 45  adFromDb(db, "SE
7c00: 4c 45 43 54 20 73 71 6c 69 64 2c 20 73 71 6c 74  LECT sqlid, sqlt
7c10: 65 78 74 20 46 52 4f 4d 20 78 73 71 6c 22 2c 20  ext FROM xsql", 
7c20: 6f 6e 6c 79 53 71 6c 69 64 2c 0a 20 20 20 20 20  onlySqlid,.     
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c40: 20 20 20 20 20 20 26 67 2e 6e 53 71 6c 2c 20 26        &g.nSql, &
7c50: 67 2e 70 46 69 72 73 74 53 71 6c 29 3b 0a 20 20  g.pFirstSql);.  
7c60: 20 20 69 66 28 20 67 2e 6e 53 71 6c 3d 3d 30 20    if( g.nSql==0 
7c70: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6e 65  ) fatalError("ne
7c80: 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ed at least one 
7c90: 53 51 4c 20 73 63 72 69 70 74 22 29 3b 0a 20 20  SQL script");.  
7ca0: 20 20 62 6c 6f 62 4c 69 73 74 4c 6f 61 64 46 72    blobListLoadFr
7cb0: 6f 6d 44 62 28 64 62 2c 20 22 53 45 4c 45 43 54  omDb(db, "SELECT
7cc0: 20 64 62 69 64 2c 20 64 62 63 6f 6e 74 65 6e 74   dbid, dbcontent
7cd0: 20 46 52 4f 4d 20 64 62 22 2c 20 6f 6e 6c 79 44   FROM db", onlyD
7ce0: 62 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  bid,.           
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 26 67 2e 6e              &g.n
7d00: 44 62 2c 20 26 67 2e 70 46 69 72 73 74 44 62 29  Db, &g.pFirstDb)
7d10: 3b 0a 20 20 20 20 69 66 28 20 67 2e 6e 44 62 3d  ;.    if( g.nDb=
7d20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 2e 70 46  =0 ){.      g.pF
7d30: 69 72 73 74 44 62 20 3d 20 73 61 66 65 5f 72 65  irstDb = safe_re
7d40: 61 6c 6c 6f 63 28 30 2c 20 73 69 7a 65 6f 66 28  alloc(0, sizeof(
7d50: 42 6c 6f 62 29 29 3b 0a 20 20 20 20 20 20 6d 65  Blob));.      me
7d60: 6d 73 65 74 28 67 2e 70 46 69 72 73 74 44 62 2c  mset(g.pFirstDb,
7d70: 20 30 2c 20 73 69 7a 65 6f 66 28 42 6c 6f 62 29   0, sizeof(Blob)
7d80: 29 3b 0a 20 20 20 20 20 20 67 2e 70 46 69 72 73  );.      g.pFirs
7d90: 74 44 62 2d 3e 69 64 20 3d 20 31 3b 0a 20 20 20  tDb->id = 1;.   
7da0: 20 20 20 67 2e 70 46 69 72 73 74 44 62 2d 3e 73     g.pFirstDb->s
7db0: 65 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 2e  eq = 0;.      g.
7dc0: 6e 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  nDb = 1;.      s
7dd0: 71 6c 46 75 7a 7a 20 3d 20 31 3b 0a 20 20 20 20  qlFuzz = 1;.    
7de0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 50 72 69 6e  }.  .    /* Prin
7df0: 74 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f  t the descriptio
7e00: 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  n, if there is o
7e10: 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71  ne */.    if( !q
7e20: 75 69 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  uietFlag ){.    
7e30: 20 20 7a 44 62 4e 61 6d 65 20 3d 20 61 7a 53 72    zDbName = azSr
7e40: 63 44 62 5b 69 53 72 63 44 62 5d 3b 0a 20 20 20  cDb[iSrcDb];.   
7e50: 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 44     i = strlen(zD
7e60: 62 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20  bName) - 1;.    
7e70: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
7e80: 7a 44 62 4e 61 6d 65 5b 69 2d 31 5d 21 3d 27 2f  zDbName[i-1]!='/
7e90: 27 20 26 26 20 7a 44 62 4e 61 6d 65 5b 69 2d 31  ' && zDbName[i-1
7ea0: 5d 21 3d 27 5c 5c 27 20 29 7b 20 69 2d 2d 3b 20  ]!='\\' ){ i--; 
7eb0: 7d 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 20  }.      zDbName 
7ec0: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 73 71 6c 69  += i;.      sqli
7ed0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
7ee0: 62 2c 20 22 53 45 4c 45 43 54 20 6d 73 67 20 46  b, "SELECT msg F
7ef0: 52 4f 4d 20 72 65 61 64 6d 65 22 2c 20 2d 31 2c  ROM readme", -1,
7f00: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
7f10: 20 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20     if( pStmt && 
7f20: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
7f30: 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
7f40: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
7f50: 66 28 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 44  f("%s: %s\n", zD
7f60: 62 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 63  bName, sqlite3_c
7f70: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
7f80: 2c 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ,0));.      }.  
7f90: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
7fa0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
7fb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 62 75 69   }..    /* Rebui
7fc0: 6c 64 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ld the database,
7fd0: 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a 2f   if requested */
7fe0: 0a 20 20 20 20 69 66 28 20 72 65 62 75 69 6c 64  .    if( rebuild
7ff0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  Flag ){.      if
8000: 28 20 21 71 75 69 65 74 46 6c 61 67 20 29 7b 0a  ( !quietFlag ){.
8010: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
8020: 25 73 3a 20 72 65 62 75 69 6c 64 69 6e 67 2e 2e  %s: rebuilding..
8030: 2e 20 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  . ", zDbName);. 
8040: 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74         fflush(st
8050: 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dout);.      }. 
8060: 20 20 20 20 20 72 65 62 75 69 6c 64 5f 64 61 74       rebuild_dat
8070: 61 62 61 73 65 28 64 62 29 3b 0a 20 20 20 20 20  abase(db);.     
8080: 20 69 66 28 20 21 71 75 69 65 74 46 6c 61 67 20   if( !quietFlag 
8090: 29 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e  ) printf("done\n
80a0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  ");.    }.  .   
80b0: 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 73 6f   /* Close the so
80c0: 75 72 63 65 20 64 61 74 61 62 61 73 65 2e 20 20  urce database.  
80d0: 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 53  Verify that no S
80e0: 51 4c 69 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  QLite memory all
80f0: 6f 63 61 74 69 6f 6e 73 20 61 72 65 0a 20 20 20  ocations are.   
8100: 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e   ** outstanding.
8110: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
8120: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
8130: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d     if( sqlite3_m
8140: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3e 30 20 29  emory_used()>0 )
8150: 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 45 72 72  {.      fatalErr
8160: 6f 72 28 22 53 51 4c 69 74 65 20 68 61 73 20 6d  or("SQLite has m
8170: 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 65 66  emory in use bef
8180: 6f 72 65 20 74 68 65 20 73 74 61 72 74 20 6f 66  ore the start of
8190: 20 74 65 73 74 69 6e 67 22 29 3b 0a 20 20 20 20   testing");.    
81a0: 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20  }..    /* Limit 
81b0: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
81c0: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a  , if requested *
81d0: 2f 0a 20 20 20 20 69 66 28 20 6e 4d 65 6d 3e 30  /.    if( nMem>0
81e0: 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   ){.      void *
81f0: 70 48 65 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  pHeap;.      sql
8200: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b  ite3_shutdown();
8210: 0a 20 20 20 20 20 20 70 48 65 61 70 20 3d 20 6d  .      pHeap = m
8220: 61 6c 6c 6f 63 28 6e 4d 65 6d 29 3b 0a 20 20 20  alloc(nMem);.   
8230: 20 20 20 69 66 28 20 70 48 65 61 70 3d 3d 30 20     if( pHeap==0 
8240: 29 7b 0a 20 20 20 20 20 20 20 20 66 61 74 61 6c  ){.        fatal
8250: 45 72 72 6f 72 28 22 66 61 69 6c 65 64 20 74 6f  Error("failed to
8260: 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74   allocate %d byt
8270: 65 73 20 6f 66 20 68 65 61 70 20 6d 65 6d 6f 72  es of heap memor
8280: 79 22 2c 20 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  y", nMem);.     
8290: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
82a0: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
82b0: 4f 4e 46 49 47 5f 48 45 41 50 2c 20 70 48 65 61  ONFIG_HEAP, pHea
82c0: 70 2c 20 6e 4d 65 6d 2c 20 31 32 38 29 3b 0a 20  p, nMem, 128);. 
82d0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
82e0: 65 67 69 73 74 65 72 20 74 68 65 20 69 6e 2d 6d  egister the in-m
82f0: 65 6d 6f 72 79 20 76 69 72 74 75 61 6c 20 66 69  emory virtual fi
8300: 6c 65 73 79 73 74 65 6d 0a 20 20 20 20 2a 2f 0a  lesystem.    */.
8310: 20 20 20 20 66 6f 72 6d 61 74 56 66 73 28 29 3b      formatVfs();
8320: 0a 20 20 20 20 69 6e 6d 65 6d 56 66 73 52 65 67  .    inmemVfsReg
8330: 69 73 74 65 72 28 29 3b 0a 20 20 20 20 0a 20 20  ister();.    .  
8340: 20 20 2f 2a 20 52 75 6e 20 61 20 74 65 73 74 20    /* Run a test 
8350: 75 73 69 6e 67 20 65 61 63 68 20 53 51 4c 20 73  using each SQL s
8360: 63 72 69 70 74 20 61 67 61 69 6e 73 74 20 65 61  cript against ea
8370: 63 68 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ch database..   
8380: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 76 65 72   */.    if( !ver
8390: 62 6f 73 65 46 6c 61 67 20 26 26 20 21 71 75 69  boseFlag && !qui
83a0: 65 74 46 6c 61 67 20 29 20 70 72 69 6e 74 66 28  etFlag ) printf(
83b0: 22 25 73 3a 22 2c 20 7a 44 62 4e 61 6d 65 29 3b  "%s:", zDbName);
83c0: 0a 20 20 20 20 66 6f 72 28 70 53 71 6c 3d 67 2e  .    for(pSql=g.
83d0: 70 46 69 72 73 74 53 71 6c 3b 20 70 53 71 6c 3b  pFirstSql; pSql;
83e0: 20 70 53 71 6c 3d 70 53 71 6c 2d 3e 70 4e 65 78   pSql=pSql->pNex
83f0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 44  t){.      for(pD
8400: 62 3d 67 2e 70 46 69 72 73 74 44 62 3b 20 70 44  b=g.pFirstDb; pD
8410: 62 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4e 65 78  b; pDb=pDb->pNex
8420: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
8430: 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 20 20 20  openFlags;.     
8440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8450: 56 66 73 20 3d 20 22 69 6e 6d 65 6d 22 3b 0a 20  Vfs = "inmem";. 
8460: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8470: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 67  nprintf(sizeof(g
8480: 2e 7a 54 65 73 74 4e 61 6d 65 29 2c 20 67 2e 7a  .zTestName), g.z
8490: 54 65 73 74 4e 61 6d 65 2c 20 22 73 71 6c 69 64  TestName, "sqlid
84a0: 3d 25 64 2c 64 62 69 64 3d 25 64 22 2c 0a 20 20  =%d,dbid=%d",.  
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 20 20 20 20 20 70 53 71 6c 2d 3e 69 64 2c         pSql->id,
84d0: 20 70 44 62 2d 3e 69 64 29 3b 0a 20 20 20 20 20   pDb->id);.     
84e0: 20 20 20 69 66 28 20 76 65 72 62 6f 73 65 46 6c     if( verboseFl
84f0: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
8500: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 67  printf("%s\n", g
8510: 2e 7a 54 65 73 74 4e 61 6d 65 29 3b 0a 20 20 20  .zTestName);.   
8520: 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74         fflush(st
8530: 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  dout);.        }
8540: 65 6c 73 65 20 69 66 28 20 21 71 75 69 65 74 46  else if( !quietF
8550: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
8560: 20 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 76   static int prev
8570: 41 6d 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Amt = -1;.      
8580: 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 53      int idx = pS
8590: 71 6c 2d 3e 73 65 71 2a 67 2e 6e 44 62 20 2b 20  ql->seq*g.nDb + 
85a0: 70 44 62 2d 3e 69 64 20 2d 20 31 3b 0a 20 20 20  pDb->id - 1;.   
85b0: 20 20 20 20 20 20 20 69 6e 74 20 61 6d 74 20 3d         int amt =
85c0: 20 69 64 78 2a 31 30 2f 28 67 2e 6e 44 62 2a 67   idx*10/(g.nDb*g
85d0: 2e 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  .nSql);.        
85e0: 20 20 69 66 28 20 61 6d 74 21 3d 70 72 65 76 41    if( amt!=prevA
85f0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
8600: 20 20 70 72 69 6e 74 66 28 22 20 25 64 25 25 22    printf(" %d%%"
8610: 2c 20 61 6d 74 2a 31 30 29 3b 0a 20 20 20 20 20  , amt*10);.     
8620: 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74         fflush(st
8630: 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  dout);.         
8640: 20 20 20 70 72 65 76 41 6d 74 20 3d 20 61 6d 74     prevAmt = amt
8650: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8660: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8670: 63 72 65 61 74 65 56 46 69 6c 65 28 22 6d 61 69  createVFile("mai
8680: 6e 2e 64 62 22 2c 20 70 44 62 2d 3e 73 7a 2c 20  n.db", pDb->sz, 
8690: 70 44 62 2d 3e 61 29 3b 0a 20 20 20 20 20 20 20  pDb->a);.       
86a0: 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 53 51 4c   openFlags = SQL
86b0: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
86c0: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
86d0: 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20  ADWRITE;.       
86e0: 20 69 66 28 20 6e 61 74 69 76 65 46 6c 61 67 20   if( nativeFlag 
86f0: 26 26 20 70 44 62 2d 3e 73 7a 3d 3d 30 20 29 7b  && pDb->sz==0 ){
8700: 0a 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 46  .          openF
8710: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
8720: 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
8730: 20 20 20 20 20 20 7a 56 66 73 20 3d 20 30 3b 0a        zVfs = 0;.
8740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8750: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
8760: 70 65 6e 5f 76 32 28 22 6d 61 69 6e 2e 64 62 22  pen_v2("main.db"
8770: 2c 20 26 64 62 2c 20 6f 70 65 6e 46 6c 61 67 73  , &db, openFlags
8780: 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 20 20 20  , zVfs);.       
8790: 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 45   if( rc ) fatalE
87a0: 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65  rror("cannot ope
87b0: 6e 20 69 6e 6d 65 6d 20 64 61 74 61 62 61 73 65  n inmem database
87c0: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
87d0: 63 65 6c 6c 53 7a 43 6b 46 6c 61 67 20 29 20 72  cellSzCkFlag ) r
87e0: 75 6e 53 71 6c 28 64 62 2c 20 22 50 52 41 47 4d  unSql(db, "PRAGM
87f0: 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63  A cell_size_chec
8800: 6b 3d 4f 4e 22 2c 20 72 75 6e 46 6c 61 67 73 29  k=ON", runFlags)
8810: 3b 0a 20 20 20 20 20 20 20 20 73 65 74 41 6c 61  ;.        setAla
8820: 72 6d 28 69 54 69 6d 65 6f 75 74 29 3b 0a 23 69  rm(iTimeout);.#i
8830: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8840: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
8850: 41 43 4b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ACK.        if( 
8860: 73 71 6c 46 75 7a 7a 20 7c 7c 20 76 64 62 65 4c  sqlFuzz || vdbeL
8870: 69 6d 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  imitFlag ){.    
8880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
8890: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 64  ogress_handler(d
88a0: 62 2c 20 31 30 30 30 30 30 2c 20 70 72 6f 67 72  b, 100000, progr
88b0: 65 73 73 48 61 6e 64 6c 65 72 2c 20 26 76 64 62  essHandler, &vdb
88c0: 65 4c 69 6d 69 74 46 6c 61 67 29 3b 0a 20 20 20  eLimitFlag);.   
88d0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
88e0: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
88f0: 20 20 20 20 72 75 6e 53 71 6c 28 64 62 2c 20 28      runSql(db, (
8900: 63 68 61 72 2a 29 70 53 71 6c 2d 3e 61 2c 20 72  char*)pSql->a, r
8910: 75 6e 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  unFlags);.      
8920: 20 20 7d 77 68 69 6c 65 28 20 74 69 6d 65 6f 75    }while( timeou
8930: 74 54 65 73 74 20 29 3b 0a 20 20 20 20 20 20 20  tTest );.       
8940: 20 73 65 74 41 6c 61 72 6d 28 30 29 3b 0a 20 20   setAlarm(0);.  
8950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
8960: 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ose(db);.       
8970: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d   if( sqlite3_mem
8980: 6f 72 79 5f 75 73 65 64 28 29 3e 30 20 29 20 66  ory_used()>0 ) f
8990: 61 74 61 6c 45 72 72 6f 72 28 22 6d 65 6d 6f 72  atalError("memor
89a0: 79 20 6c 65 61 6b 22 29 3b 0a 20 20 20 20 20 20  y leak");.      
89b0: 20 20 72 65 66 6f 72 6d 61 74 56 66 73 28 29 3b    reformatVfs();
89c0: 0a 20 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b  .        nTest++
89d0: 3b 0a 20 20 20 20 20 20 20 20 67 2e 7a 54 65 73  ;.        g.zTes
89e0: 74 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 0a 20  tName[0] = 0;.. 
89f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61         /* Simula
8a00: 74 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  te an error if t
8a10: 68 65 20 54 45 53 54 5f 46 41 49 4c 55 52 45 20  he TEST_FAILURE 
8a20: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
8a30: 61 62 6c 65 20 69 73 20 22 35 22 2e 0a 20 20 20  able is "5"..   
8a40: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
8a50: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
8a60: 68 61 74 20 61 75 74 6f 6d 61 74 65 64 20 74 65  hat automated te
8a70: 73 74 20 73 63 72 69 70 74 20 72 65 61 6c 6c 79  st script really
8a80: 20 64 6f 20 73 70 6f 74 0a 20 20 20 20 20 20 20   do spot.       
8a90: 20 2a 2a 20 65 72 72 6f 72 73 20 74 68 61 74 20   ** errors that 
8aa0: 6f 63 63 75 72 20 69 6e 20 74 68 69 73 20 74 65  occur in this te
8ab0: 73 74 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  st program..    
8ac0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
8ad0: 66 28 20 7a 46 61 69 6c 43 6f 64 65 20 29 7b 0a  f( zFailCode ){.
8ae0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 46            if( zF
8af0: 61 69 6c 43 6f 64 65 5b 30 5d 3d 3d 27 35 27 20  ailCode[0]=='5' 
8b00: 26 26 20 7a 46 61 69 6c 43 6f 64 65 5b 31 5d 3d  && zFailCode[1]=
8b10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8b20: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 73 69    fatalError("si
8b30: 6d 75 6c 61 74 65 64 20 66 61 69 6c 75 72 65 22  mulated failure"
8b40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
8b50: 73 65 20 69 66 28 20 7a 46 61 69 6c 43 6f 64 65  se if( zFailCode
8b60: 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]!=0 ){.      
8b70: 20 20 20 20 20 20 2f 2a 20 49 66 20 54 45 53 54        /* If TEST
8b80: 5f 46 41 49 4c 55 52 45 20 69 73 20 73 6f 6d 65  _FAILURE is some
8b90: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
8ba0: 20 35 2c 20 6a 75 73 74 20 65 78 69 74 20 74 68   5, just exit th
8bb0: 65 20 74 65 73 74 0a 20 20 20 20 20 20 20 20 20  e test.         
8bc0: 20 20 20 2a 2a 20 65 61 72 6c 79 20 2a 2f 0a 20     ** early */. 
8bd0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
8be0: 66 28 22 5c 6e 45 78 69 74 20 65 61 72 6c 79 20  f("\nExit early 
8bf0: 64 75 65 20 74 6f 20 54 45 53 54 5f 46 41 49 4c  due to TEST_FAIL
8c00: 55 52 45 20 62 65 69 6e 67 20 73 65 74 5c 6e 22  URE being set\n"
8c10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
8c20: 53 72 63 44 62 20 3d 20 6e 53 72 63 44 62 2d 31  SrcDb = nSrcDb-1
8c30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
8c40: 74 6f 20 73 6f 75 72 63 65 64 62 5f 63 6c 65 61  to sourcedb_clea
8c50: 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
8c60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8c70: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
8c80: 20 21 71 75 69 65 74 46 6c 61 67 20 26 26 20 21   !quietFlag && !
8c90: 76 65 72 62 6f 73 65 46 6c 61 67 20 29 7b 0a 20  verboseFlag ){. 
8ca0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 31 30       printf(" 10
8cb0: 30 25 25 20 2d 20 25 64 20 74 65 73 74 73 5c 6e  0%% - %d tests\n
8cc0: 22 2c 20 67 2e 6e 44 62 2a 67 2e 6e 53 71 6c 29  ", g.nDb*g.nSql)
8cd0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
8ce0: 2a 20 43 6c 65 61 6e 20 75 70 20 61 74 20 74 68  * Clean up at th
8cf0: 65 20 65 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  e end of process
8d00: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 6f 75  ing a single sou
8d10: 72 63 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  rce database.   
8d20: 20 2a 2f 0a 20 20 73 6f 75 72 63 65 64 62 5f 63   */.  sourcedb_c
8d30: 6c 65 61 6e 75 70 3a 0a 20 20 20 20 62 6c 6f 62  leanup:.    blob
8d40: 4c 69 73 74 46 72 65 65 28 67 2e 70 46 69 72 73  ListFree(g.pFirs
8d50: 74 53 71 6c 29 3b 0a 20 20 20 20 62 6c 6f 62 4c  tSql);.    blobL
8d60: 69 73 74 46 72 65 65 28 67 2e 70 46 69 72 73 74  istFree(g.pFirst
8d70: 44 62 29 3b 0a 20 20 20 20 72 65 66 6f 72 6d 61  Db);.    reforma
8d80: 74 56 66 73 28 29 3b 0a 20 0a 20 20 7d 20 2f 2a  tVfs();. .  } /*
8d90: 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 61   End loop over a
8da0: 6c 6c 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  ll source databa
8db0: 73 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 21 71  ses */..  if( !q
8dc0: 75 69 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  uietFlag ){.    
8dd0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
8de0: 6c 61 70 73 65 20 3d 20 74 69 6d 65 4f 66 44 61  lapse = timeOfDa
8df0: 79 28 29 20 2d 20 69 42 65 67 69 6e 3b 0a 20 20  y() - iBegin;.  
8e00: 20 20 70 72 69 6e 74 66 28 22 66 75 7a 7a 63 68    printf("fuzzch
8e10: 65 63 6b 3a 20 30 20 65 72 72 6f 72 73 20 6f 75  eck: 0 errors ou
8e20: 74 20 6f 66 20 25 64 20 74 65 73 74 73 20 69 6e  t of %d tests in
8e30: 20 25 64 2e 25 30 33 64 20 73 65 63 6f 6e 64 73   %d.%03d seconds
8e40: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  \n".           "
8e50: 53 51 4c 69 74 65 20 25 73 20 25 73 5c 6e 22 2c  SQLite %s %s\n",
8e60: 0a 20 20 20 20 20 20 20 20 20 20 20 6e 54 65 73  .           nTes
8e70: 74 2c 20 28 69 6e 74 29 28 69 45 6c 61 70 73 65  t, (int)(iElapse
8e80: 2f 31 30 30 30 29 2c 20 28 69 6e 74 29 28 69 45  /1000), (int)(iE
8e90: 6c 61 70 73 65 25 31 30 30 30 29 2c 0a 20 20 20  lapse%1000),.   
8ea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8eb0: 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71  libversion(), sq
8ec0: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
8ed0: 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 7a  );.  }.  free(az
8ee0: 53 72 63 44 62 29 3b 0a 20 20 72 65 74 75 72 6e  SrcDb);.  return
8ef0: 20 30 3b 0a 7d 0a                                 0;.}.