/ Hex Artifact Content
Login

Artifact 93bb9d309888634615e21ef98d1c30d51483e942:


0000: 2f 2a 0a 2a 2a 20 32 30 31 35 2d 30 35 2d 32 35  /*.** 2015-05-25
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
0180: 75 74 69 6c 69 74 79 20 70 72 6f 67 72 61 6d 20  utility program 
0190: 64 65 73 69 67 6e 65 64 20 74 6f 20 61 69 64 20  designed to aid 
01a0: 72 75 6e 6e 69 6e 67 20 72 65 67 72 65 73 73 69  running regressi
01b0: 6f 6e 73 20 74 65 73 74 73 20 6f 6e 0a 2a 2a 20  ons tests on.** 
01c0: 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61  the SQLite libra
01d0: 72 79 20 75 73 69 6e 67 20 64 61 74 61 20 66 72  ry using data fr
01e0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 66  om an external f
01f0: 75 7a 7a 65 72 2c 20 73 75 63 68 20 61 73 20 41  uzzer, such as A
0200: 6d 65 72 69 63 61 6e 0a 2a 2a 20 46 75 7a 7a 79  merican.** Fuzzy
0210: 20 4c 6f 70 20 28 41 46 4c 29 20 28 68 74 74 70   Lop (AFL) (http
0220: 3a 2f 2f 6c 63 61 6d 74 75 66 2e 63 6f 72 65 64  ://lcamtuf.cored
0230: 75 6d 70 2e 63 78 2f 61 66 6c 2f 29 2e 0a 2a 2a  ump.cx/afl/)..**
0240: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0250: 20 72 65 61 64 73 20 63 6f 6e 74 65 6e 74 20 66   reads content f
0260: 72 6f 6d 20 61 6e 20 53 51 4c 69 74 65 20 64 61  rom an SQLite da
0270: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
0280: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0290: 2a 20 73 63 68 65 6d 61 3a 0a 2a 2a 0a 2a 2a 20  * schema:.**.** 
02a0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
02b0: 20 64 62 28 0a 2a 2a 20 20 20 20 20 20 20 64 62   db(.**       db
02c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
02d0: 52 59 20 4b 45 59 2c 20 2d 2d 20 64 61 74 61 62  RY KEY, -- datab
02e0: 61 73 65 20 69 64 0a 2a 2a 20 20 20 20 20 20 20  ase id.**       
02f0: 64 62 63 6f 6e 74 65 6e 74 20 42 4c 4f 42 20 20  dbcontent BLOB  
0300: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 64 61 74            -- dat
0310: 61 62 61 73 65 20 64 69 73 6b 20 66 69 6c 65 20  abase disk file 
0320: 69 6d 61 67 65 0a 2a 2a 20 20 20 20 20 29 3b 0a  image.**     );.
0330: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41  **     CREATE TA
0340: 42 4c 45 20 78 73 71 6c 28 0a 2a 2a 20 20 20 20  BLE xsql(.**    
0350: 20 20 20 73 71 6c 69 64 20 49 4e 54 45 47 45 52     sqlid INTEGER
0360: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 20   PRIMARY KEY,   
0370: 2d 2d 20 53 51 4c 20 73 63 72 69 70 74 20 69 64  -- SQL script id
0380: 0a 2a 2a 20 20 20 20 20 20 20 73 71 6c 74 65 78  .**       sqltex
0390: 74 20 54 45 58 54 20 20 20 20 20 20 20 20 20 20  t TEXT          
03a0: 20 20 20 20 20 20 20 2d 2d 20 54 65 78 74 20 6f         -- Text o
03b0: 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  f SQL statements
03c0: 20 74 6f 20 72 75 6e 0a 2a 2a 20 20 20 20 20 29   to run.**     )
03d0: 3b 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  ;.**     CREATE 
03e0: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
03f0: 53 54 53 20 72 65 61 64 6d 65 28 0a 2a 2a 20 20  STS readme(.**  
0400: 20 20 20 20 20 6d 73 67 20 54 45 58 54 20 2d 2d       msg TEXT --
0410: 20 48 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   Human-readable 
0420: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
0430: 68 69 73 20 74 65 73 74 20 63 6f 6c 6c 65 63 74  his test collect
0440: 69 6f 6e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a  ion.**     );.**
0450: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 64 61 74  .** For each dat
0460: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
0470: 65 20 44 42 20 74 61 62 6c 65 2c 20 74 68 65 20  e DB table, the 
0480: 53 51 4c 20 74 65 78 74 20 69 6e 20 74 68 65 20  SQL text in the 
0490: 58 53 51 4c 20 74 61 62 6c 65 0a 2a 2a 20 69 73  XSQL table.** is
04a0: 20 72 75 6e 20 61 67 61 69 6e 73 74 20 74 68 61   run against tha
04b0: 74 20 64 61 74 61 62 61 73 65 2e 20 20 41 6c 6c  t database.  All
04c0: 20 52 45 41 44 4d 45 2e 4d 53 47 20 76 61 6c 75   README.MSG valu
04d0: 65 73 20 61 72 65 20 70 72 69 6e 74 65 64 20 70  es are printed p
04e0: 72 69 6f 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  rior.** to the s
04f0: 74 61 72 74 20 6f 66 20 74 68 65 20 74 65 73 74  tart of the test
0500: 20 28 75 6e 6c 65 73 73 20 74 68 65 20 2d 2d 71   (unless the --q
0510: 75 69 65 74 20 6f 70 74 69 6f 6e 20 69 73 20 75  uiet option is u
0520: 73 65 64 29 2e 20 20 49 66 20 74 68 65 0a 2a 2a  sed).  If the.**
0530: 20 44 42 20 74 61 62 6c 65 20 69 73 20 65 6d 70   DB table is emp
0540: 74 79 2c 20 74 68 65 6e 20 61 6c 6c 20 65 6e 74  ty, then all ent
0550: 72 69 65 73 20 69 6e 20 58 53 51 4c 20 61 72 65  ries in XSQL are
0560: 20 72 75 6e 20 61 67 61 69 6e 73 74 20 61 6e 20   run against an 
0570: 65 6d 70 74 79 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  empty.** in-memo
0580: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ry database..**.
0590: 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20  ** This program 
05a0: 69 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63  is looking for c
05b0: 72 61 73 68 65 73 2c 20 61 73 73 65 72 74 69 6f  rashes, assertio
05c0: 6e 20 66 61 75 6c 74 73 2c 20 61 6e 64 2f 6f 72  n faults, and/or
05d0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 2e 0a 2a   memory leaks..*
05e0: 2a 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20  * No attempt is 
05f0: 6d 61 64 65 20 74 6f 20 76 65 72 69 66 79 20 74  made to verify t
0600: 68 65 20 6f 75 74 70 75 74 2e 20 20 54 68 65 20  he output.  The 
0610: 61 73 73 75 6d 70 74 69 6f 6e 20 69 73 20 74 68  assumption is th
0620: 61 74 20 65 69 74 68 65 72 20 61 6c 6c 0a 2a 2a  at either all.**
0630: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
0640: 20 66 69 6c 65 73 20 6f 72 20 61 6c 6c 20 6f 66   files or all of
0650: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
0660: 6e 74 73 20 61 72 65 20 6d 61 6c 66 6f 72 6d 65  nts are malforme
0670: 64 20 69 6e 70 75 74 73 2c 0a 2a 2a 20 67 65 6e  d inputs,.** gen
0680: 65 72 61 74 65 64 20 62 79 20 61 20 66 75 7a 7a  erated by a fuzz
0690: 65 72 2c 20 74 68 61 74 20 6e 65 65 64 20 74 6f  er, that need to
06a0: 20 62 65 20 63 68 65 63 6b 65 64 20 74 6f 20 6d   be checked to m
06b0: 61 6b 65 20 73 75 72 65 20 74 68 65 79 20 64 6f  ake sure they do
06c0: 20 6e 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20   not.** present 
06d0: 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 2e  a security risk.
06e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67  .**.** This prog
06f0: 72 61 6d 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65  ram also include
0700: 73 20 73 6f 6d 65 20 63 6f 6d 6d 61 6e 64 2d 6c  s some command-l
0710: 69 6e 65 20 6f 70 74 69 6f 6e 73 20 74 6f 20 68  ine options to h
0720: 65 6c 70 20 77 69 74 68 20 0a 2a 2a 20 63 72 65  elp with .** cre
0730: 61 74 69 6f 6e 20 61 6e 64 20 6d 61 69 6e 74 65  ation and mainte
0740: 6e 61 6e 63 65 20 6f 66 20 74 68 65 20 73 6f 75  nance of the sou
0750: 72 63 65 20 63 6f 6e 74 65 6e 74 20 64 61 74 61  rce content data
0760: 62 61 73 65 2e 20 20 54 68 65 20 63 6f 6d 6d 61  base.  The comma
0770: 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2f 66  nd.**.**     ./f
0780: 75 7a 7a 63 68 65 63 6b 20 64 61 74 61 62 61 73  uzzcheck databas
0790: 65 2e 64 62 20 2d 2d 6c 6f 61 64 2d 73 71 6c 20  e.db --load-sql 
07a0: 46 49 4c 45 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  FILE....**.** Lo
07b0: 61 64 73 20 61 6c 6c 20 46 49 4c 45 2e 2e 2e 20  ads all FILE... 
07c0: 61 72 67 75 6d 65 6e 74 73 20 69 6e 74 6f 20 74  arguments into t
07d0: 68 65 20 58 53 51 4c 20 74 61 62 6c 65 2e 20 20  he XSQL table.  
07e0: 54 68 65 20 2d 2d 6c 6f 61 64 2d 64 62 20 6f 70  The --load-db op
07f0: 74 69 6f 6e 0a 2a 2a 20 77 6f 72 6b 73 20 74 68  tion.** works th
0800: 65 20 73 61 6d 65 20 62 75 74 20 6c 6f 61 64 73  e same but loads
0810: 20 74 68 65 20 66 69 6c 65 73 20 69 6e 74 6f 20   the files into 
0820: 74 68 65 20 44 42 20 74 61 62 6c 65 2e 20 20 54  the DB table.  T
0830: 68 65 20 2d 6d 20 6f 70 74 69 6f 6e 20 63 61 6e  he -m option can
0840: 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 69  .** be used to i
0850: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 52 45  nitialize the RE
0860: 41 44 4d 45 20 74 61 62 6c 65 2e 20 20 54 68 65  ADME table.  The
0870: 20 22 64 61 74 61 62 61 73 65 2e 64 62 22 20 66   "database.db" f
0880: 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
0890: 2a 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  * if it does not
08a0: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73   previously exis
08b0: 74 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  t.  Example:.**.
08c0: 2a 2a 20 20 20 20 20 2e 2f 66 75 7a 7a 63 68 65  **     ./fuzzche
08d0: 63 6b 20 6e 65 77 2e 64 62 20 2d 2d 6c 6f 61 64  ck new.db --load
08e0: 2d 73 71 6c 20 2a 2e 73 71 6c 0a 2a 2a 20 20 20  -sql *.sql.**   
08f0: 20 20 2e 2f 66 75 7a 7a 63 68 65 63 6b 20 6e 65    ./fuzzcheck ne
0900: 77 2e 64 62 20 2d 2d 6c 6f 61 64 2d 64 62 20 2a  w.db --load-db *
0910: 2e 64 62 0a 2a 2a 20 20 20 20 20 2e 2f 66 75 7a  .db.**     ./fuz
0920: 7a 63 68 65 63 6b 20 6e 65 77 2e 64 62 20 2d 6d  zcheck new.db -m
0930: 20 27 4e 65 77 20 74 65 73 74 20 63 61 73 65 73   'New test cases
0940: 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  '.**.** The thre
0950: 65 20 63 6f 6d 6d 61 6e 64 73 20 61 62 6f 76 65  e commands above
0960: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 74 68 65   will create the
0970: 20 22 6e 65 77 2e 64 62 22 20 66 69 6c 65 20 61   "new.db" file a
0980: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c  nd initialize al
0990: 6c 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 20 54 68  l.** tables.  Th
09a0: 65 6e 20 64 6f 20 22 2e 2f 66 75 7a 7a 63 68 65  en do "./fuzzche
09b0: 63 6b 20 6e 65 77 2e 64 62 22 20 74 6f 20 72 75  ck new.db" to ru
09c0: 6e 20 74 68 65 20 74 65 73 74 73 2e 0a 2a 2a 0a  n the tests..**.
09d0: 2a 2a 20 44 45 42 55 47 47 49 4e 47 20 48 49 4e  ** DEBUGGING HIN
09e0: 54 53 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 66 75 7a  TS:.**.** If fuz
09f0: 7a 63 68 65 63 6b 20 64 6f 65 73 20 63 72 61 73  zcheck does cras
0a00: 68 2c 20 69 74 20 63 61 6e 20 62 65 20 72 75 6e  h, it can be run
0a10: 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72   in the debugger
0a20: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0a30: 0a 2a 2a 20 6f 66 20 74 68 65 20 67 6c 6f 62 61  .** of the globa
0a40: 6c 20 76 61 72 69 61 62 6c 65 20 67 2e 7a 54 65  l variable g.zTe
0a50: 78 74 4e 61 6d 65 5b 5d 20 77 69 6c 6c 20 69 64  xtName[] will id
0a60: 65 6e 74 69 66 79 20 74 68 65 20 73 70 65 63 69  entify the speci
0a70: 66 69 63 20 58 53 51 4c 20 61 6e 64 0a 2a 2a 20  fic XSQL and.** 
0a80: 44 42 20 76 61 6c 75 65 73 20 74 68 61 74 20 77  DB values that w
0a90: 65 72 65 20 72 75 6e 6e 69 6e 67 20 77 68 65 6e  ere running when
0aa0: 20 74 68 65 20 63 72 61 73 68 20 6f 63 63 75 72   the crash occur
0ab0: 72 65 64 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  red..*/.#include
0ac0: 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c   <stdio.h>.#incl
0ad0: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0ae0: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0af0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h>.#include <std
0b00: 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  arg.h>.#include 
0b10: 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75  <ctype.h>.#inclu
0b20: 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23  de "sqlite3.h".#
0b30: 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e  include <assert.
0b40: 68 3e 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41  h>.#define ISSPA
0b50: 43 45 28 58 29 20 69 73 73 70 61 63 65 28 28 75  CE(X) isspace((u
0b60: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 28 58 29  nsigned char)(X)
0b70: 29 0a 23 64 65 66 69 6e 65 20 49 53 44 49 47 49  ).#define ISDIGI
0b80: 54 28 58 29 20 69 73 64 69 67 69 74 28 28 75 6e  T(X) isdigit((un
0b90: 73 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29  signed char)(X))
0ba0: 0a 0a 0a 23 69 66 64 65 66 20 5f 5f 75 6e 69 78  ...#ifdef __unix
0bb0: 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 69  __.# include <si
0bc0: 67 6e 61 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  gnal.h>.# includ
0bd0: 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e  e <unistd.h>.#en
0be0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 73  dif../*.** Files
0bf0: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
0c00: 66 69 6c 65 20 73 79 73 74 65 6d 2e 0a 2a 2f 0a  file system..*/.
0c10: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56  typedef struct V
0c20: 46 69 6c 65 20 56 46 69 6c 65 3b 0a 73 74 72 75  File VFile;.stru
0c30: 63 74 20 56 46 69 6c 65 20 7b 0a 20 20 63 68 61  ct VFile {.  cha
0c40: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
0c50: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
0c60: 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 64 65 6c 65  .  NULL for dele
0c70: 74 65 2d 6f 6e 2d 63 6c 6f 73 65 2e 20 46 72 6f  te-on-close. Fro
0c80: 6d 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20  m malloc() */.  
0c90: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
0ca0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
0cb0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 20 62  of the file in b
0cc0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ytes */.  int nR
0cd0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
0ce0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
0cf0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
0d00: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  s file */.  unsi
0d10: 67 6e 65 64 20 63 68 61 72 20 2a 61 3b 20 20 20  gned char *a;   
0d20: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
0d30: 66 20 74 68 65 20 66 69 6c 65 2e 20 20 46 72 6f  f the file.  Fro
0d40: 6d 20 6d 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b  m malloc() */.};
0d50: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0d60: 56 48 61 6e 64 6c 65 20 56 48 61 6e 64 6c 65 3b  VHandle VHandle;
0d70: 0a 73 74 72 75 63 74 20 56 48 61 6e 64 6c 65 20  .struct VHandle 
0d80: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  {.  sqlite3_file
0d90: 20 62 61 73 65 3b 20 20 20 20 20 20 2f 2a 20 42   base;      /* B
0da0: 61 73 65 20 63 6c 61 73 73 2e 20 20 4d 75 73 74  ase class.  Must
0db0: 20 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 56   be first */.  V
0dc0: 46 69 6c 65 20 2a 70 56 46 69 6c 65 3b 20 20 20  File *pVFile;   
0dd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
0de0: 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 2a 2f  derlying file */
0df0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76  .};../*.** The v
0e00: 61 6c 75 65 20 6f 66 20 61 20 64 61 74 61 62 61  alue of a databa
0e10: 73 65 20 66 69 6c 65 20 74 65 6d 70 6c 61 74 65  se file template
0e20: 2c 20 6f 72 20 6f 66 20 61 6e 20 53 51 4c 20 73  , or of an SQL s
0e30: 63 72 69 70 74 0a 2a 2f 0a 74 79 70 65 64 65 66  cript.*/.typedef
0e40: 20 73 74 72 75 63 74 20 42 6c 6f 62 20 42 6c 6f   struct Blob Blo
0e50: 62 3b 0a 73 74 72 75 63 74 20 42 6c 6f 62 20 7b  b;.struct Blob {
0e60: 0a 20 20 42 6c 6f 62 20 2a 70 4e 65 78 74 3b 20  .  Blob *pNext; 
0e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
0e80: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a  xt in a list */.
0e90: 20 20 69 6e 74 20 69 64 3b 20 20 20 20 20 20 20    int id;       
0ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
0eb0: 6f 66 20 74 68 69 73 20 42 6c 6f 62 20 2a 2f 0a  of this Blob */.
0ec0: 20 20 69 6e 74 20 73 65 71 3b 20 20 20 20 20 20    int seq;      
0ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71            /* Seq
0ee0: 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  uence number */.
0ef0: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
0f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
0f10: 65 20 6f 66 20 74 68 69 73 20 42 6c 6f 62 20 69  e of this Blob i
0f20: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  n bytes */.  uns
0f30: 69 67 6e 65 64 20 63 68 61 72 20 61 5b 31 5d 3b  igned char a[1];
0f40: 20 20 20 20 20 2f 2a 20 42 6c 6f 62 20 63 6f 6e       /* Blob con
0f50: 74 65 6e 74 2e 20 20 45 78 74 72 61 20 73 70 61  tent.  Extra spa
0f60: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  ce allocated as 
0f70: 6e 65 65 64 65 64 2e 20 2a 2f 0a 7d 3b 0a 0a 2f  needed. */.};../
0f80: 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  *.** Maximum num
0f90: 62 65 72 20 6f 66 20 66 69 6c 65 73 20 69 6e 20  ber of files in 
0fa0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 76 69  the in-memory vi
0fb0: 72 74 75 61 6c 20 66 69 6c 65 73 79 73 74 65 6d  rtual filesystem
0fc0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
0fd0: 46 49 4c 45 20 20 31 30 0a 0a 2f 2a 0a 2a 2a 20  FILE  10../*.** 
0fe0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
0ff0: 66 69 6c 65 20 73 69 7a 65 0a 2a 2f 0a 23 64 65  file size.*/.#de
1000: 66 69 6e 65 20 4d 58 5f 46 49 4c 45 5f 53 5a 20  fine MX_FILE_SZ 
1010: 31 30 30 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20  10000000../*.** 
1020: 41 6c 6c 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  All global varia
1030: 62 6c 65 73 20 61 72 65 20 67 61 74 68 65 72 65  bles are gathere
1040: 64 20 69 6e 74 6f 20 74 68 65 20 22 67 22 20 73  d into the "g" s
1050: 69 6e 67 6c 65 74 6f 6e 2e 0a 2a 2f 0a 73 74 61  ingleton..*/.sta
1060: 74 69 63 20 73 74 72 75 63 74 20 47 6c 6f 62 61  tic struct Globa
1070: 6c 56 61 72 73 20 7b 0a 20 20 63 6f 6e 73 74 20  lVars {.  const 
1080: 63 68 61 72 20 2a 7a 41 72 67 76 30 3b 20 20 20  char *zArgv0;   
1090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
10a0: 6d 65 20 6f 66 20 70 72 6f 67 72 61 6d 20 2a 2f  me of program */
10b0: 0a 20 20 56 46 69 6c 65 20 61 46 69 6c 65 5b 4d  .  VFile aFile[M
10c0: 58 5f 46 49 4c 45 5d 3b 20 20 20 20 20 20 20 20  X_FILE];        
10d0: 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
10e0: 61 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f  al filesystem */
10f0: 0a 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20  .  int nDb;     
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1120: 20 74 65 6d 70 6c 61 74 65 20 64 61 74 61 62 61   template databa
1130: 73 65 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70  ses */.  Blob *p
1140: 46 69 72 73 74 44 62 3b 20 20 20 20 20 20 20 20  FirstDb;        
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1160: 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 74 65  tent of first te
1170: 6d 70 6c 61 74 65 20 64 61 74 61 62 61 73 65 20  mplate database 
1180: 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20  */.  int nSql;  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11b0: 6f 66 20 53 51 4c 20 73 63 72 69 70 74 73 20 2a  of SQL scripts *
11c0: 2f 0a 20 20 42 6c 6f 62 20 2a 70 46 69 72 73 74  /.  Blob *pFirst
11d0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
11e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 53 51       /* First SQ
11f0: 4c 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 63 68  L script */.  ch
1200: 61 72 20 7a 54 65 73 74 4e 61 6d 65 5b 31 30 30  ar zTestName[100
1210: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
1220: 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e  * Name of curren
1230: 74 20 74 65 73 74 20 2a 2f 0a 7d 20 67 3b 0a 0a  t test */.} g;..
1240: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65  /*.** Print an e
1250: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64  rror message and
1260: 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   quit..*/.static
1270: 20 76 6f 69 64 20 66 61 74 61 6c 45 72 72 6f 72   void fatalError
1280: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
1290: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
12a0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
12b0: 67 2e 7a 54 65 73 74 4e 61 6d 65 5b 30 5d 20 29  g.zTestName[0] )
12c0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
12d0: 64 65 72 72 2c 20 22 25 73 20 28 25 73 29 3a 20  derr, "%s (%s): 
12e0: 22 2c 20 67 2e 7a 41 72 67 76 30 2c 20 67 2e 7a  ", g.zArgv0, g.z
12f0: 54 65 73 74 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  TestName);.  }el
1300: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
1310: 73 74 64 65 72 72 2c 20 22 25 73 3a 20 22 2c 20  stderr, "%s: ", 
1320: 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 7d 0a 20  g.zArgv0);.  }. 
1330: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1340: 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e  ormat);.  vfprin
1350: 74 66 28 73 74 64 65 72 72 2c 20 7a 46 6f 72 6d  tf(stderr, zForm
1360: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1370: 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e 74 66  d(ap);.  fprintf
1380: 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a  (stderr, "\n");.
1390: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a    exit(1);.}../*
13a0: 0a 2a 2a 20 54 69 6d 65 6f 75 74 20 68 61 6e 64  .** Timeout hand
13b0: 6c 65 72 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ler.*/.#ifdef __
13c0: 75 6e 69 78 5f 5f 0a 73 74 61 74 69 63 20 76 6f  unix__.static vo
13d0: 69 64 20 74 69 6d 65 6f 75 74 48 61 6e 64 6c 65  id timeoutHandle
13e0: 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a  r(int NotUsed){.
13f0: 20 20 28 76 6f 69 64 29 4e 6f 74 55 73 65 64 3b    (void)NotUsed;
1400: 0a 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74  .  fatalError("t
1410: 69 6d 65 6f 75 74 5c 6e 22 29 3b 0a 7d 0a 23 65  imeout\n");.}.#e
1420: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
1430: 74 68 65 20 61 6e 20 61 6c 61 72 6d 20 74 6f 20  the an alarm to 
1440: 67 6f 20 6f 66 66 20 61 66 74 65 72 20 4e 20 73  go off after N s
1450: 65 63 6f 6e 64 73 2e 20 20 44 69 73 61 62 6c 65  econds.  Disable
1460: 20 74 68 65 20 61 6c 61 72 6d 0a 2a 2a 20 69 66   the alarm.** if
1470: 20 4e 3d 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20   N==0.*/.static 
1480: 76 6f 69 64 20 73 65 74 41 6c 61 72 6d 28 69 6e  void setAlarm(in
1490: 74 20 4e 29 7b 0a 23 69 66 64 65 66 20 5f 5f 75  t N){.#ifdef __u
14a0: 6e 69 78 5f 5f 0a 20 20 61 6c 61 72 6d 28 4e 29  nix__.  alarm(N)
14b0: 3b 0a 23 65 6c 73 65 0a 20 20 28 76 6f 69 64 29  ;.#else.  (void)
14c0: 4e 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  N;.#endif.}..#if
14d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14e0: 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41  _PROGRESS_CALLBA
14f0: 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 6e  CK./*.** This an
1500: 20 53 51 4c 20 70 72 6f 67 72 65 73 73 20 68 61   SQL progress ha
1510: 6e 64 6c 65 72 2e 20 20 41 66 74 65 72 20 61 6e  ndler.  After an
1520: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 68   SQL statement h
1530: 61 73 20 72 75 6e 20 66 6f 72 0a 2a 2a 20 6d 61  as run for.** ma
1540: 6e 79 20 73 74 65 70 73 2c 20 77 65 20 77 61 6e  ny steps, we wan
1550: 74 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 69  t to interrupt i
1560: 74 2e 20 20 54 68 69 73 20 67 75 61 72 64 73 20  t.  This guards 
1570: 61 67 61 69 6e 73 74 20 69 6e 66 69 6e 69 74 65  against infinite
1580: 0a 2a 2a 20 6c 6f 6f 70 73 20 66 72 6f 6d 20 72  .** loops from r
1590: 65 63 75 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20  ecursive common 
15a0: 74 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  table expression
15b0: 73 2e 0a 2a 2a 0a 2a 2a 20 2a 70 56 64 62 65 4c  s..**.** *pVdbeL
15c0: 69 6d 69 74 46 6c 61 67 20 69 73 20 74 72 75 65  imitFlag is true
15d0: 20 69 66 20 74 68 65 20 2d 2d 6c 69 6d 69 74 2d   if the --limit-
15e0: 76 64 62 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  vdbe command-lin
15f0: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
1600: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73  ..** In that cas
1610: 65 2c 20 68 69 74 74 69 6e 67 20 74 68 65 20 70  e, hitting the p
1620: 72 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20  rogress handler 
1630: 69 73 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72  is a fatal error
1640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1650: 70 72 6f 67 72 65 73 73 48 61 6e 64 6c 65 72 28  progressHandler(
1660: 76 6f 69 64 20 2a 70 56 64 62 65 4c 69 6d 69 74  void *pVdbeLimit
1670: 46 6c 61 67 29 7b 0a 20 20 69 66 28 20 2a 28 69  Flag){.  if( *(i
1680: 6e 74 2a 29 70 56 64 62 65 4c 69 6d 69 74 46 6c  nt*)pVdbeLimitFl
1690: 61 67 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  ag ) fatalError(
16a0: 22 74 6f 6f 20 6d 61 6e 79 20 56 44 42 45 20 63  "too many VDBE c
16b0: 79 63 6c 65 73 22 29 3b 0a 20 20 72 65 74 75 72  ycles");.  retur
16c0: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
16d0: 2a 0a 2a 2a 20 52 65 61 6c 6c 6f 63 61 74 65 20  *.** Reallocate 
16e0: 6d 65 6d 6f 72 79 2e 20 20 53 68 6f 77 20 61 6e  memory.  Show an
16f0: 64 20 65 72 72 6f 72 20 61 6e 64 20 71 75 69 74  d error and quit
1700: 20 69 66 20 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73   if unable..*/.s
1710: 74 61 74 69 63 20 76 6f 69 64 20 2a 73 61 66 65  tatic void *safe
1720: 5f 72 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  _realloc(void *p
1730: 4f 6c 64 2c 20 69 6e 74 20 73 7a 4e 65 77 29 7b  Old, int szNew){
1740: 0a 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20  .  void *pNew = 
1750: 72 65 61 6c 6c 6f 63 28 70 4f 6c 64 2c 20 73 7a  realloc(pOld, sz
1760: 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  New);.  if( pNew
1770: 3d 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72  ==0 ) fatalError
1780: 28 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 6c  ("unable to real
1790: 6c 6f 63 20 66 6f 72 20 25 64 20 62 79 74 65 73  loc for %d bytes
17a0: 22 2c 20 73 7a 4e 65 77 29 3b 0a 20 20 72 65 74  ", szNew);.  ret
17b0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
17c0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
17d0: 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
17e0: 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  ystem..*/.static
17f0: 20 76 6f 69 64 20 66 6f 72 6d 61 74 56 66 73 28   void formatVfs(
1800: 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  void){.  int i;.
1810: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f    for(i=0; i<MX_
1820: 46 49 4c 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  FILE; i++){.    
1830: 67 2e 61 46 69 6c 65 5b 69 5d 2e 73 7a 20 3d 20  g.aFile[i].sz = 
1840: 2d 31 3b 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b  -1;.    g.aFile[
1850: 69 5d 2e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30  i].zFilename = 0
1860: 3b 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d  ;.    g.aFile[i]
1870: 2e 61 20 3d 20 30 3b 0a 20 20 20 20 67 2e 61 46  .a = 0;.    g.aF
1880: 69 6c 65 5b 69 5d 2e 6e 52 65 66 20 3d 20 30 3b  ile[i].nRef = 0;
1890: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  .  }.}.../*.** E
18a0: 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  rase all informa
18b0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 69 72 74  tion in the virt
18c0: 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  ual file system.
18d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18e0: 72 65 66 6f 72 6d 61 74 56 66 73 28 76 6f 69 64  reformatVfs(void
18f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1900: 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 46 49 4c 45  r(i=0; i<MX_FILE
1910: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1920: 67 2e 61 46 69 6c 65 5b 69 5d 2e 73 7a 3c 30 20  g.aFile[i].sz<0 
1930: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1940: 69 66 28 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a  if( g.aFile[i].z
1950: 46 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Filename ){.    
1960: 20 20 66 72 65 65 28 67 2e 61 46 69 6c 65 5b 69    free(g.aFile[i
1970: 5d 2e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ].zFilename);.  
1980: 20 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a      g.aFile[i].z
1990: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
19a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 61 46    }.    if( g.aF
19b0: 69 6c 65 5b 69 5d 2e 6e 52 65 66 3e 30 20 29 7b  ile[i].nRef>0 ){
19c0: 0a 20 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f  .      fatalErro
19d0: 72 28 22 66 69 6c 65 20 25 64 20 73 74 69 6c 6c  r("file %d still
19e0: 20 6f 70 65 6e 2e 20 20 6e 52 65 66 3d 25 64 22   open.  nRef=%d"
19f0: 2c 20 69 2c 20 67 2e 61 46 69 6c 65 5b 69 5d 2e  , i, g.aFile[i].
1a00: 6e 52 65 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nRef);.    }.   
1a10: 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 73 7a 20 3d   g.aFile[i].sz =
1a20: 20 2d 31 3b 0a 20 20 20 20 66 72 65 65 28 67 2e   -1;.    free(g.
1a30: 61 46 69 6c 65 5b 69 5d 2e 61 29 3b 0a 20 20 20  aFile[i].a);.   
1a40: 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 61 20 3d 20   g.aFile[i].a = 
1a50: 30 3b 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69  0;.    g.aFile[i
1a60: 5d 2e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 7d 0a  ].nRef = 0;.  }.
1a70: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
1a80: 56 46 69 6c 65 20 62 79 20 6e 61 6d 65 0a 2a 2f  VFile by name.*/
1a90: 0a 73 74 61 74 69 63 20 56 46 69 6c 65 20 2a 66  .static VFile *f
1aa0: 69 6e 64 56 46 69 6c 65 28 63 6f 6e 73 74 20 63  indVFile(const c
1ab0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
1ac0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  nt i;.  if( zNam
1ad0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
1ae0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58  .  for(i=0; i<MX
1af0: 5f 46 49 4c 45 3b 20 69 2b 2b 29 7b 0a 20 20 20  _FILE; i++){.   
1b00: 20 69 66 28 20 67 2e 61 46 69 6c 65 5b 69 5d 2e   if( g.aFile[i].
1b10: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 63  zFilename==0 ) c
1b20: 6f 6e 74 69 6e 75 65 3b 20 20 20 0a 20 20 20 20  ontinue;   .    
1b30: 69 66 28 20 73 74 72 63 6d 70 28 67 2e 61 46 69  if( strcmp(g.aFi
1b40: 6c 65 5b 69 5d 2e 7a 46 69 6c 65 6e 61 6d 65 2c  le[i].zFilename,
1b50: 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
1b60: 75 72 6e 20 26 67 2e 61 46 69 6c 65 5b 69 5d 3b  urn &g.aFile[i];
1b70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1b80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
1b90: 20 56 46 69 6c 65 20 62 79 20 6e 61 6d 65 2e 20   VFile by name. 
1ba0: 20 43 72 65 61 74 65 20 69 74 20 69 66 20 69 74   Create it if it
1bb0: 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
1bc0: 79 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 69  y exist and.** i
1bd0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 74 6f 20  nitialize it to 
1be0: 74 68 65 20 73 69 7a 65 20 61 6e 64 20 63 6f 6e  the size and con
1bf0: 74 65 6e 74 20 67 69 76 65 6e 2e 0a 2a 2a 0a 2a  tent given..**.*
1c00: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 6f 6e  * Return NULL on
1c10: 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 73 79  ly if the filesy
1c20: 73 74 65 6d 20 69 73 20 66 75 6c 6c 2e 0a 2a 2f  stem is full..*/
1c30: 0a 73 74 61 74 69 63 20 56 46 69 6c 65 20 2a 63  .static VFile *c
1c40: 72 65 61 74 65 56 46 69 6c 65 28 63 6f 6e 73 74  reateVFile(const
1c50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
1c60: 74 20 73 7a 2c 20 75 6e 73 69 67 6e 65 64 20 63  t sz, unsigned c
1c70: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 56  har *pData){.  V
1c80: 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 66 69 6e  File *pNew = fin
1c90: 64 56 46 69 6c 65 28 7a 4e 61 6d 65 29 3b 0a 20  dVFile(zName);. 
1ca0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4e   int i;.  if( pN
1cb0: 65 77 20 29 20 72 65 74 75 72 6e 20 70 4e 65 77  ew ) return pNew
1cc0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d  ;.  for(i=0; i<M
1cd0: 58 5f 46 49 4c 45 20 26 26 20 67 2e 61 46 69 6c  X_FILE && g.aFil
1ce0: 65 5b 69 5d 2e 73 7a 3e 3d 30 3b 20 69 2b 2b 29  e[i].sz>=0; i++)
1cf0: 7b 7d 0a 20 20 69 66 28 20 69 3e 3d 4d 58 5f 46  {}.  if( i>=MX_F
1d00: 49 4c 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ILE ) return 0;.
1d10: 20 20 70 4e 65 77 20 3d 20 26 67 2e 61 46 69 6c    pNew = &g.aFil
1d20: 65 5b 69 5d 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  e[i];.  if( zNam
1d30: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 61  e ){.    int nNa
1d40: 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
1d50: 28 7a 4e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 70  (zName)+1;.    p
1d60: 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  New->zFilename =
1d70: 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28 30 2c   safe_realloc(0,
1d80: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d   nName);.    mem
1d90: 63 70 79 28 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  cpy(pNew->zFilen
1da0: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
1db0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1dc0: 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1dd0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77   = 0;.  }.  pNew
1de0: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 70 4e  ->nRef = 0;.  pN
1df0: 65 77 2d 3e 73 7a 20 3d 20 73 7a 3b 0a 20 20 70  ew->sz = sz;.  p
1e00: 4e 65 77 2d 3e 61 20 3d 20 73 61 66 65 5f 72 65  New->a = safe_re
1e10: 61 6c 6c 6f 63 28 30 2c 20 73 7a 29 3b 0a 20 20  alloc(0, sz);.  
1e20: 69 66 28 20 73 7a 3e 30 20 29 20 6d 65 6d 63 70  if( sz>0 ) memcp
1e30: 79 28 70 4e 65 77 2d 3e 61 2c 20 70 44 61 74 61  y(pNew->a, pData
1e40: 2c 20 73 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  , sz);.  return 
1e50: 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pNew;.}.../*.** 
1e60: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1e70: 66 20 74 68 65 20 22 72 65 61 64 66 69 6c 65 28  f the "readfile(
1e80: 58 29 22 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  X)" SQL function
1e90: 2e 20 20 54 68 65 20 65 6e 74 69 72 65 20 63 6f  .  The entire co
1ea0: 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  ntent.** of the 
1eb0: 66 69 6c 65 20 6e 61 6d 65 64 20 58 20 69 73 20  file named X is 
1ec0: 72 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 65  read and returne
1ed0: 64 20 61 73 20 61 20 42 4c 4f 42 2e 20 20 4e 55  d as a BLOB.  NU
1ee0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  LL is returned.*
1ef0: 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  * if the file do
1f00: 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
1f10: 69 73 20 75 6e 72 65 61 64 61 62 6c 65 2e 0a 2a  is unreadable..*
1f20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1f30: 61 64 66 69 6c 65 46 75 6e 63 28 0a 20 20 73 71  adfileFunc(.  sq
1f40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
1f50: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
1f60: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
1f70: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
1f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1f90: 65 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  e;.  FILE *in;. 
1fa0: 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 76 6f 69   long nIn;.  voi
1fb0: 64 20 2a 70 42 75 66 3b 0a 0a 20 20 7a 4e 61 6d  d *pBuf;..  zNam
1fc0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  e = (const char*
1fd0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
1fe0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
1ff0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
2000: 65 74 75 72 6e 3b 0a 20 20 69 6e 20 3d 20 66 6f  eturn;.  in = fo
2010: 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29  pen(zName, "rb")
2020: 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
2030: 72 65 74 75 72 6e 3b 0a 20 20 66 73 65 65 6b 28  return;.  fseek(
2040: 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29  in, 0, SEEK_END)
2050: 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28  ;.  nIn = ftell(
2060: 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e  in);.  rewind(in
2070: 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69  );.  pBuf = sqli
2080: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49  te3_malloc64( nI
2090: 6e 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20  n );.  if( pBuf 
20a0: 26 26 20 31 3d 3d 66 72 65 61 64 28 70 42 75 66  && 1==fread(pBuf
20b0: 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 20 29 7b  , nIn, 1, in) ){
20c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
20d0: 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e 74 65 78 74  ult_blob(context
20e0: 2c 20 70 42 75 66 2c 20 6e 49 6e 2c 20 73 71 6c  , pBuf, nIn, sql
20f0: 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 65  ite3_free);.  }e
2100: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2110: 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 7d  _free(pBuf);.  }
2120: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d  .  fclose(in);.}
2130: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
2140: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 77  tation of the "w
2150: 72 69 74 65 66 69 6c 65 28 58 2c 59 29 22 20 53  ritefile(X,Y)" S
2160: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
2170: 65 20 61 72 67 75 6d 65 6e 74 20 59 0a 2a 2a 20  e argument Y.** 
2180: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2190: 66 69 6c 65 20 58 2e 20 20 54 68 65 20 6e 75 6d  file X.  The num
21a0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
21b0: 74 74 65 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tten is returned
21c0: 2e 20 20 4f 72 0a 2a 2a 20 4e 55 4c 4c 20 69 73  .  Or.** NULL is
21d0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
21e0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
21f0: 67 2c 20 73 75 63 68 20 61 73 20 62 65 69 6e 67  g, such as being
2200: 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 0a   unable to open.
2210: 2a 2a 20 66 69 6c 65 20 58 20 66 6f 72 20 77 72  ** file X for wr
2220: 69 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  iting..*/.static
2230: 20 76 6f 69 64 20 77 72 69 74 65 66 69 6c 65 46   void writefileF
2240: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
2250: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
2260: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
2270: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
2280: 72 67 76 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 6f  rgv.){.  FILE *o
2290: 75 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ut;.  const char
22a0: 20 2a 7a 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   *z;.  sqlite3_i
22b0: 6e 74 36 34 20 72 63 3b 0a 20 20 63 6f 6e 73 74  nt64 rc;.  const
22c0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 0a 20   char *zFile;.. 
22d0: 20 28 76 6f 69 64 29 61 72 67 63 3b 0a 20 20 7a   (void)argc;.  z
22e0: 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
22f0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2300: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
2310: 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20  .  if( zFile==0 
2320: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20  ) return;.  out 
2330: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
2340: 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d  wb");.  if( out=
2350: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
2360: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2370: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
2380: 6f 62 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  ob(argv[1]);.  i
2390: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( z==0 ){.    r
23a0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
23b0: 20 20 20 20 72 63 20 3d 20 66 77 72 69 74 65 28      rc = fwrite(
23c0: 7a 2c 20 31 2c 20 73 71 6c 69 74 65 33 5f 76 61  z, 1, sqlite3_va
23d0: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 31  lue_bytes(argv[1
23e0: 5d 29 2c 20 6f 75 74 29 3b 0a 20 20 7d 0a 20 20  ]), out);.  }.  
23f0: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 73  fclose(out);.  s
2400: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
2410: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 72 63 29  t64(context, rc)
2420: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  ;.}.../*.** Load
2430: 20 61 20 6c 69 73 74 20 6f 66 20 42 6c 6f 62 20   a list of Blob 
2440: 6f 62 6a 65 63 74 73 20 66 72 6f 6d 20 74 68 65  objects from the
2450: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61   database.*/.sta
2460: 74 69 63 20 76 6f 69 64 20 62 6c 6f 62 4c 69 73  tic void blobLis
2470: 74 4c 6f 61 64 46 72 6f 6d 44 62 28 0a 20 20 73  tLoadFromDb(.  s
2480: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
2490: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
24a0: 66 72 6f 6d 20 74 68 69 73 20 64 61 74 61 62 61  from this databa
24b0: 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  se */.  const ch
24c0: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
24d0: 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74   /* Query used t
24e0: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 62 6c  o extract the bl
24f0: 6f 62 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c  obs */.  int onl
2500: 79 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  yId,            
2510: 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 77    /* Only load w
2520: 68 65 72 65 20 69 64 20 69 73 20 74 68 69 73 20  here id is this 
2530: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
2540: 70 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pN,             
2550: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74      /* OUT: Writ
2560: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 62  e number of blob
2570: 73 20 6c 6f 61 64 65 64 20 68 65 72 65 20 2a 2f  s loaded here */
2580: 0a 20 20 42 6c 6f 62 20 2a 2a 70 70 4c 69 73 74  .  Blob **ppList
2590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
25a0: 55 54 3a 20 57 72 69 74 65 20 74 68 65 20 68 65  UT: Write the he
25b0: 61 64 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 6c  ad of the blob l
25c0: 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
25d0: 20 42 6c 6f 62 20 68 65 61 64 3b 0a 20 20 42 6c   Blob head;.  Bl
25e0: 6f 62 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  ob *p;.  sqlite3
25f0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
2600: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  int n = 0;.  int
2610: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 32 3b   rc;.  char *z2;
2620: 0a 0a 20 20 69 66 28 20 6f 6e 6c 79 49 64 3e 30  ..  if( onlyId>0
2630: 20 29 7b 0a 20 20 20 20 7a 32 20 3d 20 73 71 6c   ){.    z2 = sql
2640: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
2650: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 25 64 22   WHERE rowid=%d"
2660: 2c 20 7a 53 71 6c 2c 20 6f 6e 6c 79 49 64 29 3b  , zSql, onlyId);
2670: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 32  .  }else{.    z2
2680: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2690: 74 66 28 22 25 73 22 2c 20 7a 53 71 6c 29 3b 0a  tf("%s", zSql);.
26a0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
26b0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
26c0: 2c 20 7a 32 2c 20 2d 31 2c 20 26 70 53 74 6d 74  , z2, -1, &pStmt
26d0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
26e0: 66 72 65 65 28 7a 32 29 3b 0a 20 20 69 66 28 20  free(z2);.  if( 
26f0: 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  rc ) fatalError(
2700: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
2710: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 68 65 61  rmsg(db));.  hea
2720: 64 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  d.pNext = 0;.  p
2730: 20 3d 20 26 68 65 61 64 3b 0a 20 20 77 68 69 6c   = &head;.  whil
2740: 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
2750: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2760: 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  t) ){.    int sz
2770: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2780: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31  n_bytes(pStmt, 1
2790: 29 3b 0a 20 20 20 20 42 6c 6f 62 20 2a 70 4e 65  );.    Blob *pNe
27a0: 77 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63  w = safe_realloc
27b0: 28 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  (0, sizeof(*pNew
27c0: 29 2b 73 7a 20 29 3b 0a 20 20 20 20 70 4e 65 77  )+sz );.    pNew
27d0: 2d 3e 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->id = sqlite3_c
27e0: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
27f0: 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73   0);.    pNew->s
2800: 7a 20 3d 20 73 7a 3b 0a 20 20 20 20 70 4e 65 77  z = sz;.    pNew
2810: 2d 3e 73 65 71 20 3d 20 6e 2b 2b 3b 0a 20 20 20  ->seq = n++;.   
2820: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30   pNew->pNext = 0
2830: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e 65  ;.    memcpy(pNe
2840: 77 2d 3e 61 2c 20 73 71 6c 69 74 65 33 5f 63 6f  w->a, sqlite3_co
2850: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
2860: 31 29 2c 20 73 7a 29 3b 0a 20 20 20 20 70 4e 65  1), sz);.    pNe
2870: 77 2d 3e 61 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20  w->a[sz] = 0;.  
2880: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65    p->pNext = pNe
2890: 77 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65 77 3b  w;.    p = pNew;
28a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
28b0: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
28c0: 20 20 2a 70 4e 20 3d 20 6e 3b 0a 20 20 2a 70 70    *pN = n;.  *pp
28d0: 4c 69 73 74 20 3d 20 68 65 61 64 2e 70 4e 65 78  List = head.pNex
28e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  t;.}../*.** Free
28f0: 20 61 20 6c 69 73 74 20 6f 66 20 42 6c 6f 62 20   a list of Blob 
2900: 6f 62 6a 65 63 74 73 0a 2a 2f 0a 73 74 61 74 69  objects.*/.stati
2910: 63 20 76 6f 69 64 20 62 6c 6f 62 4c 69 73 74 46  c void blobListF
2920: 72 65 65 28 42 6c 6f 62 20 2a 70 29 7b 0a 20 20  ree(Blob *p){.  
2930: 42 6c 6f 62 20 2a 70 4e 65 78 74 3b 0a 20 20 77  Blob *pNext;.  w
2940: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 70  hile( p ){.    p
2950: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
2960: 0a 20 20 20 20 66 72 65 65 28 70 29 3b 0a 20 20  .    free(p);.  
2970: 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d    p = pNext;.  }
2980: 0a 7d 0a 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  .}.../* Return t
2990: 68 65 20 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d  he current wall-
29a0: 63 6c 6f 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74  clock time */.st
29b0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74  atic sqlite3_int
29c0: 36 34 20 74 69 6d 65 4f 66 44 61 79 28 76 6f 69  64 timeOfDay(voi
29d0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c  d){.  static sql
29e0: 69 74 65 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56  ite3_vfs *clockV
29f0: 66 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  fs = 0;.  sqlite
2a00: 33 5f 69 6e 74 36 34 20 74 3b 0a 20 20 69 66 28  3_int64 t;.  if(
2a10: 20 63 6c 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63   clockVfs==0 ) c
2a20: 6c 6f 63 6b 56 66 73 20 3d 20 73 71 6c 69 74 65  lockVfs = sqlite
2a30: 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
2a40: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69   if( clockVfs->i
2a50: 56 65 72 73 69 6f 6e 3e 3d 31 20 26 26 20 63 6c  Version>=1 && 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 21 3d 30 20 29 7b 0a  TimeInt64!=0 ){.
2a80: 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43      clockVfs->xC
2a90: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
2aa0: 63 6c 6f 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20  clockVfs, &t);. 
2ab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62   }else{.    doub
2ac0: 6c 65 20 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56  le r;.    clockV
2ad0: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
2ae0: 28 63 6c 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a  (clockVfs, &r);.
2af0: 20 20 20 20 74 20 3d 20 28 73 71 6c 69 74 65 33      t = (sqlite3
2b00: 5f 69 6e 74 36 34 29 28 72 2a 38 36 34 30 30 30  _int64)(r*864000
2b10: 30 30 2e 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  00.0);.  }.  ret
2b20: 75 72 6e 20 74 3b 0a 7d 0a 0a 2f 2a 20 4d 65 74  urn t;.}../* Met
2b30: 68 6f 64 73 20 66 6f 72 20 74 68 65 20 56 48 61  hods for the VHa
2b40: 6e 64 6c 65 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73  ndle object.*/.s
2b50: 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 43  tatic int inmemC
2b60: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
2b70: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 56 48 61  e *pFile){.  VHa
2b80: 6e 64 6c 65 20 2a 70 20 3d 20 28 56 48 61 6e 64  ndle *p = (VHand
2b90: 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 56 46 69  le*)pFile;.  VFi
2ba0: 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20 70 2d 3e  le *pVFile = p->
2bb0: 70 56 46 69 6c 65 3b 0a 20 20 70 56 46 69 6c 65  pVFile;.  pVFile
2bc0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
2bd0: 70 56 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20  pVFile->nRef==0 
2be0: 26 26 20 70 56 46 69 6c 65 2d 3e 7a 46 69 6c 65  && pVFile->zFile
2bf0: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  name==0 ){.    p
2c00: 56 46 69 6c 65 2d 3e 73 7a 20 3d 20 2d 31 3b 0a  VFile->sz = -1;.
2c10: 20 20 20 20 66 72 65 65 28 70 56 46 69 6c 65 2d      free(pVFile-
2c20: 3e 61 29 3b 0a 20 20 20 20 70 56 46 69 6c 65 2d  >a);.    pVFile-
2c30: 3e 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  >a = 0;.  }.  re
2c40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c50: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d  }.static int inm
2c60: 65 6d 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  emRead(.  sqlite
2c70: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
2c80: 20 2f 2a 20 52 65 61 64 20 66 72 6f 6d 20 74 68   /* Read from th
2c90: 69 73 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  is open file */.
2ca0: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20    void *pData,  
2cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
2cc0: 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 69  e content in thi
2cd0: 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  s buffer */.  in
2ce0: 74 20 69 41 6d 74 2c 20 20 20 20 20 20 20 20 20  t iAmt,         
2cf0: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2d00: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73 71   content */.  sq
2d10: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73  lite3_int64 iOfs
2d20: 74 20 20 20 20 2f 2a 20 53 74 61 72 74 20 72 65  t    /* Start re
2d30: 61 64 69 6e 67 20 68 65 72 65 20 2a 2f 0a 29 7b  ading here */.){
2d40: 0a 20 20 56 48 61 6e 64 6c 65 20 2a 70 48 61 6e  .  VHandle *pHan
2d50: 64 6c 65 20 3d 20 28 56 48 61 6e 64 6c 65 2a 29  dle = (VHandle*)
2d60: 70 46 69 6c 65 3b 0a 20 20 56 46 69 6c 65 20 2a  pFile;.  VFile *
2d70: 70 56 46 69 6c 65 20 3d 20 70 48 61 6e 64 6c 65  pVFile = pHandle
2d80: 2d 3e 70 56 46 69 6c 65 3b 0a 20 20 69 66 28 20  ->pVFile;.  if( 
2d90: 69 4f 66 73 74 3c 30 20 7c 7c 20 69 4f 66 73 74  iOfst<0 || iOfst
2da0: 3e 3d 70 56 46 69 6c 65 2d 3e 73 7a 20 29 7b 0a  >=pVFile->sz ){.
2db0: 20 20 20 20 6d 65 6d 73 65 74 28 70 44 61 74 61      memset(pData
2dc0: 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20  , 0, iAmt);.    
2dd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2de0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
2df0: 20 20 7d 0a 20 20 69 66 28 20 69 4f 66 73 74 2b    }.  if( iOfst+
2e00: 69 41 6d 74 3e 70 56 46 69 6c 65 2d 3e 73 7a 20  iAmt>pVFile->sz 
2e10: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 44  ){.    memset(pD
2e20: 61 74 61 2c 20 30 2c 20 69 41 6d 74 29 3b 0a 20  ata, 0, iAmt);. 
2e30: 20 20 20 69 41 6d 74 20 3d 20 28 69 6e 74 29 28     iAmt = (int)(
2e40: 70 56 46 69 6c 65 2d 3e 73 7a 20 2d 20 69 4f 66  pVFile->sz - iOf
2e50: 73 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  st);.    memcpy(
2e60: 70 44 61 74 61 2c 20 70 56 46 69 6c 65 2d 3e 61  pData, pVFile->a
2e70: 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 72 65 74  , iAmt);.    ret
2e80: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2e90: 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
2ea0: 0a 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c  .  memcpy(pData,
2eb0: 20 70 56 46 69 6c 65 2d 3e 61 20 2b 20 69 4f 66   pVFile->a + iOf
2ec0: 73 74 2c 20 69 41 6d 74 29 3b 0a 20 20 72 65 74  st, iAmt);.  ret
2ed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65  .static int inme
2ef0: 6d 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  mWrite(.  sqlite
2f00: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  3_file *pFile,  
2f10: 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 69   /* Write to thi
2f20: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  s file */.  cons
2f30: 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20  t void *pData,  
2f40: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 74 6f     /* Content to
2f50: 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20   write */.  int 
2f60: 69 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  iAmt,           
2f70: 20 20 20 2f 2a 20 62 79 74 65 73 20 74 6f 20 77     /* bytes to w
2f80: 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rite */.  sqlite
2f90: 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 20 20 20  3_int64 iOfst   
2fa0: 20 2f 2a 20 53 74 61 72 74 20 77 72 69 74 69 6e   /* Start writin
2fb0: 67 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56  g here */.){.  V
2fc0: 48 61 6e 64 6c 65 20 2a 70 48 61 6e 64 6c 65 20  Handle *pHandle 
2fd0: 3d 20 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c  = (VHandle*)pFil
2fe0: 65 3b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69  e;.  VFile *pVFi
2ff0: 6c 65 20 3d 20 70 48 61 6e 64 6c 65 2d 3e 70 56  le = pHandle->pV
3000: 46 69 6c 65 3b 0a 20 20 69 66 28 20 69 4f 66 73  File;.  if( iOfs
3010: 74 2b 69 41 6d 74 20 3e 20 70 56 46 69 6c 65 2d  t+iAmt > pVFile-
3020: 3e 73 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 69  >sz ){.    if( i
3030: 4f 66 73 74 2b 69 41 6d 74 20 3e 3d 20 4d 58 5f  Ofst+iAmt >= MX_
3040: 46 49 4c 45 5f 53 5a 20 29 7b 0a 20 20 20 20 20  FILE_SZ ){.     
3050: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
3060: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ULL;.    }.    p
3070: 56 46 69 6c 65 2d 3e 61 20 3d 20 73 61 66 65 5f  VFile->a = safe_
3080: 72 65 61 6c 6c 6f 63 28 70 56 46 69 6c 65 2d 3e  realloc(pVFile->
3090: 61 2c 20 28 69 6e 74 29 28 69 4f 66 73 74 2b 69  a, (int)(iOfst+i
30a0: 41 6d 74 29 29 3b 0a 20 20 20 20 69 66 28 20 69  Amt));.    if( i
30b0: 4f 66 73 74 20 3e 20 70 56 46 69 6c 65 2d 3e 73  Ofst > pVFile->s
30c0: 7a 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  z ){.      memse
30d0: 74 28 70 56 46 69 6c 65 2d 3e 61 20 2b 20 70 56  t(pVFile->a + pV
30e0: 46 69 6c 65 2d 3e 73 7a 2c 20 30 2c 20 28 69 6e  File->sz, 0, (in
30f0: 74 29 28 69 4f 66 73 74 20 2d 20 70 56 46 69 6c  t)(iOfst - pVFil
3100: 65 2d 3e 73 7a 29 29 3b 0a 20 20 20 20 7d 0a 20  e->sz));.    }. 
3110: 20 20 20 70 56 46 69 6c 65 2d 3e 73 7a 20 3d 20     pVFile->sz = 
3120: 28 69 6e 74 29 28 69 4f 66 73 74 20 2b 20 69 41  (int)(iOfst + iA
3130: 6d 74 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  mt);.  }.  memcp
3140: 79 28 70 56 46 69 6c 65 2d 3e 61 20 2b 20 69 4f  y(pVFile->a + iO
3150: 66 73 74 2c 20 70 44 61 74 61 2c 20 69 41 6d 74  fst, pData, iAmt
3160: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
3170: 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
3180: 69 6e 74 20 69 6e 6d 65 6d 54 72 75 6e 63 61 74  int inmemTruncat
3190: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
31a0: 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69  pFile, sqlite3_i
31b0: 6e 74 36 34 20 69 53 69 7a 65 29 7b 0a 20 20 56  nt64 iSize){.  V
31c0: 48 61 6e 64 6c 65 20 2a 70 48 61 6e 64 6c 65 20  Handle *pHandle 
31d0: 3d 20 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c  = (VHandle*)pFil
31e0: 65 3b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69  e;.  VFile *pVFi
31f0: 6c 65 20 3d 20 70 48 61 6e 64 6c 65 2d 3e 70 56  le = pHandle->pV
3200: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 56 46 69  File;.  if( pVFi
3210: 6c 65 2d 3e 73 7a 3e 69 53 69 7a 65 20 26 26 20  le->sz>iSize && 
3220: 69 53 69 7a 65 3e 3d 30 20 29 20 70 56 46 69 6c  iSize>=0 ) pVFil
3230: 65 2d 3e 73 7a 20 3d 20 28 69 6e 74 29 69 53 69  e->sz = (int)iSi
3240: 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ze;.  return SQL
3250: 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
3260: 20 69 6e 74 20 69 6e 6d 65 6d 53 79 6e 63 28 73   int inmemSync(s
3270: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
3280: 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
3290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32a0: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
32b0: 20 69 6e 6d 65 6d 46 69 6c 65 53 69 7a 65 28 73   inmemFileSize(s
32c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
32d0: 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  le, sqlite3_int6
32e0: 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 2a 70 53  4 *pSize){.  *pS
32f0: 69 7a 65 20 3d 20 28 28 56 48 61 6e 64 6c 65 2a  ize = ((VHandle*
3300: 29 70 46 69 6c 65 29 2d 3e 70 56 46 69 6c 65 2d  )pFile)->pVFile-
3310: 3e 73 7a 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  >sz;.  return SQ
3320: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
3330: 63 20 69 6e 74 20 69 6e 6d 65 6d 4c 6f 63 6b 28  c int inmemLock(
3340: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
3350: 69 6c 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  ile, int type){.
3360: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3370: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
3380: 20 69 6e 6d 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c   inmemUnlock(sql
3390: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
33a0: 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 72  , int type){.  r
33b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33c0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  .}.static int in
33d0: 6d 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  memCheckReserved
33e0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
33f0: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70  e *pFile, int *p
3400: 4f 75 74 29 7b 0a 20 20 2a 70 4f 75 74 20 3d 20  Out){.  *pOut = 
3410: 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
3420: 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
3430: 69 6e 74 20 69 6e 6d 65 6d 46 69 6c 65 43 6f 6e  int inmemFileCon
3440: 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
3450: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70  e *pFile, int op
3460: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
3470: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
3480: 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 73 74 61 74 69  OTFOUND;.}.stati
3490: 63 20 69 6e 74 20 69 6e 6d 65 6d 53 65 63 74 6f  c int inmemSecto
34a0: 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
34b0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72 65  le *pFile){.  re
34c0: 74 75 72 6e 20 35 31 32 3b 0a 7d 0a 73 74 61 74  turn 512;.}.stat
34d0: 69 63 20 69 6e 74 20 69 6e 6d 65 6d 44 65 76 69  ic int inmemDevi
34e0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
34f0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
3500: 70 46 69 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e  pFile){.  return
3510: 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  .      SQLITE_IO
3520: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
3530: 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49  |.      SQLITE_I
3540: 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
3550: 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20  _WHEN_OPEN |.   
3560: 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
3570: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
3580: 49 54 45 3b 0a 7d 0a 0a 0a 2f 2a 20 4d 65 74 68  ITE;.}.../* Meth
3590: 6f 64 20 74 61 62 6c 65 20 66 6f 72 20 56 48 61  od table for VHa
35a0: 6e 64 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ndle.*/.static s
35b0: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
35c0: 73 20 56 48 61 6e 64 6c 65 4d 65 74 68 6f 64 73  s VHandleMethods
35d0: 20 3d 20 7b 0a 20 20 2f 2a 20 69 56 65 72 73 69   = {.  /* iVersi
35e0: 6f 6e 20 20 2a 2f 20 20 20 20 31 2c 0a 20 20 2f  on  */    1,.  /
35f0: 2a 20 78 43 6c 6f 73 65 20 20 20 20 2a 2f 20 20  * xClose    */  
3600: 20 20 69 6e 6d 65 6d 43 6c 6f 73 65 2c 0a 20 20    inmemClose,.  
3610: 2f 2a 20 78 52 65 61 64 20 20 20 20 20 2a 2f 20  /* xRead     */ 
3620: 20 20 20 69 6e 6d 65 6d 52 65 61 64 2c 0a 20 20     inmemRead,.  
3630: 2f 2a 20 78 57 72 69 74 65 20 20 20 20 2a 2f 20  /* xWrite    */ 
3640: 20 20 20 69 6e 6d 65 6d 57 72 69 74 65 2c 0a 20     inmemWrite,. 
3650: 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f   /* xTruncate */
3660: 20 20 20 20 69 6e 6d 65 6d 54 72 75 6e 63 61 74      inmemTruncat
3670: 65 2c 0a 20 20 2f 2a 20 78 53 79 6e 63 20 20 20  e,.  /* xSync   
3680: 20 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 53 79 6e    */    inmemSyn
3690: 63 2c 0a 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a  c,.  /* xFileSiz
36a0: 65 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 46 69 6c  e */    inmemFil
36b0: 65 53 69 7a 65 2c 0a 20 20 2f 2a 20 78 4c 6f 63  eSize,.  /* xLoc
36c0: 6b 20 20 20 20 20 2a 2f 20 20 20 20 69 6e 6d 65  k     */    inme
36d0: 6d 4c 6f 63 6b 2c 0a 20 20 2f 2a 20 78 55 6e 6c  mLock,.  /* xUnl
36e0: 6f 63 6b 20 20 20 2a 2f 20 20 20 20 69 6e 6d 65  ock   */    inme
36f0: 6d 55 6e 6c 6f 63 6b 2c 0a 20 20 2f 2a 20 78 43  mUnlock,.  /* xC
3700: 68 65 63 6b 2e 2e 2e 20 2a 2f 20 20 20 20 69 6e  heck... */    in
3710: 6d 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64  memCheckReserved
3720: 4c 6f 63 6b 2c 0a 20 20 2f 2a 20 78 46 69 6c 65  Lock,.  /* xFile
3730: 43 74 72 6c 20 2a 2f 20 20 20 20 69 6e 6d 65 6d  Ctrl */    inmem
3740: 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 0a 20 20 2f  FileControl,.  /
3750: 2a 20 78 53 65 63 74 6f 72 53 7a 20 2a 2f 20 20  * xSectorSz */  
3760: 20 20 69 6e 6d 65 6d 53 65 63 74 6f 72 53 69 7a    inmemSectorSiz
3770: 65 2c 0a 20 20 2f 2a 20 78 44 65 76 63 68 61 72  e,.  /* xDevchar
3780: 20 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 44 65 76    */    inmemDev
3790: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
37a0: 63 73 2c 0a 20 20 2f 2a 20 78 53 68 6d 4d 61 70  cs,.  /* xShmMap
37b0: 20 20 20 2a 2f 20 20 20 20 30 2c 0a 20 20 2f 2a     */    0,.  /*
37c0: 20 78 53 68 6d 4c 6f 63 6b 20 20 2a 2f 20 20 20   xShmLock  */   
37d0: 20 30 2c 0a 20 20 2f 2a 20 78 53 68 6d 42 61 72   0,.  /* xShmBar
37e0: 72 69 65 72 20 2a 2f 20 20 30 2c 0a 20 20 2f 2a  rier */  0,.  /*
37f0: 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20   xShmUnmap */   
3800: 20 30 2c 0a 20 20 2f 2a 20 78 46 65 74 63 68 20   0,.  /* xFetch 
3810: 20 20 20 2a 2f 20 20 20 20 30 2c 0a 20 20 2f 2a     */    0,.  /*
3820: 20 78 55 6e 66 65 74 63 68 20 20 2a 2f 20 20 20   xUnfetch  */   
3830: 20 30 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65   0.};../*.** Ope
3840: 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 69 6e 20  n a new file in 
3850: 74 68 65 20 69 6e 6d 65 6d 20 56 46 53 2e 20 20  the inmem VFS.  
3860: 41 6c 6c 20 66 69 6c 65 73 20 61 72 65 20 61 6e  All files are an
3870: 6f 6e 79 6d 6f 75 73 20 61 6e 64 20 61 72 65 0a  onymous and are.
3880: 2a 2a 20 64 65 6c 65 74 65 2d 6f 6e 2d 63 6c 6f  ** delete-on-clo
3890: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
38a0: 74 20 69 6e 6d 65 6d 4f 70 65 6e 28 0a 20 20 73  t inmemOpen(.  s
38b0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
38c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
38d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 73 71 6c  zFilename,.  sql
38e0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
38f0: 2c 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ,.  int openFlag
3900: 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  s,.  int *pOutFl
3910: 61 67 73 0a 29 7b 0a 20 20 56 46 69 6c 65 20 2a  ags.){.  VFile *
3920: 70 56 46 69 6c 65 20 3d 20 63 72 65 61 74 65 56  pVFile = createV
3930: 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  File(zFilename, 
3940: 30 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  0, (unsigned cha
3950: 72 2a 29 22 22 29 3b 0a 20 20 56 48 61 6e 64 6c  r*)"");.  VHandl
3960: 65 20 2a 70 48 61 6e 64 6c 65 20 3d 20 28 56 48  e *pHandle = (VH
3970: 61 6e 64 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20  andle*)pFile;.  
3980: 69 66 28 20 70 56 46 69 6c 65 3d 3d 30 20 29 7b  if( pVFile==0 ){
3990: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
39a0: 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 70  TE_FULL;.  }.  p
39b0: 48 61 6e 64 6c 65 2d 3e 70 56 46 69 6c 65 20 3d  Handle->pVFile =
39c0: 20 70 56 46 69 6c 65 3b 0a 20 20 70 56 46 69 6c   pVFile;.  pVFil
39d0: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 46 69  e->nRef++;.  pFi
39e0: 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26  le->pMethods = &
39f0: 56 48 61 6e 64 6c 65 4d 65 74 68 6f 64 73 3b 0a  VHandleMethods;.
3a00: 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
3a10: 29 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 6f  ) *pOutFlags = o
3a20: 70 65 6e 46 6c 61 67 73 3b 0a 20 20 72 65 74 75  penFlags;.  retu
3a30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3a40: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
3a50: 66 69 6c 65 20 62 79 20 6e 61 6d 65 0a 2a 2f 0a  file by name.*/.
3a60: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d  static int inmem
3a70: 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
3a80: 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63  3_vfs *pVfs,.  c
3a90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3aa0: 6e 61 6d 65 2c 0a 20 20 69 6e 74 20 73 79 6e 63  name,.  int sync
3ab0: 64 69 72 0a 29 7b 0a 20 20 56 46 69 6c 65 20 2a  dir.){.  VFile *
3ac0: 70 56 46 69 6c 65 20 3d 20 66 69 6e 64 56 46 69  pVFile = findVFi
3ad0: 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  le(zFilename);. 
3ae0: 20 69 66 28 20 70 56 46 69 6c 65 3d 3d 30 20 29   if( pVFile==0 )
3af0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3b00: 4b 3b 0a 20 20 69 66 28 20 70 56 46 69 6c 65 2d  K;.  if( pVFile-
3b10: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
3b20: 66 72 65 65 28 70 56 46 69 6c 65 2d 3e 7a 46 69  free(pVFile->zFi
3b30: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 56 46  lename);.    pVF
3b40: 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ile->zFilename =
3b50: 20 30 3b 0a 20 20 20 20 70 56 46 69 6c 65 2d 3e   0;.    pVFile->
3b60: 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 66 72 65  sz = -1;.    fre
3b70: 65 28 70 56 46 69 6c 65 2d 3e 61 29 3b 0a 20 20  e(pVFile->a);.  
3b80: 20 20 70 56 46 69 6c 65 2d 3e 61 20 3d 20 30 3b    pVFile->a = 0;
3b90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3ba0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
3bb0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
3bc0: 5f 44 45 4c 45 54 45 3b 0a 7d 0a 0a 2f 2a 20 43  _DELETE;.}../* C
3bd0: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 65 78 69  heck for the exi
3be0: 73 74 61 6e 63 65 20 6f 66 20 61 20 66 69 6c 65  stance of a file
3bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
3c00: 6e 6d 65 6d 41 63 63 65 73 73 28 0a 20 20 73 71  nmemAccess(.  sq
3c10: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
3c20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3c30: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 69 6e 74 20  Filename,.  int 
3c40: 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 52  flags,.  int *pR
3c50: 65 73 4f 75 74 0a 29 7b 0a 20 20 56 46 69 6c 65  esOut.){.  VFile
3c60: 20 2a 70 56 46 69 6c 65 20 3d 20 66 69 6e 64 56   *pVFile = findV
3c70: 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  File(zFilename);
3c80: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 20 70  .  *pResOut =  p
3c90: 56 46 69 6c 65 21 3d 30 3b 0a 20 20 72 65 74 75  VFile!=0;.  retu
3ca0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3cb0: 0a 2f 2a 20 47 65 74 20 74 68 65 20 63 61 6e 6f  ./* Get the cano
3cc0: 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 66  nical pathname f
3cd0: 6f 72 20 61 20 66 69 6c 65 0a 2a 2f 0a 73 74 61  or a file.*/.sta
3ce0: 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 46 75 6c  tic int inmemFul
3cf0: 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
3d00: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
3d10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
3d20: 69 6c 65 6e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ilename,.  int n
3d30: 4f 75 74 2c 0a 20 20 63 68 61 72 20 2a 7a 4f 75  Out,.  char *zOu
3d40: 74 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  t.){.  sqlite3_s
3d50: 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f  nprintf(nOut, zO
3d60: 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e  ut, "%s", zFilen
3d70: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ame);.  return S
3d80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
3d90: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
3da0: 56 46 53 20 74 68 61 74 20 72 65 61 64 73 20 66  VFS that reads f
3db0: 72 6f 6d 20 74 68 65 20 67 2e 61 46 69 6c 65 5b  rom the g.aFile[
3dc0: 5d 20 73 65 74 20 6f 66 20 66 69 6c 65 73 2e 0a  ] set of files..
3dd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3de0: 6e 6d 65 6d 56 66 73 52 65 67 69 73 74 65 72 28  nmemVfsRegister(
3df0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
3e00: 73 71 6c 69 74 65 33 5f 76 66 73 20 69 6e 6d 65  sqlite3_vfs inme
3e10: 6d 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f  mVfs;.  sqlite3_
3e20: 76 66 73 20 2a 70 44 65 66 61 75 6c 74 20 3d 20  vfs *pDefault = 
3e30: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
3e40: 28 30 29 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e  (0);.  inmemVfs.
3e50: 69 56 65 72 73 69 6f 6e 20 3d 20 33 3b 0a 20 20  iVersion = 3;.  
3e60: 69 6e 6d 65 6d 56 66 73 2e 73 7a 4f 73 46 69 6c  inmemVfs.szOsFil
3e70: 65 20 3d 20 73 69 7a 65 6f 66 28 56 48 61 6e 64  e = sizeof(VHand
3e80: 6c 65 29 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e  le);.  inmemVfs.
3e90: 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 32 30 30  mxPathname = 200
3ea0: 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 7a 4e 61  ;.  inmemVfs.zNa
3eb0: 6d 65 20 3d 20 22 69 6e 6d 65 6d 22 3b 0a 20 20  me = "inmem";.  
3ec0: 69 6e 6d 65 6d 56 66 73 2e 78 4f 70 65 6e 20 3d  inmemVfs.xOpen =
3ed0: 20 69 6e 6d 65 6d 4f 70 65 6e 3b 0a 20 20 69 6e   inmemOpen;.  in
3ee0: 6d 65 6d 56 66 73 2e 78 44 65 6c 65 74 65 20 3d  memVfs.xDelete =
3ef0: 20 69 6e 6d 65 6d 44 65 6c 65 74 65 3b 0a 20 20   inmemDelete;.  
3f00: 69 6e 6d 65 6d 56 66 73 2e 78 41 63 63 65 73 73  inmemVfs.xAccess
3f10: 20 3d 20 69 6e 6d 65 6d 41 63 63 65 73 73 3b 0a   = inmemAccess;.
3f20: 20 20 69 6e 6d 65 6d 56 66 73 2e 78 46 75 6c 6c    inmemVfs.xFull
3f30: 50 61 74 68 6e 61 6d 65 20 3d 20 69 6e 6d 65 6d  Pathname = inmem
3f40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20  FullPathname;.  
3f50: 69 6e 6d 65 6d 56 66 73 2e 78 52 61 6e 64 6f 6d  inmemVfs.xRandom
3f60: 6e 65 73 73 20 3d 20 70 44 65 66 61 75 6c 74 2d  ness = pDefault-
3f70: 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 3b 0a 20 20  >xRandomness;.  
3f80: 69 6e 6d 65 6d 56 66 73 2e 78 53 6c 65 65 70 20  inmemVfs.xSleep 
3f90: 3d 20 70 44 65 66 61 75 6c 74 2d 3e 78 53 6c 65  = pDefault->xSle
3fa0: 65 70 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78  ep;.  inmemVfs.x
3fb0: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
3fc0: 20 3d 20 70 44 65 66 61 75 6c 74 2d 3e 78 43 75   = pDefault->xCu
3fd0: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 3b 0a  rrentTimeInt64;.
3fe0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
3ff0: 67 69 73 74 65 72 28 26 69 6e 6d 65 6d 56 66 73  gister(&inmemVfs
4000: 2c 20 30 29 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  , 0);.};../*.** 
4010: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
4020: 6f 72 20 74 68 65 20 72 75 6e 46 6c 61 67 73 20  or the runFlags 
4030: 70 61 72 61 6d 65 74 65 72 20 74 6f 20 72 75 6e  parameter to run
4040: 53 71 6c 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  Sql().*/.#define
4050: 20 53 51 4c 5f 54 52 41 43 45 20 20 30 78 30 30   SQL_TRACE  0x00
4060: 30 31 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20  01     /* Print 
4070: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
4080: 6e 74 20 61 73 20 69 74 20 69 73 20 70 72 65 70  nt as it is prep
4090: 61 72 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ared */.#define 
40a0: 53 51 4c 5f 4f 55 54 50 55 54 20 30 78 30 30 30  SQL_OUTPUT 0x000
40b0: 32 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 74 68  2     /* Show th
40c0: 65 20 53 51 4c 20 6f 75 74 70 75 74 20 2a 2f 0a  e SQL output */.
40d0: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 6d 75 6c 74 69  ./*.** Run multi
40e0: 70 6c 65 20 63 6f 6d 6d 61 6e 64 73 20 6f 66 20  ple commands of 
40f0: 53 51 4c 2e 20 20 53 69 6d 69 6c 61 72 20 74 6f  SQL.  Similar to
4100: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2c   sqlite3_exec(),
4110: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a   but does not.**
4120: 20 73 74 6f 70 20 69 66 20 61 6e 20 65 72 72 6f   stop if an erro
4130: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
4140: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4150: 20 72 75 6e 53 71 6c 28 73 71 6c 69 74 65 33 20   runSql(sqlite3 
4160: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
4170: 2a 7a 53 71 6c 2c 20 75 6e 73 69 67 6e 65 64 20  *zSql, unsigned 
4180: 20 72 75 6e 46 6c 61 67 73 29 7b 0a 20 20 63 6f   runFlags){.  co
4190: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 72 65 3b  nst char *zMore;
41a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
41b0: 45 6e 64 20 3d 20 26 7a 53 71 6c 5b 73 74 72 6c  End = &zSql[strl
41c0: 65 6e 28 7a 53 71 6c 29 5d 3b 0a 20 20 73 71 6c  en(zSql)];.  sql
41d0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
41e0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  ;..  while( zSql
41f0: 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20   && zSql[0] ){. 
4200: 20 20 20 7a 4d 6f 72 65 20 3d 20 30 3b 0a 20 20     zMore = 0;.  
4210: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
4220: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
4230: 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
4240: 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4d 6f 72 65  , &pStmt, &zMore
4250: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  );.    assert( z
4260: 4d 6f 72 65 3c 3d 7a 45 6e 64 20 29 3b 0a 20 20  More<=zEnd );.  
4270: 20 20 69 66 28 20 7a 4d 6f 72 65 3d 3d 7a 53 71    if( zMore==zSq
4280: 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  l ) break;.    i
4290: 66 28 20 72 75 6e 46 6c 61 67 73 20 26 20 53 51  f( runFlags & SQ
42a0: 4c 5f 54 52 41 43 45 20 29 7b 0a 20 20 20 20 20  L_TRACE ){.     
42b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
42c0: 20 7a 53 71 6c 3b 0a 20 20 20 20 20 20 69 6e 74   zSql;.      int
42d0: 20 6e 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   n;.      while(
42e0: 20 7a 3c 7a 4d 6f 72 65 20 26 26 20 49 53 53 50   z<zMore && ISSP
42f0: 41 43 45 28 7a 5b 30 5d 29 20 29 20 7a 2b 2b 3b  ACE(z[0]) ) z++;
4300: 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29  .      n = (int)
4310: 28 7a 4d 6f 72 65 20 2d 20 7a 29 3b 0a 20 20 20  (zMore - z);.   
4320: 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26     while( n>0 &&
4330: 20 49 53 53 50 41 43 45 28 7a 5b 6e 2d 31 5d 29   ISSPACE(z[n-1])
4340: 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66   ) n--;.      if
4350: 28 20 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ( n==0 ) break;.
4360: 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 3d        if( pStmt=
4370: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  =0 ){.        pr
4380: 69 6e 74 66 28 22 54 52 41 43 45 3a 20 25 2e 2a  intf("TRACE: %.*
4390: 73 20 28 65 72 72 6f 72 3a 20 25 73 29 5c 6e 22  s (error: %s)\n"
43a0: 2c 20 6e 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f  , n, z, sqlite3_
43b0: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
43c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
43d0: 20 20 70 72 69 6e 74 66 28 22 54 52 41 43 45 3a    printf("TRACE:
43e0: 20 25 2e 2a 73 5c 6e 22 2c 20 6e 2c 20 7a 29 3b   %.*s\n", n, z);
43f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4400: 20 20 20 7a 53 71 6c 20 3d 20 7a 4d 6f 72 65 3b     zSql = zMore;
4410: 0a 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 29  .    if( pStmt )
4420: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 72 75 6e  {.      if( (run
4430: 46 6c 61 67 73 20 26 20 53 51 4c 5f 4f 55 54 50  Flags & SQL_OUTP
4440: 55 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  UT)==0 ){.      
4450: 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
4460: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
4470: 70 28 70 53 74 6d 74 29 20 29 7b 7d 0a 20 20 20  p(pStmt) ){}.   
4480: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4490: 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 2d 31 3b    int nCol = -1;
44a0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
44b0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
44c0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20  te3_step(pStmt) 
44d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
44e0: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   i;.          if
44f0: 28 20 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( nCol<0 ){.    
4500: 20 20 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 73          nCol = s
4510: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
4520: 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
4530: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4540: 6e 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  nCol>0 ){.      
4550: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 2d 2d        printf("--
4560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a  ----------\n");.
4590: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
45a0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
45b0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
45c0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 54 79           int eTy
45d0: 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  pe = sqlite3_col
45e0: 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 69  umn_type(pStmt,i
45f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
4600: 72 69 6e 74 66 28 22 25 73 20 3d 20 22 2c 20 73  rintf("%s = ", s
4610: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
4620: 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  me(pStmt,i));.  
4630: 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68            switch
4640: 28 20 65 54 79 70 65 20 29 7b 0a 20 20 20 20 20  ( eType ){.     
4650: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
4660: 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
4680: 6e 74 66 28 22 4e 55 4c 4c 5c 6e 22 29 3b 0a 20  ntf("NULL\n");. 
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
46a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
46b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
46c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
46d0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
46e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
46f0: 66 28 22 49 4e 54 20 25 73 5c 6e 22 2c 20 73 71  f("INT %s\n", sq
4700: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
4710: 74 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20  t(pStmt,i));.   
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
4730: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
4740: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4750: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
4760: 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  OAT: {.         
4770: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 46         printf("F
4780: 4c 4f 41 54 20 25 73 5c 6e 22 2c 20 73 71 6c 69  LOAT %s\n", sqli
4790: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
47a0: 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20  pStmt,i));.     
47b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
47c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
47d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
47e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
47f0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
4800: 20 20 20 20 70 72 69 6e 74 66 28 22 54 45 58 54      printf("TEXT
4810: 20 5b 25 73 5d 5c 6e 22 2c 20 73 71 6c 69 74 65   [%s]\n", sqlite
4820: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
4830: 74 6d 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  tmt,i));.       
4840: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
4870: 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 20  se SQLITE_BLOB: 
4880: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4890: 20 20 70 72 69 6e 74 66 28 22 42 4c 4f 42 20 28    printf("BLOB (
48a0: 25 64 20 62 79 74 65 73 29 5c 6e 22 2c 20 73 71  %d bytes)\n", sq
48b0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
48c0: 65 73 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  es(pStmt,i));.  
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
48e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
48f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4900: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
4910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4920: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
4930: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
4940: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
4950: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 62 75   }.}../*.** Rebu
4960: 69 6c 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ild the database
4970: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   file..**.**    
4980: 28 31 29 20 20 52 65 6d 6f 76 65 20 64 75 70 6c  (1)  Remove dupl
4990: 69 63 61 74 65 20 65 6e 74 72 69 65 73 0a 2a 2a  icate entries.**
49a0: 20 20 20 20 28 32 29 20 20 50 75 74 20 61 6c 6c      (2)  Put all
49b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 6f 72 64 65   entries in orde
49c0: 72 0a 2a 2a 20 20 20 20 28 33 29 20 20 56 61 63  r.**    (3)  Vac
49d0: 75 75 6d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  uum.*/.static vo
49e0: 69 64 20 72 65 62 75 69 6c 64 5f 64 61 74 61 62  id rebuild_datab
49f0: 61 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ase(sqlite3 *db)
4a00: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
4a10: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
4a20: 64 62 2c 20 0a 20 20 20 20 20 22 42 45 47 49 4e  db, .     "BEGIN
4a30: 3b 5c 6e 22 0a 20 20 20 20 20 22 43 52 45 41 54  ;\n".     "CREAT
4a40: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 64 62 78  E TEMP TABLE dbx
4a50: 20 41 53 20 53 45 4c 45 43 54 20 44 49 53 54 49   AS SELECT DISTI
4a60: 4e 43 54 20 64 62 63 6f 6e 74 65 6e 74 20 46 52  NCT dbcontent FR
4a70: 4f 4d 20 64 62 3b 5c 6e 22 0a 20 20 20 20 20 22  OM db;\n".     "
4a80: 44 45 4c 45 54 45 20 46 52 4f 4d 20 64 62 3b 5c  DELETE FROM db;\
4a90: 6e 22 0a 20 20 20 20 20 22 49 4e 53 45 52 54 20  n".     "INSERT 
4aa0: 49 4e 54 4f 20 64 62 28 64 62 69 64 2c 20 64 62  INTO db(dbid, db
4ab0: 63 6f 6e 74 65 6e 74 29 20 53 45 4c 45 43 54 20  content) SELECT 
4ac0: 4e 55 4c 4c 2c 20 64 62 63 6f 6e 74 65 6e 74 20  NULL, dbcontent 
4ad0: 46 52 4f 4d 20 64 62 78 20 4f 52 44 45 52 20 42  FROM dbx ORDER B
4ae0: 59 20 32 3b 5c 6e 22 0a 20 20 20 20 20 22 44 52  Y 2;\n".     "DR
4af0: 4f 50 20 54 41 42 4c 45 20 64 62 78 3b 5c 6e 22  OP TABLE dbx;\n"
4b00: 0a 20 20 20 20 20 22 43 52 45 41 54 45 20 54 45  .     "CREATE TE
4b10: 4d 50 20 54 41 42 4c 45 20 73 78 20 41 53 20 53  MP TABLE sx AS S
4b20: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 73  ELECT DISTINCT s
4b30: 71 6c 74 65 78 74 20 46 52 4f 4d 20 78 73 71 6c  qltext FROM xsql
4b40: 3b 5c 6e 22 0a 20 20 20 20 20 22 44 45 4c 45 54  ;\n".     "DELET
4b50: 45 20 46 52 4f 4d 20 78 73 71 6c 3b 5c 6e 22 0a  E FROM xsql;\n".
4b60: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
4b70: 4f 20 78 73 71 6c 28 73 71 6c 69 64 2c 73 71 6c  O xsql(sqlid,sql
4b80: 74 65 78 74 29 20 53 45 4c 45 43 54 20 4e 55 4c  text) SELECT NUL
4b90: 4c 2c 20 73 71 6c 74 65 78 74 20 46 52 4f 4d 20  L, sqltext FROM 
4ba0: 73 78 20 4f 52 44 45 52 20 42 59 20 32 3b 5c 6e  sx ORDER BY 2;\n
4bb0: 22 0a 20 20 20 20 20 22 44 52 4f 50 20 54 41 42  ".     "DROP TAB
4bc0: 4c 45 20 73 78 3b 5c 6e 22 0a 20 20 20 20 20 22  LE sx;\n".     "
4bd0: 43 4f 4d 4d 49 54 3b 5c 6e 22 0a 20 20 20 20 20  COMMIT;\n".     
4be0: 22 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  "PRAGMA page_siz
4bf0: 65 3d 31 30 32 34 3b 5c 6e 22 0a 20 20 20 20 20  e=1024;\n".     
4c00: 22 56 41 43 55 55 4d 3b 5c 6e 22 2c 20 30 2c 20  "VACUUM;\n", 0, 
4c10: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  0, 0);.  if( rc 
4c20: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61  ) fatalError("ca
4c30: 6e 6e 6f 74 20 72 65 62 75 69 6c 64 3a 20 25 73  nnot rebuild: %s
4c40: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
4c50: 67 28 64 62 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  g(db));.}../*.**
4c60: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
4c70: 65 20 6f 66 20 61 20 68 65 78 61 64 65 63 69 6d  e of a hexadecim
4c80: 61 6c 20 64 69 67 69 74 2e 20 20 52 65 74 75 72  al digit.  Retur
4c90: 6e 20 2d 31 20 69 66 20 74 68 65 20 69 6e 70 75  n -1 if the inpu
4ca0: 74 0a 2a 2a 20 69 73 20 6e 6f 74 20 61 20 68 65  t.** is not a he
4cb0: 78 20 64 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74  x digit..*/.stat
4cc0: 69 63 20 69 6e 74 20 68 65 78 44 69 67 69 74 56  ic int hexDigitV
4cd0: 61 6c 75 65 28 63 68 61 72 20 63 29 7b 0a 20 20  alue(char c){.  
4ce0: 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
4cf0: 3d 27 39 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='9' ) return c 
4d00: 2d 20 27 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d  - '0';.  if( c>=
4d10: 27 61 27 20 26 26 20 63 3c 3d 27 66 27 20 29 20  'a' && c<='f' ) 
4d20: 72 65 74 75 72 6e 20 63 20 2d 20 27 61 27 20 2b  return c - 'a' +
4d30: 20 31 30 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41   10;.  if( c>='A
4d40: 27 20 26 26 20 63 3c 3d 27 46 27 20 29 20 72 65  ' && c<='F' ) re
4d50: 74 75 72 6e 20 63 20 2d 20 27 41 27 20 2b 20 31  turn c - 'A' + 1
4d60: 30 3b 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0;.  return -1;.
4d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
4d80: 65 74 20 7a 41 72 67 20 61 73 20 61 6e 20 69 6e  et zArg as an in
4d90: 74 65 67 65 72 20 76 61 6c 75 65 2c 20 70 6f 73  teger value, pos
4da0: 73 69 62 6c 79 20 77 69 74 68 20 73 75 66 66 69  sibly with suffi
4db0: 78 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  xes..*/.static i
4dc0: 6e 74 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt integerValue(
4dd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
4de0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
4df0: 36 34 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74  64 v = 0;.  stat
4e00: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
4e10: 7b 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b  { char *zSuffix;
4e20: 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d   int iMult; } aM
4e30: 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ult[] = {.    { 
4e40: 22 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20  "KiB", 1024 },. 
4e50: 20 20 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34     { "MiB", 1024
4e60: 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22  *1024 },.    { "
4e70: 47 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a  GiB", 1024*1024*
4e80: 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b  1024 },.    { "K
4e90: 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20  B",  1000 },.   
4ea0: 20 7b 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30   { "MB",  100000
4eb0: 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c  0 },.    { "GB",
4ec0: 20 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a    1000000000 },.
4ed0: 20 20 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30      { "K",   100
4ee0: 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20  0 },.    { "M", 
4ef0: 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20    1000000 },.   
4f00: 20 7b 20 22 47 22 2c 20 20 20 31 30 30 30 30 30   { "G",   100000
4f10: 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69  0000 },.  };.  i
4f20: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65  nt i;.  int isNe
4f30: 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72  g = 0;.  if( zAr
4f40: 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  g[0]=='-' ){.   
4f50: 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20   isNeg = 1;.    
4f60: 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20  zArg++;.  }else 
4f70: 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27  if( zArg[0]=='+'
4f80: 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a   ){.    zArg++;.
4f90: 20 20 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30    }.  if( zArg[0
4fa0: 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31  ]=='0' && zArg[1
4fb0: 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e  ]=='x' ){.    in
4fc0: 74 20 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d  t x;.    zArg +=
4fd0: 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   2;.    while( (
4fe0: 78 20 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75  x = hexDigitValu
4ff0: 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29  e(zArg[0]))>=0 )
5000: 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c  {.      v = (v<<
5010: 34 29 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41  4) + x;.      zA
5020: 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rg++;.    }.  }e
5030: 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
5040: 49 53 44 49 47 49 54 28 7a 41 72 67 5b 30 5d 29  ISDIGIT(zArg[0])
5050: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a   ){.      v = v*
5060: 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27  10 + zArg[0] - '
5070: 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b  0';.      zArg++
5080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
5090: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
50a0: 61 4d 75 6c 74 29 2f 73 69 7a 65 6f 66 28 61 4d  aMult)/sizeof(aM
50b0: 75 6c 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  ult[0]); i++){. 
50c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
50d0: 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e  tricmp(aMult[i].
50e0: 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d  zSuffix, zArg)==
50f0: 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20  0 ){.      v *= 
5100: 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a  aMult[i].iMult;.
5110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5120: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 76 3e 30   }.  }.  if( v>0
5130: 78 37 66 66 66 66 66 66 66 20 29 20 66 61 74 61  x7fffffff ) fata
5140: 6c 45 72 72 6f 72 28 22 70 61 72 61 6d 65 74 65  lError("paramete
5150: 72 20 74 6f 6f 20 6c 61 72 67 65 20 2d 20 6d 61  r too large - ma
5160: 78 20 32 31 34 37 34 38 33 36 34 38 22 29 3b 0a  x 2147483648");.
5170: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 69    return (int)(i
5180: 73 4e 65 67 3f 20 2d 76 20 3a 20 76 29 3b 0a 7d  sNeg? -v : v);.}
5190: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 73 6b  ../*.** Print sk
51a0: 65 74 63 68 79 20 64 6f 63 75 6d 65 6e 74 61 74  etchy documentat
51b0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 75 74 69  ion for this uti
51c0: 6c 69 74 79 20 70 72 6f 67 72 61 6d 0a 2a 2f 0a  lity program.*/.
51d0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 6f 77  static void show
51e0: 48 65 6c 70 28 76 6f 69 64 29 7b 0a 20 20 70 72  Help(void){.  pr
51f0: 69 6e 74 66 28 22 55 73 61 67 65 3a 20 25 73 20  intf("Usage: %s 
5200: 5b 6f 70 74 69 6f 6e 73 5d 20 53 4f 55 52 43 45  [options] SOURCE
5210: 2d 44 42 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e 22  -DB ?ARGS...?\n"
5220: 2c 20 67 2e 7a 41 72 67 76 30 29 3b 0a 20 20 70  , g.zArgv0);.  p
5230: 72 69 6e 74 66 28 0a 22 52 65 61 64 20 64 61 74  rintf(."Read dat
5240: 61 62 61 73 65 73 20 61 6e 64 20 53 51 4c 20 73  abases and SQL s
5250: 63 72 69 70 74 73 20 66 72 6f 6d 20 53 4f 55 52  cripts from SOUR
5260: 43 45 2d 44 42 20 61 6e 64 20 65 78 65 63 75 74  CE-DB and execut
5270: 65 20 65 61 63 68 20 73 63 72 69 70 74 20 61 67  e each script ag
5280: 61 69 6e 73 74 5c 6e 22 0a 22 65 61 63 68 20 64  ainst\n"."each d
5290: 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
52a0: 67 20 66 6f 72 20 63 72 61 73 68 65 73 20 61 6e  g for crashes an
52b0: 64 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 73 2e 5c  d memory leaks.\
52c0: 6e 22 0a 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a  n"."Options:\n".
52d0: 22 20 20 2d 2d 63 65 6c 6c 2d 73 69 7a 65 2d 63  "  --cell-size-c
52e0: 68 65 63 6b 20 20 20 20 20 53 65 74 20 74 68 65  heck     Set the
52f0: 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a   PRAGMA cell_siz
5300: 65 5f 63 68 65 63 6b 3d 4f 4e 5c 6e 22 0a 22 20  e_check=ON\n"." 
5310: 20 2d 2d 64 62 69 64 20 4e 20 20 20 20 20 20 20   --dbid N       
5320: 20 20 20 20 20 20 20 55 73 65 20 6f 6e 6c 79 20         Use only 
5330: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68 65  the database whe
5340: 72 65 20 64 62 69 64 3d 4e 5c 6e 22 0a 22 20 20  re dbid=N\n"."  
5350: 2d 2d 65 78 70 6f 72 74 2d 64 62 20 44 49 52 20  --export-db DIR 
5360: 20 20 20 20 20 20 57 72 69 74 65 20 64 61 74 61        Write data
5370: 62 61 73 65 73 20 74 6f 20 66 69 6c 65 73 28 73  bases to files(s
5380: 29 20 69 6e 20 44 49 52 2e 20 57 6f 72 6b 73 20  ) in DIR. Works 
5390: 77 69 74 68 20 2d 2d 64 62 69 64 5c 6e 22 0a 22  with --dbid\n"."
53a0: 20 20 2d 2d 65 78 70 6f 72 74 2d 73 71 6c 20 44    --export-sql D
53b0: 49 52 20 20 20 20 20 20 57 72 69 74 65 20 53 51  IR      Write SQ
53c0: 4c 20 74 6f 20 66 69 6c 65 28 73 29 20 69 6e 20  L to file(s) in 
53d0: 44 49 52 2e 20 41 6c 73 6f 20 77 6f 72 6b 73 20  DIR. Also works 
53e0: 77 69 74 68 20 2d 2d 73 71 6c 69 64 5c 6e 22 0a  with --sqlid\n".
53f0: 22 20 20 2d 2d 68 65 6c 70 20 20 20 20 20 20 20  "  --help       
5400: 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
5410: 69 73 20 68 65 6c 70 20 74 65 78 74 5c 6e 22 0a  is help text\n".
5420: 22 20 20 2d 71 7c 2d 2d 71 75 69 65 74 20 20 20  "  -q|--quiet   
5430: 20 20 20 20 20 20 20 20 20 52 65 64 75 63 65 64           Reduced
5440: 20 6f 75 74 70 75 74 5c 6e 22 0a 22 20 20 2d 2d   output\n"."  --
5450: 6c 69 6d 69 74 2d 6d 65 6d 20 4e 20 20 20 20 20  limit-mem N     
5460: 20 20 20 20 4c 69 6d 69 74 20 6d 65 6d 6f 72 79      Limit memory
5470: 20 75 73 65 64 20 62 79 20 74 65 73 74 20 53 51   used by test SQ
5480: 4c 69 74 65 20 69 6e 73 74 61 6e 63 65 20 74 6f  Lite instance to
5490: 20 4e 20 62 79 74 65 73 5c 6e 22 0a 22 20 20 2d   N bytes\n"."  -
54a0: 2d 6c 69 6d 69 74 2d 76 64 62 65 20 20 20 20 20  -limit-vdbe     
54b0: 20 20 20 20 20 50 61 6e 69 63 20 69 66 20 61 6e       Panic if an
54c0: 20 73 79 6e 63 20 53 51 4c 20 72 75 6e 73 20 66   sync SQL runs f
54d0: 6f 72 20 6d 6f 72 65 20 74 68 61 6e 20 31 30 30  or more than 100
54e0: 2c 30 30 30 20 63 79 63 6c 65 73 5c 6e 22 0a 22  ,000 cycles\n"."
54f0: 20 20 2d 2d 6c 6f 61 64 2d 73 71 6c 20 41 52 47    --load-sql ARG
5500: 53 2e 2e 2e 20 20 20 20 4c 6f 61 64 20 53 51 4c  S...    Load SQL
5510: 20 73 63 72 69 70 74 73 20 66 72 6f 20 66 69 6c   scripts fro fil
5520: 65 73 20 69 6e 74 6f 20 53 4f 55 52 43 45 2d 44  es into SOURCE-D
5530: 42 5c 6e 22 0a 22 20 20 2d 2d 6c 6f 61 64 2d 64  B\n"."  --load-d
5540: 62 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 4c 6f  b ARGS...     Lo
5550: 61 64 20 74 65 6d 70 6c 61 74 65 20 64 61 74 61  ad template data
5560: 62 61 73 65 73 20 66 72 6f 6d 20 66 69 6c 65 73  bases from files
5570: 20 69 6e 74 6f 20 53 4f 55 52 43 45 5f 44 42 5c   into SOURCE_DB\
5580: 6e 22 0a 22 20 20 2d 6d 20 54 45 58 54 20 20 20  n"."  -m TEXT   
5590: 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64 20              Add 
55a0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 74 6f  a description to
55b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 5c 6e 22   the database\n"
55c0: 0a 22 20 20 2d 2d 6e 61 74 69 76 65 2d 76 66 73  ."  --native-vfs
55d0: 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74 68            Use th
55e0: 65 20 6e 61 74 69 76 65 20 56 46 53 20 66 6f 72  e native VFS for
55f0: 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
5600: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 5c   database files\
5610: 6e 22 0a 22 20 20 2d 2d 72 65 62 75 69 6c 64 20  n"."  --rebuild 
5620: 20 20 20 20 20 20 20 20 20 20 20 20 52 65 62 75              Rebu
5630: 69 6c 64 20 61 6e 64 20 76 61 63 75 75 6d 20 74  ild and vacuum t
5640: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5650: 5c 6e 22 0a 22 20 20 2d 2d 72 65 73 75 6c 74 2d  \n"."  --result-
5660: 74 72 61 63 65 20 20 20 20 20 20 20 20 53 68 6f  trace        Sho
5670: 77 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  w the results of
5680: 20 65 61 63 68 20 53 51 4c 20 63 6f 6d 6d 61 6e   each SQL comman
5690: 64 5c 6e 22 0a 22 20 20 2d 2d 73 71 6c 69 64 20  d\n"."  --sqlid 
56a0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73  N             Us
56b0: 65 20 6f 6e 6c 79 20 53 51 4c 20 77 68 65 72 65  e only SQL where
56c0: 20 73 71 6c 69 64 3d 4e 5c 6e 22 0a 22 20 20 2d   sqlid=N\n"."  -
56d0: 2d 74 69 6d 65 6f 75 74 20 4e 20 20 20 20 20 20  -timeout N      
56e0: 20 20 20 20 20 41 62 6f 72 74 20 69 66 20 61 6e       Abort if an
56f0: 79 20 73 69 6e 67 6c 65 20 74 65 73 74 20 63 61  y single test ca
5700: 73 65 20 6e 65 65 64 73 20 6d 6f 72 65 20 74 68  se needs more th
5710: 61 6e 20 4e 20 73 65 63 6f 6e 64 73 5c 6e 22 0a  an N seconds\n".
5720: 22 20 20 2d 76 7c 2d 2d 76 65 72 62 6f 73 65 20  "  -v|--verbose 
5730: 20 20 20 20 20 20 20 20 20 49 6e 63 72 65 61 73           Increas
5740: 65 64 20 6f 75 74 70 75 74 2e 20 20 52 65 70 65  ed output.  Repe
5750: 61 74 20 66 6f 72 20 6d 6f 72 65 20 6f 75 74 70  at for more outp
5760: 75 74 2e 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 69  ut.\n".  );.}..i
5770: 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63  nt main(int argc
5780: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
5790: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
57a0: 69 42 65 67 69 6e 3b 20 20 20 20 20 20 20 20 2f  iBegin;        /
57b0: 2a 20 53 74 61 72 74 20 74 69 6d 65 20 6f 66 20  * Start time of 
57c0: 74 68 69 73 20 70 72 6f 67 72 61 6d 20 2a 2f 0a  this program */.
57d0: 20 20 69 6e 74 20 71 75 69 65 74 46 6c 61 67 20    int quietFlag 
57e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
57f0: 2a 20 54 72 75 65 20 69 66 20 2d 2d 71 75 69 65  * True if --quie
5800: 74 20 6f 72 20 2d 71 20 2a 2f 0a 20 20 69 6e 74  t or -q */.  int
5810: 20 76 65 72 62 6f 73 65 46 6c 61 67 20 3d 20 30   verboseFlag = 0
5820: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
5830: 65 20 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 6f  e if --verbose o
5840: 72 20 2d 76 20 2a 2f 0a 20 20 63 68 61 72 20 2a  r -v */.  char *
5850: 7a 49 6e 73 53 71 6c 20 3d 20 30 3b 20 20 20 20  zInsSql = 0;    
5860: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
5870: 61 74 65 6d 65 6e 74 20 66 6f 72 20 2d 2d 6c 6f  atement for --lo
5880: 61 64 2d 64 62 20 6f 72 20 2d 2d 6c 6f 61 64 2d  ad-db or --load-
5890: 73 71 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  sql */.  int iFi
58a0: 72 73 74 49 6e 73 41 72 67 20 3d 20 30 3b 20 20  rstInsArg = 0;  
58b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
58c0: 72 67 76 5b 5d 20 74 6f 20 75 73 65 20 66 6f 72  rgv[] to use for
58d0: 20 2d 2d 6c 6f 61 64 2d 64 62 20 6f 72 20 2d 2d   --load-db or --
58e0: 6c 6f 61 64 2d 73 71 6c 20 2a 2f 0a 20 20 73 71  load-sql */.  sq
58f0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 20 20  lite3 *db = 0;  
5900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5910: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
5920: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
5930: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
5940: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  tmt;         /* 
5950: 41 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  A prepared state
5960: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ment */.  int rc
5970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5980: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
5990: 20 63 6f 64 65 20 66 72 6f 6d 20 53 51 4c 69 74   code from SQLit
59a0: 65 20 69 6e 74 65 72 66 61 63 65 20 63 61 6c 6c  e interface call
59b0: 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 53 71  s */.  Blob *pSq
59c0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
59d0: 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
59e0: 6e 67 20 6f 76 65 72 20 53 51 4c 20 73 63 72 69  ng over SQL scri
59f0: 70 74 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70  pts */.  Blob *p
5a00: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
5a10: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
5a20: 70 69 6e 67 20 6f 76 65 72 20 74 65 6d 70 6c 61  ping over templa
5a30: 74 65 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  te databases */.
5a40: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a60: 2a 20 4c 6f 6f 70 20 69 6e 64 65 78 20 66 6f 72  * Loop index for
5a70: 20 74 68 65 20 61 72 67 76 5b 5d 20 6c 6f 6f 70   the argv[] loop
5a80: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c 79 53 71   */.  int onlySq
5a90: 6c 69 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  lid = -1;       
5aa0: 20 20 20 2f 2a 20 2d 2d 73 71 6c 69 64 20 2a 2f     /* --sqlid */
5ab0: 0a 20 20 69 6e 74 20 6f 6e 6c 79 44 62 69 64 20  .  int onlyDbid 
5ac0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
5ad0: 2f 2a 20 2d 2d 64 62 69 64 20 2a 2f 0a 20 20 69  /* --dbid */.  i
5ae0: 6e 74 20 6e 61 74 69 76 65 46 6c 61 67 20 3d 20  nt nativeFlag = 
5af0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d  0;          /* -
5b00: 2d 6e 61 74 69 76 65 2d 76 66 73 20 2a 2f 0a 20  -native-vfs */. 
5b10: 20 69 6e 74 20 72 65 62 75 69 6c 64 46 6c 61 67   int rebuildFlag
5b20: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5b30: 20 2d 2d 72 65 62 75 69 6c 64 20 2a 2f 0a 20 20   --rebuild */.  
5b40: 69 6e 74 20 76 64 62 65 4c 69 6d 69 74 46 6c 61  int vdbeLimitFla
5b50: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  g = 0;       /* 
5b60: 2d 2d 6c 69 6d 69 74 2d 76 64 62 65 20 2a 2f 0a  --limit-vdbe */.
5b70: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 54 65 73    int timeoutTes
5b80: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
5b90: 2a 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 2d  * undocumented -
5ba0: 2d 74 69 6d 65 6f 75 74 2d 74 65 73 74 20 66 6c  -timeout-test fl
5bb0: 61 67 20 2a 2f 0a 20 20 69 6e 74 20 72 75 6e 46  ag */.  int runF
5bc0: 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
5bd0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 73 65       /* Flags se
5be0: 6e 74 20 74 6f 20 72 75 6e 53 71 6c 28 29 20 2a  nt to runSql() *
5bf0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d  /.  char *zMsg =
5c00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5c10: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 65 73   /* Add this mes
5c20: 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  sage */.  int nS
5c30: 72 63 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  rcDb = 0;       
5c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5c50: 20 6f 66 20 73 6f 75 72 63 65 20 64 61 74 61 62   of source datab
5c60: 61 73 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ases */.  char *
5c70: 2a 61 7a 53 72 63 44 62 20 3d 20 30 3b 20 20 20  *azSrcDb = 0;   
5c80: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
5c90: 6f 66 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  of source databa
5ca0: 73 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  se names */.  in
5cb0: 74 20 69 53 72 63 44 62 3b 20 20 20 20 20 20 20  t iSrcDb;       
5cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
5cd0: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 6f 75 72  op over all sour
5ce0: 63 65 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  ce databases */.
5cf0: 20 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30 3b    int nTest = 0;
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5d10: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
5d20: 66 20 74 65 73 74 73 20 70 65 72 66 6f 72 6d 65  f tests performe
5d30: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  d */.  char *zDb
5d40: 4e 61 6d 65 20 3d 20 22 22 3b 20 20 20 20 20 20  Name = "";      
5d50: 20 20 20 20 2f 2a 20 41 70 70 72 65 76 69 61 74      /* Appreviat
5d60: 65 64 20 6e 61 6d 65 20 6f 66 20 61 20 73 6f 75  ed name of a sou
5d70: 72 63 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  rce database */.
5d80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
5d90: 61 69 6c 43 6f 64 65 20 3d 20 30 3b 20 20 20 2f  ailCode = 0;   /
5da0: 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65 20 54  * Value of the T
5db0: 45 53 54 5f 46 41 49 4c 55 52 45 20 65 6e 76 69  EST_FAILURE envi
5dc0: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
5dd0: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 53 7a   */.  int cellSz
5de0: 43 6b 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20  CkFlag = 0;     
5df0: 20 20 20 2f 2a 20 2d 2d 63 65 6c 6c 2d 73 69 7a     /* --cell-siz
5e00: 65 2d 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  e-check */.  int
5e10: 20 73 71 6c 46 75 7a 7a 20 3d 20 30 3b 20 20 20   sqlFuzz = 0;   
5e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
5e30: 65 20 66 6f 72 20 53 51 4c 20 66 75 7a 7a 20 74  e for SQL fuzz t
5e40: 65 73 74 69 6e 67 2e 20 46 61 6c 73 65 20 66 6f  esting. False fo
5e50: 72 20 44 42 20 66 75 7a 7a 20 2a 2f 0a 20 20 69  r DB fuzz */.  i
5e60: 6e 74 20 69 54 69 6d 65 6f 75 74 20 3d 20 31 32  nt iTimeout = 12
5e70: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  0;          /* D
5e80: 65 66 61 75 6c 74 20 31 32 30 2d 73 65 63 6f 6e  efault 120-secon
5e90: 64 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 69  d timeout */.  i
5ea0: 6e 74 20 6e 4d 65 6d 20 3d 20 30 3b 20 20 20 20  nt nMem = 0;    
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
5ec0: 65 6d 6f 72 79 20 6c 69 6d 69 74 20 2a 2f 0a 20  emory limit */. 
5ed0: 20 63 68 61 72 20 2a 7a 45 78 70 44 62 20 3d 20   char *zExpDb = 
5ee0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
5ef0: 20 57 72 69 74 65 20 44 61 74 61 62 61 73 65 73   Write Databases
5f00: 20 74 6f 20 66 69 6c 65 73 20 69 6e 20 74 68 69   to files in thi
5f10: 73 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  s directory */. 
5f20: 20 63 68 61 72 20 2a 7a 45 78 70 53 71 6c 20 3d   char *zExpSql =
5f30: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
5f40: 20 57 72 69 74 65 20 53 51 4c 20 74 6f 20 66 69   Write SQL to fi
5f50: 6c 65 73 20 69 6e 20 74 68 69 73 20 64 69 72 65  les in this dire
5f60: 63 74 6f 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ctory */.  void 
5f70: 2a 70 48 65 61 70 20 3d 20 30 3b 20 20 20 20 20  *pHeap = 0;     
5f80: 20 20 20 20 20 20 20 20 2f 2a 20 48 65 61 70 20          /* Heap 
5f90: 66 6f 72 20 75 73 65 20 62 79 20 53 51 4c 69 74  for use by SQLit
5fa0: 65 20 2a 2f 0a 0a 20 20 69 42 65 67 69 6e 20 3d  e */..  iBegin =
5fb0: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 23 69   timeOfDay();.#i
5fc0: 66 64 65 66 20 5f 5f 75 6e 69 78 5f 5f 0a 20 20  fdef __unix__.  
5fd0: 73 69 67 6e 61 6c 28 53 49 47 41 4c 52 4d 2c 20  signal(SIGALRM, 
5fe0: 74 69 6d 65 6f 75 74 48 61 6e 64 6c 65 72 29 3b  timeoutHandler);
5ff0: 0a 23 65 6e 64 69 66 0a 20 20 67 2e 7a 41 72 67  .#endif.  g.zArg
6000: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
6010: 7a 46 61 69 6c 43 6f 64 65 20 3d 20 67 65 74 65  zFailCode = gete
6020: 6e 76 28 22 54 45 53 54 5f 46 41 49 4c 55 52 45  nv("TEST_FAILURE
6030: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  ");.  for(i=1; i
6040: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
6050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
6060: 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66   argv[i];.    if
6070: 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
6080: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
6090: 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20  if( z[0]=='-' ) 
60a0: 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  z++;.      if( s
60b0: 74 72 63 6d 70 28 7a 2c 22 63 65 6c 6c 2d 73 69  trcmp(z,"cell-si
60c0: 7a 65 2d 63 68 65 63 6b 22 29 3d 3d 30 20 29 7b  ze-check")==0 ){
60d0: 0a 20 20 20 20 20 20 20 20 63 65 6c 6c 53 7a 43  .        cellSzC
60e0: 6b 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20  kFlag = 1;.     
60f0: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
6100: 20 73 74 72 63 6d 70 28 7a 2c 22 64 62 69 64 22   strcmp(z,"dbid"
6110: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6120: 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20 29 20  if( i>=argc-1 ) 
6130: 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73  fatalError("miss
6140: 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e  ing arguments on
6150: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
6160: 20 20 20 20 20 20 20 20 6f 6e 6c 79 44 62 69 64          onlyDbid
6170: 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
6180: 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20  argv[++i]);.    
6190: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
61a0: 28 20 73 74 72 63 6d 70 28 7a 2c 22 65 78 70 6f  ( strcmp(z,"expo
61b0: 72 74 2d 64 62 22 29 3d 3d 30 20 29 7b 0a 20 20  rt-db")==0 ){.  
61c0: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67        if( i>=arg
61d0: 63 2d 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72  c-1 ) fatalError
61e0: 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  ("missing argume
61f0: 6e 74 73 20 6f 6e 20 25 73 22 2c 20 61 72 67 76  nts on %s", argv
6200: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 45  [i]);.        zE
6210: 78 70 44 62 20 3d 20 61 72 67 76 5b 2b 2b 69 5d  xpDb = argv[++i]
6220: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
6230: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6240: 2c 22 65 78 70 6f 72 74 2d 73 71 6c 22 29 3d 3d  ,"export-sql")==
6250: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
6260: 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61 74   i>=argc-1 ) fat
6270: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  alError("missing
6280: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73   arguments on %s
6290: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
62a0: 20 20 20 20 20 7a 45 78 70 53 71 6c 20 3d 20 61       zExpSql = a
62b0: 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20  rgv[++i];.      
62c0: 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
62d0: 73 74 72 63 6d 70 28 7a 2c 22 68 65 6c 70 22 29  strcmp(z,"help")
62e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
62f0: 68 6f 77 48 65 6c 70 28 29 3b 0a 20 20 20 20 20  howHelp();.     
6300: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6310: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
6320: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6c 69 6d  f( strcmp(z,"lim
6330: 69 74 2d 6d 65 6d 22 29 3d 3d 30 20 29 7b 0a 23  it-mem")==0 ){.#
6340: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6350: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
6360: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  3) && !defined(S
6370: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6380: 53 59 53 35 29 0a 20 20 20 20 20 20 20 20 66 61  SYS5).        fa
6390: 74 61 6c 45 72 72 6f 72 28 22 74 68 65 20 25 73  talError("the %s
63a0: 20 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73   option requires
63b0: 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
63c0: 5f 4d 45 4d 53 59 53 35 20 6f 72 20 5f 4d 45 4d  _MEMSYS5 or _MEM
63d0: 53 59 53 33 22 2c 0a 20 20 20 20 20 20 20 20 20  SYS3",.         
63e0: 20 20 20 20 20 20 20 20 20 20 61 72 67 76 5b 69            argv[i
63f0: 5d 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ]);.#else.      
6400: 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31 20    if( i>=argc-1 
6410: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69  ) fatalError("mi
6420: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73 20  ssing arguments 
6430: 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29  on %s", argv[i])
6440: 3b 0a 20 20 20 20 20 20 20 20 6e 4d 65 6d 20 3d  ;.        nMem =
6450: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72   integerValue(ar
6460: 67 76 5b 2b 2b 69 5d 29 3b 0a 23 65 6e 64 69 66  gv[++i]);.#endif
6470: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
6480: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
6490: 22 6c 69 6d 69 74 2d 76 64 62 65 22 29 3d 3d 30  "limit-vdbe")==0
64a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 76 64 62 65   ){.        vdbe
64b0: 4c 69 6d 69 74 46 6c 61 67 20 3d 20 31 3b 0a 20  LimitFlag = 1;. 
64c0: 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
64d0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6c   if( strcmp(z,"l
64e0: 6f 61 64 2d 73 71 6c 22 29 3d 3d 30 20 29 7b 0a  oad-sql")==0 ){.
64f0: 20 20 20 20 20 20 20 20 7a 49 6e 73 53 71 6c 20          zInsSql 
6500: 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 78  = "INSERT INTO x
6510: 73 71 6c 28 73 71 6c 74 65 78 74 29 20 56 41 4c  sql(sqltext) VAL
6520: 55 45 53 28 43 41 53 54 28 72 65 61 64 66 69 6c  UES(CAST(readfil
6530: 65 28 3f 31 29 20 41 53 20 74 65 78 74 29 29 22  e(?1) AS text))"
6540: 3b 0a 20 20 20 20 20 20 20 20 69 46 69 72 73 74  ;.        iFirst
6550: 49 6e 73 41 72 67 20 3d 20 69 2b 31 3b 0a 20 20  InsArg = i+1;.  
6560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6570: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
6580: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6c 6f 61  f( strcmp(z,"loa
6590: 64 2d 64 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20  d-db")==0 ){.   
65a0: 20 20 20 20 20 7a 49 6e 73 53 71 6c 20 3d 20 22       zInsSql = "
65b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 64 62 28 64  INSERT INTO db(d
65c0: 62 63 6f 6e 74 65 6e 74 29 20 56 41 4c 55 45 53  bcontent) VALUES
65d0: 28 72 65 61 64 66 69 6c 65 28 3f 31 29 29 22 3b  (readfile(?1))";
65e0: 0a 20 20 20 20 20 20 20 20 69 46 69 72 73 74 49  .        iFirstI
65f0: 6e 73 41 72 67 20 3d 20 69 2b 31 3b 0a 20 20 20  nsArg = i+1;.   
6600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
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 6d 22 29 3d  ( strcmp(z,"m")=
6630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
6640: 28 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61  ( i>=argc-1 ) fa
6650: 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  talError("missin
6660: 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25  g arguments on %
6670: 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  s", argv[i]);.  
6680: 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 61 72 67        zMsg = arg
6690: 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 7d 65  v[++i];.      }e
66a0: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
66b0: 72 63 6d 70 28 7a 2c 22 6e 61 74 69 76 65 2d 76  rcmp(z,"native-v
66c0: 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
66d0: 20 20 20 6e 61 74 69 76 65 46 6c 61 67 20 3d 20     nativeFlag = 
66e0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  1;.      }else. 
66f0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6700: 7a 2c 22 71 75 69 65 74 22 29 3d 3d 30 20 7c 7c  z,"quiet")==0 ||
6710: 20 73 74 72 63 6d 70 28 7a 2c 22 71 22 29 3d 3d   strcmp(z,"q")==
6720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 71 75 69  0 ){.        qui
6730: 65 74 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  etFlag = 1;.    
6740: 20 20 20 20 76 65 72 62 6f 73 65 46 6c 61 67 20      verboseFlag 
6750: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
6760: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
6770: 70 28 7a 2c 22 72 65 62 75 69 6c 64 22 29 3d 3d  p(z,"rebuild")==
6780: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 62  0 ){.        reb
6790: 75 69 6c 64 46 6c 61 67 20 3d 20 31 3b 0a 20 20  uildFlag = 1;.  
67a0: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
67b0: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 72 65  if( strcmp(z,"re
67c0: 73 75 6c 74 2d 74 72 61 63 65 22 29 3d 3d 30 20  sult-trace")==0 
67d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 75 6e 46 6c  ){.        runFl
67e0: 61 67 73 20 7c 3d 20 53 51 4c 5f 4f 55 54 50 55  ags |= SQL_OUTPU
67f0: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  T;.      }else. 
6800: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6810: 7a 2c 22 73 71 6c 69 64 22 29 3d 3d 30 20 29 7b  z,"sqlid")==0 ){
6820: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d  .        if( i>=
6830: 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c 45 72  argc-1 ) fatalEr
6840: 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67  ror("missing arg
6850: 75 6d 65 6e 74 73 20 6f 6e 20 25 73 22 2c 20 61  uments on %s", a
6860: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[i]);.       
6870: 20 6f 6e 6c 79 53 71 6c 69 64 20 3d 20 69 6e 74   onlySqlid = int
6880: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b  egerValue(argv[+
6890: 2b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +i]);.      }els
68a0: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
68b0: 6d 70 28 7a 2c 22 74 69 6d 65 6f 75 74 22 29 3d  mp(z,"timeout")=
68c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
68d0: 28 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61  ( i>=argc-1 ) fa
68e0: 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  talError("missin
68f0: 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25  g arguments on %
6900: 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  s", argv[i]);.  
6910: 20 20 20 20 20 20 69 54 69 6d 65 6f 75 74 20 3d        iTimeout =
6920: 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 72   integerValue(ar
6930: 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20  gv[++i]);.      
6940: 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
6950: 73 74 72 63 6d 70 28 7a 2c 22 74 69 6d 65 6f 75  strcmp(z,"timeou
6960: 74 2d 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20  t-test")==0 ){. 
6970: 20 20 20 20 20 20 20 74 69 6d 65 6f 75 74 54 65         timeoutTe
6980: 73 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  st = 1;.#ifndef 
6990: 5f 5f 75 6e 69 78 5f 5f 0a 20 20 20 20 20 20 20  __unix__.       
69a0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74 69 6d   fatalError("tim
69b0: 65 6f 75 74 20 69 73 20 6e 6f 74 20 61 76 61 69  eout is not avai
69c0: 6c 61 62 6c 65 20 6f 6e 20 6e 6f 6e 2d 75 6e 69  lable on non-uni
69d0: 78 20 73 79 73 74 65 6d 73 22 29 3b 0a 23 65 6e  x systems");.#en
69e0: 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  dif.      }else.
69f0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
6a00: 28 7a 2c 22 76 65 72 62 6f 73 65 22 29 3d 3d 30  (z,"verbose")==0
6a10: 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 76 22   || strcmp(z,"v"
6a20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6a30: 71 75 69 65 74 46 6c 61 67 20 3d 20 30 3b 0a 20  quietFlag = 0;. 
6a40: 20 20 20 20 20 20 20 76 65 72 62 6f 73 65 46 6c         verboseFl
6a50: 61 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66  ag++;.        if
6a60: 28 20 76 65 72 62 6f 73 65 46 6c 61 67 3e 31 20  ( verboseFlag>1 
6a70: 29 20 72 75 6e 46 6c 61 67 73 20 7c 3d 20 53 51  ) runFlags |= SQ
6a80: 4c 5f 54 52 41 43 45 3b 0a 20 20 20 20 20 20 7d  L_TRACE;.      }
6a90: 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20 20  else.      {.   
6aa0: 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28       fatalError(
6ab0: 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
6ac0: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
6ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
6ae0: 65 7b 0a 20 20 20 20 20 20 6e 53 72 63 44 62 2b  e{.      nSrcDb+
6af0: 2b 3b 0a 20 20 20 20 20 20 61 7a 53 72 63 44 62  +;.      azSrcDb
6b00: 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28   = safe_realloc(
6b10: 61 7a 53 72 63 44 62 2c 20 6e 53 72 63 44 62 2a  azSrcDb, nSrcDb*
6b20: 73 69 7a 65 6f 66 28 61 7a 53 72 63 44 62 5b 30  sizeof(azSrcDb[0
6b30: 5d 29 29 3b 0a 20 20 20 20 20 20 61 7a 53 72 63  ]));.      azSrc
6b40: 44 62 5b 6e 53 72 63 44 62 2d 31 5d 20 3d 20 61  Db[nSrcDb-1] = a
6b50: 72 67 76 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  rgv[i];.    }.  
6b60: 7d 0a 20 20 69 66 28 20 6e 53 72 63 44 62 3d 3d  }.  if( nSrcDb==
6b70: 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  0 ) fatalError("
6b80: 6e 6f 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  no source databa
6b90: 73 65 20 73 70 65 63 69 66 69 65 64 22 29 3b 0a  se specified");.
6ba0: 20 20 69 66 28 20 6e 53 72 63 44 62 3e 31 20 29    if( nSrcDb>1 )
6bb0: 7b 0a 20 20 20 20 69 66 28 20 7a 4d 73 67 20 29  {.    if( zMsg )
6bc0: 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 45 72 72  {.      fatalErr
6bd0: 6f 72 28 22 63 61 6e 6e 6f 74 20 63 68 61 6e 67  or("cannot chang
6be0: 65 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f  e the descriptio
6bf0: 6e 20 6f 66 20 6d 6f 72 65 20 74 68 61 6e 20 6f  n of more than o
6c00: 6e 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  ne database");. 
6c10: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 49 6e     }.    if( zIn
6c20: 73 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 66 61  sSql ){.      fa
6c30: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
6c40: 20 69 6d 70 6f 72 74 20 69 6e 74 6f 20 6d 6f 72   import into mor
6c50: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
6c60: 61 73 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ase");.    }.  }
6c70: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 65  ..  /* Process e
6c80: 61 63 68 20 73 6f 75 72 63 65 20 64 61 74 61 62  ach source datab
6c90: 61 73 65 20 73 65 70 61 72 61 74 65 6c 79 20 2a  ase separately *
6ca0: 2f 0a 20 20 66 6f 72 28 69 53 72 63 44 62 3d 30  /.  for(iSrcDb=0
6cb0: 3b 20 69 53 72 63 44 62 3c 6e 53 72 63 44 62 3b  ; iSrcDb<nSrcDb;
6cc0: 20 69 53 72 63 44 62 2b 2b 29 7b 0a 20 20 20 20   iSrcDb++){.    
6cd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
6ce0: 6e 28 61 7a 53 72 63 44 62 5b 69 53 72 63 44 62  n(azSrcDb[iSrcDb
6cf0: 5d 2c 20 26 64 62 29 3b 0a 20 20 20 20 69 66 28  ], &db);.    if(
6d00: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 61 74   rc ){.      fat
6d10: 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20  alError("cannot 
6d20: 6f 70 65 6e 20 73 6f 75 72 63 65 20 64 61 74 61  open source data
6d30: 62 61 73 65 20 25 73 20 2d 20 25 73 22 2c 0a 20  base %s - %s",. 
6d40: 20 20 20 20 20 61 7a 53 72 63 44 62 5b 69 53 72       azSrcDb[iSr
6d50: 63 44 62 5d 2c 20 73 71 6c 69 74 65 33 5f 65 72  cDb], sqlite3_er
6d60: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d  rmsg(db));.    }
6d70: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6d80: 33 5f 65 78 65 63 28 64 62 2c 0a 20 20 20 20 20  3_exec(db,.     
6d90: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
6da0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 64 62  IF NOT EXISTS db
6db0: 28 5c 6e 22 0a 20 20 20 20 20 20 20 22 20 20 64  (\n".       "  d
6dc0: 62 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  bid INTEGER PRIM
6dd0: 41 52 59 20 4b 45 59 2c 20 2d 2d 20 64 61 74 61  ARY KEY, -- data
6de0: 62 61 73 65 20 69 64 5c 6e 22 0a 20 20 20 20 20  base id\n".     
6df0: 20 20 22 20 20 64 62 63 6f 6e 74 65 6e 74 20 42    "  dbcontent B
6e00: 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20 2d  LOB            -
6e10: 2d 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  - database disk 
6e20: 66 69 6c 65 20 69 6d 61 67 65 5c 6e 22 0a 20 20  file image\n".  
6e30: 20 20 20 20 20 22 29 3b 5c 6e 22 0a 20 20 20 20       ");\n".    
6e40: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
6e50: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 78   IF NOT EXISTS x
6e60: 73 71 6c 28 5c 6e 22 0a 20 20 20 20 20 20 20 22  sql(\n".       "
6e70: 20 20 73 71 6c 69 64 20 49 4e 54 45 47 45 52 20    sqlid INTEGER 
6e80: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 20 2d  PRIMARY KEY,   -
6e90: 2d 20 53 51 4c 20 73 63 72 69 70 74 20 69 64 5c  - SQL script id\
6ea0: 6e 22 0a 20 20 20 20 20 20 20 22 20 20 73 71 6c  n".       "  sql
6eb0: 74 65 78 74 20 54 45 58 54 20 20 20 20 20 20 20  text TEXT       
6ec0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 54 65 78            -- Tex
6ed0: 74 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65  t of SQL stateme
6ee0: 6e 74 73 20 74 6f 20 72 75 6e 5c 6e 22 0a 20 20  nts to run\n".  
6ef0: 20 20 20 20 20 22 29 3b 22 0a 20 20 20 20 20 20       ");".      
6f00: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
6f10: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 72 65 61  F NOT EXISTS rea
6f20: 64 6d 65 28 5c 6e 22 0a 20 20 20 20 20 20 20 22  dme(\n".       "
6f30: 20 20 6d 73 67 20 54 45 58 54 20 2d 2d 20 48 75    msg TEXT -- Hu
6f40: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73  man-readable des
6f50: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 69 73  cription of this
6f60: 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 20   file\n".       
6f70: 22 29 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ");", 0, 0, 0);.
6f80: 20 20 20 20 69 66 28 20 72 63 20 29 20 66 61 74      if( rc ) fat
6f90: 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20  alError("cannot 
6fa0: 63 72 65 61 74 65 20 73 63 68 65 6d 61 3a 20 25  create schema: %
6fb0: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
6fc0: 73 67 28 64 62 29 29 3b 0a 20 20 20 20 69 66 28  sg(db));.    if(
6fd0: 20 7a 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 63   zMsg ){.      c
6fe0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20  har *zSql;.     
6ff0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
7000: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
7010: 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20          "DELETE 
7020: 46 52 4f 4d 20 72 65 61 64 6d 65 3b 20 49 4e 53  FROM readme; INS
7030: 45 52 54 20 49 4e 54 4f 20 72 65 61 64 6d 65 28  ERT INTO readme(
7040: 6d 73 67 29 20 56 41 4c 55 45 53 28 25 51 29 22  msg) VALUES(%Q)"
7050: 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  , zMsg);.      r
7060: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
7070: 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  (db, zSql, 0, 0,
7080: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
7090: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
70a0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 66 61       if( rc ) fa
70b0: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
70c0: 20 63 68 61 6e 67 65 20 64 65 73 63 72 69 70 74   change descript
70d0: 69 6f 6e 3a 20 25 73 22 2c 20 73 71 6c 69 74 65  ion: %s", sqlite
70e0: 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
70f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 49 6e     }.    if( zIn
7100: 73 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  sSql ){.      sq
7110: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7120: 63 74 69 6f 6e 28 64 62 2c 20 22 72 65 61 64 66  ction(db, "readf
7130: 69 6c 65 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ile", 1, SQLITE_
7140: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7160: 20 20 20 20 20 20 20 72 65 61 64 66 69 6c 65 46         readfileF
7170: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
7180: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
7190: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 49  repare_v2(db, zI
71a0: 6e 73 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d  nsSql, -1, &pStm
71b0: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
71c0: 20 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72   rc ) fatalError
71d0: 28 22 63 61 6e 6e 6f 74 20 70 72 65 70 61 72 65  ("cannot prepare
71e0: 20 73 74 61 74 65 6d 65 6e 74 20 5b 25 73 5d 3a   statement [%s]:
71f0: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 7a 49 6e 73 53 71 6c 2c 20 73 71 6c 69 74 65 33  zInsSql, sqlite3
7220: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
7230: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7240: 5f 65 78 65 63 28 64 62 2c 20 22 42 45 47 49 4e  _exec(db, "BEGIN
7250: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
7260: 20 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61     if( rc ) fata
7270: 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 73  lError("cannot s
7280: 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
7290: 6f 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  on");.      for(
72a0: 69 3d 69 46 69 72 73 74 49 6e 73 41 72 67 3b 20  i=iFirstInsArg; 
72b0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
72c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
72d0: 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
72e0: 2c 20 61 72 67 76 5b 69 5d 2c 20 2d 31 2c 20 53  , argv[i], -1, S
72f0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7300: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7310: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
7320: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7330: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
7340: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
7350: 66 61 74 61 6c 45 72 72 6f 72 28 22 69 6e 73 65  fatalError("inse
7360: 72 74 20 66 61 69 6c 65 64 20 66 6f 72 20 25 73  rt failed for %s
7370: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
7380: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7390: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
73a0: 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
73b0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
73c0: 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
73d0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
73e0: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63   ) fatalError("c
73f0: 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20 74 68 65  annot commit the
7400: 20 74 72 61 6e 73 61 63 74 69 6f 6e 3a 20 25 73   transaction: %s
7410: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
7420: 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 72 65  g(db));.      re
7430: 62 75 69 6c 64 5f 64 61 74 61 62 61 73 65 28 64  build_database(d
7440: 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
7450: 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
7460: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
7470: 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 78 70 44   }.    if( zExpD
7480: 62 21 3d 30 20 7c 7c 20 7a 45 78 70 53 71 6c 21  b!=0 || zExpSql!
7490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
74a0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
74b0: 69 6f 6e 28 64 62 2c 20 22 77 72 69 74 65 66 69  ion(db, "writefi
74c0: 6c 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  le", 2, SQLITE_U
74d0: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 20 20 20 20 20 20 77 72 69 74 65 66 69 6c 65 46        writefileF
7500: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  unc, 0, 0);.    
7510: 20 20 69 66 28 20 7a 45 78 70 44 62 21 3d 30 20    if( zExpDb!=0 
7520: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
7530: 20 63 68 61 72 20 2a 7a 45 78 44 62 20 3d 20 0a   char *zExDb = .
7540: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
7550: 54 20 77 72 69 74 65 66 69 6c 65 28 70 72 69 6e  T writefile(prin
7560: 74 66 28 27 25 73 2f 64 62 25 30 36 64 2e 64 62  tf('%s/db%06d.db
7570: 27 2c 3f 31 2c 64 62 69 64 29 2c 64 62 63 6f 6e  ',?1,dbid),dbcon
7580: 74 65 6e 74 29 2c 22 0a 20 20 20 20 20 20 20 20  tent),".        
7590: 20 20 22 20 20 20 20 20 20 20 64 62 69 64 2c 20    "       dbid, 
75a0: 70 72 69 6e 74 66 28 27 25 73 2f 64 62 25 30 36  printf('%s/db%06
75b0: 64 2e 64 62 27 2c 3f 31 2c 64 62 69 64 29 2c 20  d.db',?1,dbid), 
75c0: 6c 65 6e 67 74 68 28 64 62 63 6f 6e 74 65 6e 74  length(dbcontent
75d0: 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  )".          "  
75e0: 46 52 4f 4d 20 64 62 20 57 48 45 52 45 20 3f 32  FROM db WHERE ?2
75f0: 3c 30 20 4f 52 20 64 62 69 64 3d 3f 32 3b 22 3b  <0 OR dbid=?2;";
7600: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7610: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
7620: 28 64 62 2c 20 7a 45 78 44 62 2c 20 2d 31 2c 20  (db, zExDb, -1, 
7630: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
7640: 20 20 20 20 69 66 28 20 72 63 20 29 20 66 61 74      if( rc ) fat
7650: 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20  alError("cannot 
7660: 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e  prepare statemen
7670: 74 20 5b 25 73 5d 3a 20 25 73 22 2c 0a 20 20 20  t [%s]: %s",.   
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 20 20 20 20 20 20 20 20 20 7a 45 78 44 62 2c 20           zExDb, 
76a0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
76b0: 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b));.        sql
76c0: 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 36 34  ite3_bind_text64
76d0: 28 70 53 74 6d 74 2c 20 31 2c 20 7a 45 78 70 44  (pStmt, 1, zExpD
76e0: 62 2c 20 73 74 72 6c 65 6e 28 7a 45 78 70 44 62  b, strlen(zExpDb
76f0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
7710: 51 4c 49 54 45 5f 53 54 41 54 49 43 2c 20 53 51  QLITE_STATIC, SQ
7720: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
7730: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
7740: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 2c 20 6f  _int(pStmt, 2, o
7750: 6e 6c 79 44 62 69 64 29 3b 0a 20 20 20 20 20 20  nlyDbid);.      
7760: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
7770: 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
7780: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
7790: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 77 72        printf("wr
77a0: 69 74 65 20 64 62 2d 25 64 20 28 25 64 20 62 79  ite db-%d (%d by
77b0: 74 65 73 29 20 69 6e 74 6f 20 25 73 5c 6e 22 2c  tes) into %s\n",
77c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
77d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
77e0: 28 70 53 74 6d 74 2c 31 29 2c 0a 20 20 20 20 20  (pStmt,1),.     
77f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7800: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
7810: 2c 33 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,3),.           
7820: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
7830: 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 29 3b  _text(pStmt,2));
7840: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7850: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
7860: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
7870: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
7880: 78 70 53 71 6c 21 3d 30 20 29 7b 0a 20 20 20 20  xpSql!=0 ){.    
7890: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
78a0: 7a 45 78 53 71 6c 20 3d 20 0a 20 20 20 20 20 20  zExSql = .      
78b0: 20 20 20 20 22 53 45 4c 45 43 54 20 77 72 69 74      "SELECT writ
78c0: 65 66 69 6c 65 28 70 72 69 6e 74 66 28 27 25 73  efile(printf('%s
78d0: 2f 73 71 6c 25 30 36 64 2e 74 78 74 27 2c 3f 31  /sql%06d.txt',?1
78e0: 2c 73 71 6c 69 64 29 2c 73 71 6c 74 65 78 74 29  ,sqlid),sqltext)
78f0: 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  ,".          "  
7900: 20 20 20 20 20 73 71 6c 69 64 2c 20 70 72 69 6e       sqlid, prin
7910: 74 66 28 27 25 73 2f 73 71 6c 25 30 36 64 2e 74  tf('%s/sql%06d.t
7920: 78 74 27 2c 3f 31 2c 73 71 6c 69 64 29 2c 20 6c  xt',?1,sqlid), l
7930: 65 6e 67 74 68 28 73 71 6c 74 65 78 74 29 22 0a  ength(sqltext)".
7940: 20 20 20 20 20 20 20 20 20 20 22 20 20 46 52 4f            "  FRO
7950: 4d 20 78 73 71 6c 20 57 48 45 52 45 20 3f 32 3c  M xsql WHERE ?2<
7960: 30 20 4f 52 20 73 71 6c 69 64 3d 3f 32 3b 22 3b  0 OR sqlid=?2;";
7970: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7980: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
7990: 28 64 62 2c 20 7a 45 78 53 71 6c 2c 20 2d 31 2c  (db, zExSql, -1,
79a0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
79b0: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 66 61       if( rc ) fa
79c0: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74  talError("cannot
79d0: 20 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65   prepare stateme
79e0: 6e 74 20 5b 25 73 5d 3a 20 25 73 22 2c 0a 20 20  nt [%s]: %s",.  
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a00: 20 20 20 20 20 20 20 20 20 20 7a 45 78 53 71 6c            zExSql
7a10: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
7a20: 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73  (db));.        s
7a30: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
7a40: 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 7a 45 78  64(pStmt, 1, zEx
7a50: 70 53 71 6c 2c 20 73 74 72 6c 65 6e 28 7a 45 78  pSql, strlen(zEx
7a60: 70 53 71 6c 29 2c 0a 20 20 20 20 20 20 20 20 20  pSql),.         
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a80: 20 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43     SQLITE_STATIC
7a90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
7aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7ab0: 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20  bind_int(pStmt, 
7ac0: 32 2c 20 6f 6e 6c 79 53 71 6c 69 64 29 3b 0a 20  2, onlySqlid);. 
7ad0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71         while( sq
7ae0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
7af0: 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
7b00: 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
7b10: 66 28 22 77 72 69 74 65 20 73 71 6c 2d 25 64 20  f("write sql-%d 
7b20: 28 25 64 20 62 79 74 65 73 29 20 69 6e 74 6f 20  (%d bytes) into 
7b30: 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
7b40: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75      sqlite3_colu
7b50: 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 2c  mn_int(pStmt,1),
7b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  .             sq
7b70: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
7b80: 28 70 53 74 6d 74 2c 33 29 2c 0a 20 20 20 20 20  (pStmt,3),.     
7b90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7ba0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
7bb0: 74 2c 32 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  t,2));.        }
7bc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7bd0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
7be0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7bf0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
7c00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7c10: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
7c20: 2f 2a 20 4c 6f 61 64 20 61 6c 6c 20 53 51 4c 20  /* Load all SQL 
7c30: 73 63 72 69 70 74 20 63 6f 6e 74 65 6e 74 20 61  script content a
7c40: 6e 64 20 61 6c 6c 20 69 6e 69 74 69 61 6c 20 64  nd all initial d
7c50: 61 74 61 62 61 73 65 20 69 6d 61 67 65 73 20 66  atabase images f
7c60: 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  rom the.    ** s
7c70: 6f 75 72 63 65 20 64 62 0a 20 20 20 20 2a 2f 0a  ource db.    */.
7c80: 20 20 20 20 62 6c 6f 62 4c 69 73 74 4c 6f 61 64      blobListLoad
7c90: 46 72 6f 6d 44 62 28 64 62 2c 20 22 53 45 4c 45  FromDb(db, "SELE
7ca0: 43 54 20 73 71 6c 69 64 2c 20 73 71 6c 74 65 78  CT sqlid, sqltex
7cb0: 74 20 46 52 4f 4d 20 78 73 71 6c 22 2c 20 6f 6e  t FROM xsql", on
7cc0: 6c 79 53 71 6c 69 64 2c 0a 20 20 20 20 20 20 20  lySqlid,.       
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 20 20 20 26 67 2e 6e 53 71 6c 2c 20 26 67 2e      &g.nSql, &g.
7cf0: 70 46 69 72 73 74 53 71 6c 29 3b 0a 20 20 20 20  pFirstSql);.    
7d00: 69 66 28 20 67 2e 6e 53 71 6c 3d 3d 30 20 29 20  if( g.nSql==0 ) 
7d10: 66 61 74 61 6c 45 72 72 6f 72 28 22 6e 65 65 64  fatalError("need
7d20: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 53 51   at least one SQ
7d30: 4c 20 73 63 72 69 70 74 22 29 3b 0a 20 20 20 20  L script");.    
7d40: 62 6c 6f 62 4c 69 73 74 4c 6f 61 64 46 72 6f 6d  blobListLoadFrom
7d50: 44 62 28 64 62 2c 20 22 53 45 4c 45 43 54 20 64  Db(db, "SELECT d
7d60: 62 69 64 2c 20 64 62 63 6f 6e 74 65 6e 74 20 46  bid, dbcontent F
7d70: 52 4f 4d 20 64 62 22 2c 20 6f 6e 6c 79 44 62 69  ROM db", onlyDbi
7d80: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
7d90: 20 20 20 20 20 20 20 20 20 20 26 67 2e 6e 44 62            &g.nDb
7da0: 2c 20 26 67 2e 70 46 69 72 73 74 44 62 29 3b 0a  , &g.pFirstDb);.
7db0: 20 20 20 20 69 66 28 20 67 2e 6e 44 62 3d 3d 30      if( g.nDb==0
7dc0: 20 29 7b 0a 20 20 20 20 20 20 67 2e 70 46 69 72   ){.      g.pFir
7dd0: 73 74 44 62 20 3d 20 73 61 66 65 5f 72 65 61 6c  stDb = safe_real
7de0: 6c 6f 63 28 30 2c 20 73 69 7a 65 6f 66 28 42 6c  loc(0, sizeof(Bl
7df0: 6f 62 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ob));.      mems
7e00: 65 74 28 67 2e 70 46 69 72 73 74 44 62 2c 20 30  et(g.pFirstDb, 0
7e10: 2c 20 73 69 7a 65 6f 66 28 42 6c 6f 62 29 29 3b  , sizeof(Blob));
7e20: 0a 20 20 20 20 20 20 67 2e 70 46 69 72 73 74 44  .      g.pFirstD
7e30: 62 2d 3e 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  b->id = 1;.     
7e40: 20 67 2e 70 46 69 72 73 74 44 62 2d 3e 73 65 71   g.pFirstDb->seq
7e50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 2e 6e 44   = 0;.      g.nD
7e60: 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  b = 1;.      sql
7e70: 46 75 7a 7a 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Fuzz = 1;.    }.
7e80: 20 20 0a 20 20 20 20 2f 2a 20 50 72 69 6e 74 20    .    /* Print 
7e90: 74 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e 2c  the description,
7ea0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
7eb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69   */.    if( !qui
7ec0: 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  etFlag ){.      
7ed0: 7a 44 62 4e 61 6d 65 20 3d 20 61 7a 53 72 63 44  zDbName = azSrcD
7ee0: 62 5b 69 53 72 63 44 62 5d 3b 0a 20 20 20 20 20  b[iSrcDb];.     
7ef0: 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   i = (int)strlen
7f00: 28 7a 44 62 4e 61 6d 65 29 20 2d 20 31 3b 0a 20  (zDbName) - 1;. 
7f10: 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20       while( i>0 
7f20: 26 26 20 7a 44 62 4e 61 6d 65 5b 69 2d 31 5d 21  && zDbName[i-1]!
7f30: 3d 27 2f 27 20 26 26 20 7a 44 62 4e 61 6d 65 5b  ='/' && zDbName[
7f40: 69 2d 31 5d 21 3d 27 5c 5c 27 20 29 7b 20 69 2d  i-1]!='\\' ){ i-
7f50: 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 44 62 4e 61  -; }.      zDbNa
7f60: 6d 65 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 73  me += i;.      s
7f70: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
7f80: 32 28 64 62 2c 20 22 53 45 4c 45 43 54 20 6d 73  2(db, "SELECT ms
7f90: 67 20 46 52 4f 4d 20 72 65 61 64 6d 65 22 2c 20  g FROM readme", 
7fa0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
7fb0: 20 20 20 20 20 20 69 66 28 20 70 53 74 6d 74 20        if( pStmt 
7fc0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  && sqlite3_step(
7fd0: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
7fe0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  OW ){.        pr
7ff0: 69 6e 74 66 28 22 25 73 3a 20 25 73 5c 6e 22 2c  intf("%s: %s\n",
8000: 20 7a 44 62 4e 61 6d 65 2c 20 73 71 6c 69 74 65   zDbName, sqlite
8010: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
8020: 74 6d 74 2c 30 29 29 3b 0a 20 20 20 20 20 20 7d  tmt,0));.      }
8030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8040: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
8050: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
8060: 62 75 69 6c 64 20 74 68 65 20 64 61 74 61 62 61  build the databa
8070: 73 65 2c 20 69 66 20 72 65 71 75 65 73 74 65 64  se, if requested
8080: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 65 62 75   */.    if( rebu
8090: 69 6c 64 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  ildFlag ){.     
80a0: 20 69 66 28 20 21 71 75 69 65 74 46 6c 61 67 20   if( !quietFlag 
80b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
80c0: 66 28 22 25 73 3a 20 72 65 62 75 69 6c 64 69 6e  f("%s: rebuildin
80d0: 67 2e 2e 2e 20 22 2c 20 7a 44 62 4e 61 6d 65 29  g... ", zDbName)
80e0: 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68  ;.        fflush
80f0: 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
8100: 7d 0a 20 20 20 20 20 20 72 65 62 75 69 6c 64 5f  }.      rebuild_
8110: 64 61 74 61 62 61 73 65 28 64 62 29 3b 0a 20 20  database(db);.  
8120: 20 20 20 20 69 66 28 20 21 71 75 69 65 74 46 6c      if( !quietFl
8130: 61 67 20 29 20 70 72 69 6e 74 66 28 22 64 6f 6e  ag ) printf("don
8140: 65 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  e\n");.    }.  .
8150: 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65      /* Close the
8160: 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
8170: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 6e  .  Verify that n
8180: 6f 20 53 51 4c 69 74 65 20 6d 65 6d 6f 72 79 20  o SQLite memory 
8190: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 0a  allocations are.
81a0: 20 20 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69      ** outstandi
81b0: 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ng..    */.    s
81c0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
81d0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
81e0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3e  3_memory_used()>
81f0: 30 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c  0 ){.      fatal
8200: 45 72 72 6f 72 28 22 53 51 4c 69 74 65 20 68 61  Error("SQLite ha
8210: 73 20 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  s memory in use 
8220: 62 65 66 6f 72 65 20 74 68 65 20 73 74 61 72 74  before the start
8230: 20 6f 66 20 74 65 73 74 69 6e 67 22 29 3b 0a 20   of testing");. 
8240: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6d     }..    /* Lim
8250: 69 74 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d  it available mem
8260: 6f 72 79 2c 20 69 66 20 72 65 71 75 65 73 74 65  ory, if requeste
8270: 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 65  d */.    if( nMe
8280: 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  m>0 ){.      sql
8290: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29 3b  ite3_shutdown();
82a0: 0a 20 20 20 20 20 20 70 48 65 61 70 20 3d 20 6d  .      pHeap = m
82b0: 61 6c 6c 6f 63 28 6e 4d 65 6d 29 3b 0a 20 20 20  alloc(nMem);.   
82c0: 20 20 20 69 66 28 20 70 48 65 61 70 3d 3d 30 20     if( pHeap==0 
82d0: 29 7b 0a 20 20 20 20 20 20 20 20 66 61 74 61 6c  ){.        fatal
82e0: 45 72 72 6f 72 28 22 66 61 69 6c 65 64 20 74 6f  Error("failed to
82f0: 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79 74   allocate %d byt
8300: 65 73 20 6f 66 20 68 65 61 70 20 6d 65 6d 6f 72  es of heap memor
8310: 79 22 2c 20 6e 4d 65 6d 29 3b 0a 20 20 20 20 20  y", nMem);.     
8320: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
8330: 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
8340: 4f 4e 46 49 47 5f 48 45 41 50 2c 20 70 48 65 61  ONFIG_HEAP, pHea
8350: 70 2c 20 6e 4d 65 6d 2c 20 31 32 38 29 3b 0a 20  p, nMem, 128);. 
8360: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
8370: 65 67 69 73 74 65 72 20 74 68 65 20 69 6e 2d 6d  egister the in-m
8380: 65 6d 6f 72 79 20 76 69 72 74 75 61 6c 20 66 69  emory virtual fi
8390: 6c 65 73 79 73 74 65 6d 0a 20 20 20 20 2a 2f 0a  lesystem.    */.
83a0: 20 20 20 20 66 6f 72 6d 61 74 56 66 73 28 29 3b      formatVfs();
83b0: 0a 20 20 20 20 69 6e 6d 65 6d 56 66 73 52 65 67  .    inmemVfsReg
83c0: 69 73 74 65 72 28 29 3b 0a 20 20 20 20 0a 20 20  ister();.    .  
83d0: 20 20 2f 2a 20 52 75 6e 20 61 20 74 65 73 74 20    /* Run a test 
83e0: 75 73 69 6e 67 20 65 61 63 68 20 53 51 4c 20 73  using each SQL s
83f0: 63 72 69 70 74 20 61 67 61 69 6e 73 74 20 65 61  cript against ea
8400: 63 68 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ch database..   
8410: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 76 65 72   */.    if( !ver
8420: 62 6f 73 65 46 6c 61 67 20 26 26 20 21 71 75 69  boseFlag && !qui
8430: 65 74 46 6c 61 67 20 29 20 70 72 69 6e 74 66 28  etFlag ) printf(
8440: 22 25 73 3a 22 2c 20 7a 44 62 4e 61 6d 65 29 3b  "%s:", zDbName);
8450: 0a 20 20 20 20 66 6f 72 28 70 53 71 6c 3d 67 2e  .    for(pSql=g.
8460: 70 46 69 72 73 74 53 71 6c 3b 20 70 53 71 6c 3b  pFirstSql; pSql;
8470: 20 70 53 71 6c 3d 70 53 71 6c 2d 3e 70 4e 65 78   pSql=pSql->pNex
8480: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 44  t){.      for(pD
8490: 62 3d 67 2e 70 46 69 72 73 74 44 62 3b 20 70 44  b=g.pFirstDb; pD
84a0: 62 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4e 65 78  b; pDb=pDb->pNex
84b0: 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
84c0: 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 20 20 20  openFlags;.     
84d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
84e0: 56 66 73 20 3d 20 22 69 6e 6d 65 6d 22 3b 0a 20  Vfs = "inmem";. 
84f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8500: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 67  nprintf(sizeof(g
8510: 2e 7a 54 65 73 74 4e 61 6d 65 29 2c 20 67 2e 7a  .zTestName), g.z
8520: 54 65 73 74 4e 61 6d 65 2c 20 22 73 71 6c 69 64  TestName, "sqlid
8530: 3d 25 64 2c 64 62 69 64 3d 25 64 22 2c 0a 20 20  =%d,dbid=%d",.  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 20 20 20 70 53 71 6c 2d 3e 69 64 2c         pSql->id,
8560: 20 70 44 62 2d 3e 69 64 29 3b 0a 20 20 20 20 20   pDb->id);.     
8570: 20 20 20 69 66 28 20 76 65 72 62 6f 73 65 46 6c     if( verboseFl
8580: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
8590: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 67  printf("%s\n", g
85a0: 2e 7a 54 65 73 74 4e 61 6d 65 29 3b 0a 20 20 20  .zTestName);.   
85b0: 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74         fflush(st
85c0: 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  dout);.        }
85d0: 65 6c 73 65 20 69 66 28 20 21 71 75 69 65 74 46  else if( !quietF
85e0: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
85f0: 20 73 74 61 74 69 63 20 69 6e 74 20 70 72 65 76   static int prev
8600: 41 6d 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Amt = -1;.      
8610: 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 53      int idx = pS
8620: 71 6c 2d 3e 73 65 71 2a 67 2e 6e 44 62 20 2b 20  ql->seq*g.nDb + 
8630: 70 44 62 2d 3e 69 64 20 2d 20 31 3b 0a 20 20 20  pDb->id - 1;.   
8640: 20 20 20 20 20 20 20 69 6e 74 20 61 6d 74 20 3d         int amt =
8650: 20 69 64 78 2a 31 30 2f 28 67 2e 6e 44 62 2a 67   idx*10/(g.nDb*g
8660: 2e 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  .nSql);.        
8670: 20 20 69 66 28 20 61 6d 74 21 3d 70 72 65 76 41    if( amt!=prevA
8680: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
8690: 20 20 70 72 69 6e 74 66 28 22 20 25 64 25 25 22    printf(" %d%%"
86a0: 2c 20 61 6d 74 2a 31 30 29 3b 0a 20 20 20 20 20  , amt*10);.     
86b0: 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74         fflush(st
86c0: 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20  dout);.         
86d0: 20 20 20 70 72 65 76 41 6d 74 20 3d 20 61 6d 74     prevAmt = amt
86e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
86f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8700: 63 72 65 61 74 65 56 46 69 6c 65 28 22 6d 61 69  createVFile("mai
8710: 6e 2e 64 62 22 2c 20 70 44 62 2d 3e 73 7a 2c 20  n.db", pDb->sz, 
8720: 70 44 62 2d 3e 61 29 3b 0a 20 20 20 20 20 20 20  pDb->a);.       
8730: 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 53 51 4c   openFlags = SQL
8740: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
8750: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
8760: 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 20  ADWRITE;.       
8770: 20 69 66 28 20 6e 61 74 69 76 65 46 6c 61 67 20   if( nativeFlag 
8780: 26 26 20 70 44 62 2d 3e 73 7a 3d 3d 30 20 29 7b  && pDb->sz==0 ){
8790: 0a 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 46  .          openF
87a0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
87b0: 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
87c0: 20 20 20 20 20 20 7a 56 66 73 20 3d 20 30 3b 0a        zVfs = 0;.
87d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
87e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
87f0: 70 65 6e 5f 76 32 28 22 6d 61 69 6e 2e 64 62 22  pen_v2("main.db"
8800: 2c 20 26 64 62 2c 20 6f 70 65 6e 46 6c 61 67 73  , &db, openFlags
8810: 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 20 20 20  , zVfs);.       
8820: 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 45   if( rc ) fatalE
8830: 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65  rror("cannot ope
8840: 6e 20 69 6e 6d 65 6d 20 64 61 74 61 62 61 73 65  n inmem database
8850: 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
8860: 63 65 6c 6c 53 7a 43 6b 46 6c 61 67 20 29 20 72  cellSzCkFlag ) r
8870: 75 6e 53 71 6c 28 64 62 2c 20 22 50 52 41 47 4d  unSql(db, "PRAGM
8880: 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63  A cell_size_chec
8890: 6b 3d 4f 4e 22 2c 20 72 75 6e 46 6c 61 67 73 29  k=ON", runFlags)
88a0: 3b 0a 20 20 20 20 20 20 20 20 73 65 74 41 6c 61  ;.        setAla
88b0: 72 6d 28 69 54 69 6d 65 6f 75 74 29 3b 0a 23 69  rm(iTimeout);.#i
88c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
88d0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
88e0: 41 43 4b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ACK.        if( 
88f0: 73 71 6c 46 75 7a 7a 20 7c 7c 20 76 64 62 65 4c  sqlFuzz || vdbeL
8900: 69 6d 69 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  imitFlag ){.    
8910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72        sqlite3_pr
8920: 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 64  ogress_handler(d
8930: 62 2c 20 31 30 30 30 30 30 2c 20 70 72 6f 67 72  b, 100000, progr
8940: 65 73 73 48 61 6e 64 6c 65 72 2c 20 26 76 64 62  essHandler, &vdb
8950: 65 4c 69 6d 69 74 46 6c 61 67 29 3b 0a 20 20 20  eLimitFlag);.   
8960: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
8970: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
8980: 20 20 20 20 72 75 6e 53 71 6c 28 64 62 2c 20 28      runSql(db, (
8990: 63 68 61 72 2a 29 70 53 71 6c 2d 3e 61 2c 20 72  char*)pSql->a, r
89a0: 75 6e 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  unFlags);.      
89b0: 20 20 7d 77 68 69 6c 65 28 20 74 69 6d 65 6f 75    }while( timeou
89c0: 74 54 65 73 74 20 29 3b 0a 20 20 20 20 20 20 20  tTest );.       
89d0: 20 73 65 74 41 6c 61 72 6d 28 30 29 3b 0a 20 20   setAlarm(0);.  
89e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
89f0: 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ose(db);.       
8a00: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d   if( sqlite3_mem
8a10: 6f 72 79 5f 75 73 65 64 28 29 3e 30 20 29 20 66  ory_used()>0 ) f
8a20: 61 74 61 6c 45 72 72 6f 72 28 22 6d 65 6d 6f 72  atalError("memor
8a30: 79 20 6c 65 61 6b 22 29 3b 0a 20 20 20 20 20 20  y leak");.      
8a40: 20 20 72 65 66 6f 72 6d 61 74 56 66 73 28 29 3b    reformatVfs();
8a50: 0a 20 20 20 20 20 20 20 20 6e 54 65 73 74 2b 2b  .        nTest++
8a60: 3b 0a 20 20 20 20 20 20 20 20 67 2e 7a 54 65 73  ;.        g.zTes
8a70: 74 4e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 0a 20  tName[0] = 0;.. 
8a80: 20 20 20 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61         /* Simula
8a90: 74 65 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  te an error if t
8aa0: 68 65 20 54 45 53 54 5f 46 41 49 4c 55 52 45 20  he TEST_FAILURE 
8ab0: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69  environment vari
8ac0: 61 62 6c 65 20 69 73 20 22 35 22 2e 0a 20 20 20  able is "5"..   
8ad0: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
8ae0: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
8af0: 68 61 74 20 61 75 74 6f 6d 61 74 65 64 20 74 65  hat automated te
8b00: 73 74 20 73 63 72 69 70 74 20 72 65 61 6c 6c 79  st script really
8b10: 20 64 6f 20 73 70 6f 74 0a 20 20 20 20 20 20 20   do spot.       
8b20: 20 2a 2a 20 65 72 72 6f 72 73 20 74 68 61 74 20   ** errors that 
8b30: 6f 63 63 75 72 20 69 6e 20 74 68 69 73 20 74 65  occur in this te
8b40: 73 74 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20  st program..    
8b50: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
8b60: 66 28 20 7a 46 61 69 6c 43 6f 64 65 20 29 7b 0a  f( zFailCode ){.
8b70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 46            if( zF
8b80: 61 69 6c 43 6f 64 65 5b 30 5d 3d 3d 27 35 27 20  ailCode[0]=='5' 
8b90: 26 26 20 7a 46 61 69 6c 43 6f 64 65 5b 31 5d 3d  && zFailCode[1]=
8ba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
8bb0: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 73 69    fatalError("si
8bc0: 6d 75 6c 61 74 65 64 20 66 61 69 6c 75 72 65 22  mulated failure"
8bd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
8be0: 73 65 20 69 66 28 20 7a 46 61 69 6c 43 6f 64 65  se if( zFailCode
8bf0: 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]!=0 ){.      
8c00: 20 20 20 20 20 20 2f 2a 20 49 66 20 54 45 53 54        /* If TEST
8c10: 5f 46 41 49 4c 55 52 45 20 69 73 20 73 6f 6d 65  _FAILURE is some
8c20: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
8c30: 20 35 2c 20 6a 75 73 74 20 65 78 69 74 20 74 68   5, just exit th
8c40: 65 20 74 65 73 74 0a 20 20 20 20 20 20 20 20 20  e test.         
8c50: 20 20 20 2a 2a 20 65 61 72 6c 79 20 2a 2f 0a 20     ** early */. 
8c60: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
8c70: 66 28 22 5c 6e 45 78 69 74 20 65 61 72 6c 79 20  f("\nExit early 
8c80: 64 75 65 20 74 6f 20 54 45 53 54 5f 46 41 49 4c  due to TEST_FAIL
8c90: 55 52 45 20 62 65 69 6e 67 20 73 65 74 5c 6e 22  URE being set\n"
8ca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
8cb0: 53 72 63 44 62 20 3d 20 6e 53 72 63 44 62 2d 31  SrcDb = nSrcDb-1
8cc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
8cd0: 74 6f 20 73 6f 75 72 63 65 64 62 5f 63 6c 65 61  to sourcedb_clea
8ce0: 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nup;.          }
8cf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8d00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
8d10: 20 21 71 75 69 65 74 46 6c 61 67 20 26 26 20 21   !quietFlag && !
8d20: 76 65 72 62 6f 73 65 46 6c 61 67 20 29 7b 0a 20  verboseFlag ){. 
8d30: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 31 30       printf(" 10
8d40: 30 25 25 20 2d 20 25 64 20 74 65 73 74 73 5c 6e  0%% - %d tests\n
8d50: 22 2c 20 67 2e 6e 44 62 2a 67 2e 6e 53 71 6c 29  ", g.nDb*g.nSql)
8d60: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
8d70: 2a 20 43 6c 65 61 6e 20 75 70 20 61 74 20 74 68  * Clean up at th
8d80: 65 20 65 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  e end of process
8d90: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 73 6f 75  ing a single sou
8da0: 72 63 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  rce database.   
8db0: 20 2a 2f 0a 20 20 73 6f 75 72 63 65 64 62 5f 63   */.  sourcedb_c
8dc0: 6c 65 61 6e 75 70 3a 0a 20 20 20 20 62 6c 6f 62  leanup:.    blob
8dd0: 4c 69 73 74 46 72 65 65 28 67 2e 70 46 69 72 73  ListFree(g.pFirs
8de0: 74 53 71 6c 29 3b 0a 20 20 20 20 62 6c 6f 62 4c  tSql);.    blobL
8df0: 69 73 74 46 72 65 65 28 67 2e 70 46 69 72 73 74  istFree(g.pFirst
8e00: 44 62 29 3b 0a 20 20 20 20 72 65 66 6f 72 6d 61  Db);.    reforma
8e10: 74 56 66 73 28 29 3b 0a 20 0a 20 20 7d 20 2f 2a  tVfs();. .  } /*
8e20: 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 61   End loop over a
8e30: 6c 6c 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  ll source databa
8e40: 73 65 73 20 2a 2f 0a 0a 20 20 69 66 28 20 21 71  ses */..  if( !q
8e50: 75 69 65 74 46 6c 61 67 20 29 7b 0a 20 20 20 20  uietFlag ){.    
8e60: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
8e70: 6c 61 70 73 65 20 3d 20 74 69 6d 65 4f 66 44 61  lapse = timeOfDa
8e80: 79 28 29 20 2d 20 69 42 65 67 69 6e 3b 0a 20 20  y() - iBegin;.  
8e90: 20 20 70 72 69 6e 74 66 28 22 66 75 7a 7a 63 68    printf("fuzzch
8ea0: 65 63 6b 3a 20 30 20 65 72 72 6f 72 73 20 6f 75  eck: 0 errors ou
8eb0: 74 20 6f 66 20 25 64 20 74 65 73 74 73 20 69 6e  t of %d tests in
8ec0: 20 25 64 2e 25 30 33 64 20 73 65 63 6f 6e 64 73   %d.%03d seconds
8ed0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  \n".           "
8ee0: 53 51 4c 69 74 65 20 25 73 20 25 73 5c 6e 22 2c  SQLite %s %s\n",
8ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 6e 54 65 73  .           nTes
8f00: 74 2c 20 28 69 6e 74 29 28 69 45 6c 61 70 73 65  t, (int)(iElapse
8f10: 2f 31 30 30 30 29 2c 20 28 69 6e 74 29 28 69 45  /1000), (int)(iE
8f20: 6c 61 70 73 65 25 31 30 30 30 29 2c 0a 20 20 20  lapse%1000),.   
8f30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8f40: 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71  libversion(), sq
8f50: 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
8f60: 29 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 7a  );.  }.  free(az
8f70: 53 72 63 44 62 29 3b 0a 20 20 66 72 65 65 28 70  SrcDb);.  free(p
8f80: 48 65 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  Heap);.  return 
8f90: 30 3b 0a 7d 0a                                   0;.}.