/ Hex Artifact Content
Login

Artifact 73d7c49980c1a380f1dff52df9c6d67c854d92ea:


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 0a  de "sqlite3.h"..
0b30: 23 69 66 64 65 66 20 5f 5f 75 6e 69 78 5f 5f 0a  #ifdef __unix__.
0b40: 23 20 69 6e 63 6c 75 64 65 20 3c 73 69 67 6e 61  # include <signa
0b50: 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  l.h>.# include <
0b60: 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66  unistd.h>.#endif
0b70: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 73 20 69 6e  ../*.** Files in
0b80: 20 74 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   the virtual fil
0b90: 65 20 73 79 73 74 65 6d 2e 0a 2a 2f 0a 74 79 70  e system..*/.typ
0ba0: 65 64 65 66 20 73 74 72 75 63 74 20 56 46 69 6c  edef struct VFil
0bb0: 65 20 56 46 69 6c 65 3b 0a 73 74 72 75 63 74 20  e VFile;.struct 
0bc0: 56 46 69 6c 65 20 7b 0a 20 20 63 68 61 72 20 2a  VFile {.  char *
0bd0: 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
0be0: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 2e 20 20    /* Filename.  
0bf0: 4e 55 4c 4c 20 66 6f 72 20 64 65 6c 65 74 65 2d  NULL for delete-
0c00: 6f 6e 2d 63 6c 6f 73 65 2e 20 46 72 6f 6d 20 6d  on-close. From m
0c10: 61 6c 6c 6f 63 28 29 20 2a 2f 0a 20 20 69 6e 74  alloc() */.  int
0c20: 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   sz;            
0c30: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
0c40: 74 68 65 20 66 69 6c 65 20 69 6e 20 62 79 74 65  the file in byte
0c50: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0c70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  * Number of refe
0c80: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 66  rences to this f
0c90: 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ile */.  unsigne
0ca0: 64 20 63 68 61 72 20 2a 61 3b 20 20 20 20 20 20  d char *a;      
0cb0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
0cc0: 68 65 20 66 69 6c 65 2e 20 20 46 72 6f 6d 20 6d  he file.  From m
0cd0: 61 6c 6c 6f 63 28 29 20 2a 2f 0a 7d 3b 0a 74 79  alloc() */.};.ty
0ce0: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 48 61  pedef struct VHa
0cf0: 6e 64 6c 65 20 56 48 61 6e 64 6c 65 3b 0a 73 74  ndle VHandle;.st
0d00: 72 75 63 74 20 56 48 61 6e 64 6c 65 20 7b 0a 20  ruct VHandle {. 
0d10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62 61   sqlite3_file ba
0d20: 73 65 3b 20 20 20 20 20 20 2f 2a 20 42 61 73 65  se;      /* Base
0d30: 20 63 6c 61 73 73 2e 20 20 4d 75 73 74 20 62 65   class.  Must be
0d40: 20 66 69 72 73 74 20 2a 2f 0a 20 20 56 46 69 6c   first */.  VFil
0d50: 65 20 2a 70 56 46 69 6c 65 3b 20 20 20 20 20 20  e *pVFile;      
0d60: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
0d70: 6c 79 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 7d 3b  lying file */.};
0d80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ../*.** The valu
0d90: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
0da0: 66 69 6c 65 20 74 65 6d 70 6c 61 74 65 2c 20 6f  file template, o
0db0: 72 20 6f 66 20 61 6e 20 53 51 4c 20 73 63 72 69  r of an SQL scri
0dc0: 70 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  pt.*/.typedef st
0dd0: 72 75 63 74 20 42 6c 6f 62 20 42 6c 6f 62 3b 0a  ruct Blob Blob;.
0de0: 73 74 72 75 63 74 20 42 6c 6f 62 20 7b 0a 20 20  struct Blob {.  
0df0: 42 6c 6f 62 20 2a 70 4e 65 78 74 3b 20 20 20 20  Blob *pNext;    
0e00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
0e10: 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 20 20 69  in a list */.  i
0e20: 6e 74 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  nt id;          
0e30: 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
0e40: 74 68 69 73 20 42 6c 6f 62 20 2a 2f 0a 20 20 69  this Blob */.  i
0e50: 6e 74 20 73 65 71 3b 20 20 20 20 20 20 20 20 20  nt seq;         
0e60: 20 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65 6e         /* Sequen
0e70: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ce number */.  i
0e80: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
0e90: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
0ea0: 66 20 74 68 69 73 20 42 6c 6f 62 20 69 6e 20 62  f this Blob in b
0eb0: 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
0ec0: 65 64 20 63 68 61 72 20 61 5b 31 5d 3b 20 20 20  ed char a[1];   
0ed0: 20 20 2f 2a 20 42 6c 6f 62 20 63 6f 6e 74 65 6e    /* Blob conten
0ee0: 74 2e 20 20 45 78 74 72 61 20 73 70 61 63 65 20  t.  Extra space 
0ef0: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 6e 65 65  allocated as nee
0f00: 64 65 64 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ded. */.};../*.*
0f10: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
0f20: 20 6f 66 20 66 69 6c 65 73 20 69 6e 20 74 68 65   of files in the
0f30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 76 69 72 74 75   in-memory virtu
0f40: 61 6c 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a  al filesystem..*
0f50: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 46 49 4c  /.#define MX_FIL
0f60: 45 20 20 31 30 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78  E  10../*.** Max
0f70: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 66 69 6c  imum allowed fil
0f80: 65 20 73 69 7a 65 0a 2a 2f 0a 23 64 65 66 69 6e  e size.*/.#defin
0f90: 65 20 4d 58 5f 46 49 4c 45 5f 53 5a 20 31 30 30  e MX_FILE_SZ 100
0fa0: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  00000../*.** All
0fb0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0fc0: 73 20 61 72 65 20 67 61 74 68 65 72 65 64 20 69  s are gathered i
0fd0: 6e 74 6f 20 74 68 65 20 22 67 22 20 73 69 6e 67  nto the "g" sing
0fe0: 6c 65 74 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  leton..*/.static
0ff0: 20 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 56 61   struct GlobalVa
1000: 72 73 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rs {.  const cha
1010: 72 20 2a 7a 41 72 67 76 30 3b 20 20 20 20 20 20  r *zArgv0;      
1020: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1030: 6f 66 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20  of program */.  
1040: 56 46 69 6c 65 20 61 46 69 6c 65 5b 4d 58 5f 46  VFile aFile[MX_F
1050: 49 4c 45 5d 3b 20 20 20 20 20 20 20 20 20 20 20  ILE];           
1060: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
1070: 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20  filesystem */.  
1080: 69 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20  int nDb;        
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
10b0: 6d 70 6c 61 74 65 20 64 61 74 61 62 61 73 65 73  mplate databases
10c0: 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70 46 69 72   */.  Blob *pFir
10d0: 73 74 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  stDb;           
10e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
10f0: 74 20 6f 66 20 66 69 72 73 74 20 74 65 6d 70 6c  t of first templ
1100: 61 74 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ate database */.
1110: 20 20 69 6e 74 20 6e 53 71 6c 3b 20 20 20 20 20    int nSql;     
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1140: 53 51 4c 20 73 63 72 69 70 74 73 20 2a 2f 0a 20  SQL scripts */. 
1150: 20 42 6c 6f 62 20 2a 70 46 69 72 73 74 53 71 6c   Blob *pFirstSql
1160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1170: 20 20 2f 2a 20 46 69 72 73 74 20 53 51 4c 20 73    /* First SQL s
1180: 63 72 69 70 74 20 2a 2f 0a 20 20 63 68 61 72 20  cript */.  char 
1190: 7a 54 65 73 74 4e 61 6d 65 5b 31 30 30 5d 3b 20  zTestName[100]; 
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11b0: 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74 20 74  ame of current t
11c0: 65 73 74 20 2a 2f 0a 7d 20 67 3b 0a 0a 2f 2a 0a  est */.} g;../*.
11d0: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
11e0: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 71 75  r message and qu
11f0: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
1200: 69 64 20 66 61 74 61 6c 45 72 72 6f 72 28 63 6f  id fatalError(co
1210: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1220: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1230: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 67 2e 7a  st ap;.  if( g.z
1240: 54 65 73 74 4e 61 6d 65 5b 30 5d 20 29 7b 0a 20  TestName[0] ){. 
1250: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1260: 72 2c 20 22 25 73 20 28 25 73 29 3a 20 22 2c 20  r, "%s (%s): ", 
1270: 67 2e 7a 41 72 67 76 30 2c 20 67 2e 7a 54 65 73  g.zArgv0, g.zTes
1280: 74 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  tName);.  }else{
1290: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
12a0: 65 72 72 2c 20 22 25 73 3a 20 22 2c 20 67 2e 7a  err, "%s: ", g.z
12b0: 41 72 67 76 30 29 3b 0a 20 20 7d 0a 20 20 76 61  Argv0);.  }.  va
12c0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
12d0: 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28  at);.  vfprintf(
12e0: 73 74 64 65 72 72 2c 20 7a 46 6f 72 6d 61 74 2c  stderr, zFormat,
12f0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
1300: 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  p);.  fprintf(st
1310: 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 20 20 65  derr, "\n");.  e
1320: 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xit(1);.}../*.**
1330: 20 54 69 6d 65 6f 75 74 20 68 61 6e 64 6c 65 72   Timeout handler
1340: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 75 6e 69  .*/.#ifdef __uni
1350: 78 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  x__.static void 
1360: 74 69 6d 65 6f 75 74 48 61 6e 64 6c 65 72 28 69  timeoutHandler(i
1370: 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 28  nt NotUsed){.  (
1380: 76 6f 69 64 29 4e 6f 74 55 73 65 64 3b 0a 20 20  void)NotUsed;.  
1390: 66 61 74 61 6c 45 72 72 6f 72 28 22 74 69 6d 65  fatalError("time
13a0: 6f 75 74 5c 6e 22 29 3b 0a 7d 0a 23 65 6e 64 69  out\n");.}.#endi
13b0: 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  f../*.** Set the
13c0: 20 61 6e 20 61 6c 61 72 6d 20 74 6f 20 67 6f 20   an alarm to go 
13d0: 6f 66 66 20 61 66 74 65 72 20 4e 20 73 65 63 6f  off after N seco
13e0: 6e 64 73 2e 20 20 44 69 73 61 62 6c 65 20 74 68  nds.  Disable th
13f0: 65 20 61 6c 61 72 6d 0a 2a 2a 20 69 66 20 4e 3d  e alarm.** if N=
1400: 3d 30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  =0.*/.static voi
1410: 64 20 73 65 74 41 6c 61 72 6d 28 69 6e 74 20 4e  d setAlarm(int N
1420: 29 7b 0a 23 69 66 64 65 66 20 5f 5f 75 6e 69 78  ){.#ifdef __unix
1430: 5f 5f 0a 20 20 61 6c 61 72 6d 28 4e 29 3b 0a 23  __.  alarm(N);.#
1440: 65 6c 73 65 0a 20 20 28 76 6f 69 64 29 4e 3b 0a  else.  (void)N;.
1450: 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65  #endif.}..#ifnde
1460: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
1470: 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a  OGRESS_CALLBACK.
1480: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 6e 20 53 51  /*.** This an SQ
1490: 4c 20 70 72 6f 67 72 65 73 73 20 68 61 6e 64 6c  L progress handl
14a0: 65 72 2e 20 20 41 66 74 65 72 20 61 6e 20 53 51  er.  After an SQ
14b0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  L statement has 
14c0: 72 75 6e 20 66 6f 72 0a 2a 2a 20 6d 61 6e 79 20  run for.** many 
14d0: 73 74 65 70 73 2c 20 77 65 20 77 61 6e 74 20 74  steps, we want t
14e0: 6f 20 69 6e 74 65 72 72 75 70 74 20 69 74 2e 20  o interrupt it. 
14f0: 20 54 68 69 73 20 67 75 61 72 64 73 20 61 67 61   This guards aga
1500: 69 6e 73 74 20 69 6e 66 69 6e 69 74 65 0a 2a 2a  inst infinite.**
1510: 20 6c 6f 6f 70 73 20 66 72 6f 6d 20 72 65 63 75   loops from recu
1520: 72 73 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62  rsive common tab
1530: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  le expressions..
1540: 2a 2a 0a 2a 2a 20 2a 70 56 64 62 65 4c 69 6d 69  **.** *pVdbeLimi
1550: 74 46 6c 61 67 20 69 73 20 74 72 75 65 20 69 66  tFlag is true if
1560: 20 74 68 65 20 2d 2d 6c 69 6d 69 74 2d 76 64 62   the --limit-vdb
1570: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  e command-line o
1580: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
1590: 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  * In that case, 
15a0: 68 69 74 74 69 6e 67 20 74 68 65 20 70 72 6f 67  hitting the prog
15b0: 72 65 73 73 20 68 61 6e 64 6c 65 72 20 69 73 20  ress handler is 
15c0: 61 20 66 61 74 61 6c 20 65 72 72 6f 72 2e 0a 2a  a fatal error..*
15d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
15e0: 67 72 65 73 73 48 61 6e 64 6c 65 72 28 76 6f 69  gressHandler(voi
15f0: 64 20 2a 70 56 64 62 65 4c 69 6d 69 74 46 6c 61  d *pVdbeLimitFla
1600: 67 29 7b 0a 20 20 69 66 28 20 2a 28 69 6e 74 2a  g){.  if( *(int*
1610: 29 70 56 64 62 65 4c 69 6d 69 74 46 6c 61 67 20  )pVdbeLimitFlag 
1620: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 74 6f  ) fatalError("to
1630: 6f 20 6d 61 6e 79 20 56 44 42 45 20 63 79 63 6c  o many VDBE cycl
1640: 65 73 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  es");.  return 1
1650: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1660: 2a 20 52 65 61 6c 6c 6f 63 61 74 65 20 6d 65 6d  * Reallocate mem
1670: 6f 72 79 2e 20 20 53 68 6f 77 20 61 6e 64 20 65  ory.  Show and e
1680: 72 72 6f 72 20 61 6e 64 20 71 75 69 74 20 69 66  rror and quit if
1690: 20 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   unable..*/.stat
16a0: 69 63 20 76 6f 69 64 20 2a 73 61 66 65 5f 72 65  ic void *safe_re
16b0: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 4f 6c 64  alloc(void *pOld
16c0: 2c 20 69 6e 74 20 73 7a 4e 65 77 29 7b 0a 20 20  , int szNew){.  
16d0: 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 72 65 61  void *pNew = rea
16e0: 6c 6c 6f 63 28 70 4f 6c 64 2c 20 73 7a 4e 65 77  lloc(pOld, szNew
16f0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
1700: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 75   ) fatalError("u
1710: 6e 61 62 6c 65 20 74 6f 20 72 65 61 6c 6c 6f 63  nable to realloc
1720: 20 66 6f 72 20 25 64 20 62 79 74 65 73 22 2c 20   for %d bytes", 
1730: 73 7a 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  szNew);.  return
1740: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
1750: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 76  Initialize the v
1760: 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
1770: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  em..*/.static vo
1780: 69 64 20 66 6f 72 6d 61 74 56 66 73 28 76 6f 69  id formatVfs(voi
1790: 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  d){.  int i;.  f
17a0: 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 46 49 4c  or(i=0; i<MX_FIL
17b0: 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 67 2e 61  E; i++){.    g.a
17c0: 46 69 6c 65 5b 69 5d 2e 73 7a 20 3d 20 2d 31 3b  File[i].sz = -1;
17d0: 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e  .    g.aFile[i].
17e0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
17f0: 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 61 20     g.aFile[i].a 
1800: 3d 20 30 3b 0a 20 20 20 20 67 2e 61 46 69 6c 65  = 0;.    g.aFile
1810: 5b 69 5d 2e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  [i].nRef = 0;.  
1820: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  }.}.../*.** Eras
1830: 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
1840: 6e 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  n in the virtual
1850: 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 0a 2a 2f   file system..*/
1860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 66  .static void ref
1870: 6f 72 6d 61 74 56 66 73 28 76 6f 69 64 29 7b 0a  ormatVfs(void){.
1880: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1890: 3d 30 3b 20 69 3c 4d 58 5f 46 49 4c 45 3b 20 69  =0; i<MX_FILE; i
18a0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 61  ++){.    if( g.a
18b0: 46 69 6c 65 5b 69 5d 2e 73 7a 3c 30 20 29 20 63  File[i].sz<0 ) c
18c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
18d0: 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46 69 6c   g.aFile[i].zFil
18e0: 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66  ename ){.      f
18f0: 72 65 65 28 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a  ree(g.aFile[i].z
1900: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
1910: 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46 69 6c   g.aFile[i].zFil
1920: 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ename = 0;.    }
1930: 0a 20 20 20 20 69 66 28 20 67 2e 61 46 69 6c 65  .    if( g.aFile
1940: 5b 69 5d 2e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  [i].nRef>0 ){.  
1950: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
1960: 66 69 6c 65 20 25 64 20 73 74 69 6c 6c 20 6f 70  file %d still op
1970: 65 6e 2e 20 20 6e 52 65 66 3d 25 64 22 2c 20 69  en.  nRef=%d", i
1980: 2c 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 6e 52 65  , g.aFile[i].nRe
1990: 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 2e  f);.    }.    g.
19a0: 61 46 69 6c 65 5b 69 5d 2e 73 7a 20 3d 20 2d 31  aFile[i].sz = -1
19b0: 3b 0a 20 20 20 20 66 72 65 65 28 67 2e 61 46 69  ;.    free(g.aFi
19c0: 6c 65 5b 69 5d 2e 61 29 3b 0a 20 20 20 20 67 2e  le[i].a);.    g.
19d0: 61 46 69 6c 65 5b 69 5d 2e 61 20 3d 20 30 3b 0a  aFile[i].a = 0;.
19e0: 20 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 6e      g.aFile[i].n
19f0: 52 65 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Ref = 0;.  }.}..
1a00: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 56 46 69  /*.** Find a VFi
1a10: 6c 65 20 62 79 20 6e 61 6d 65 0a 2a 2f 0a 73 74  le by name.*/.st
1a20: 61 74 69 63 20 56 46 69 6c 65 20 2a 66 69 6e 64  atic VFile *find
1a30: 56 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  VFile(const char
1a40: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
1a50: 69 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  i;.  if( zName==
1a60: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1a70: 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 46 49  for(i=0; i<MX_FI
1a80: 4c 45 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  LE; i++){.    if
1a90: 28 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46 69  ( g.aFile[i].zFi
1aa0: 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74  lename==0 ) cont
1ab0: 69 6e 75 65 3b 20 20 20 0a 20 20 20 20 69 66 28  inue;   .    if(
1ac0: 20 73 74 72 63 6d 70 28 67 2e 61 46 69 6c 65 5b   strcmp(g.aFile[
1ad0: 69 5d 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4e  i].zFilename, zN
1ae0: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
1af0: 20 26 67 2e 61 46 69 6c 65 5b 69 5d 3b 0a 20 20   &g.aFile[i];.  
1b00: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1b10: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 56 46  ./*.** Find a VF
1b20: 69 6c 65 20 62 79 20 6e 61 6d 65 2e 20 20 43 72  ile by name.  Cr
1b30: 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
1b40: 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1b50: 78 69 73 74 20 61 6e 64 0a 2a 2a 20 69 6e 69 74  xist and.** init
1b60: 69 61 6c 69 7a 65 20 69 74 20 74 6f 20 74 68 65  ialize it to the
1b70: 20 73 69 7a 65 20 61 6e 64 20 63 6f 6e 74 65 6e   size and conten
1b80: 74 20 67 69 76 65 6e 2e 0a 2a 2a 0a 2a 2a 20 52  t given..**.** R
1b90: 65 74 75 72 6e 20 4e 55 4c 4c 20 6f 6e 6c 79 20  eturn NULL only 
1ba0: 69 66 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  if the filesyste
1bb0: 6d 20 69 73 20 66 75 6c 6c 2e 0a 2a 2f 0a 73 74  m is full..*/.st
1bc0: 61 74 69 63 20 56 46 69 6c 65 20 2a 63 72 65 61  atic VFile *crea
1bd0: 74 65 56 46 69 6c 65 28 63 6f 6e 73 74 20 63 68  teVFile(const ch
1be0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 73  ar *zName, int s
1bf0: 7a 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  z, unsigned char
1c00: 20 2a 70 44 61 74 61 29 7b 0a 20 20 56 46 69 6c   *pData){.  VFil
1c10: 65 20 2a 70 4e 65 77 20 3d 20 66 69 6e 64 56 46  e *pNew = findVF
1c20: 69 6c 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e  ile(zName);.  in
1c30: 74 20 69 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  t i;.  if( pNew 
1c40: 29 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 20  ) return pNew;. 
1c50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d 58 5f 46   for(i=0; i<MX_F
1c60: 49 4c 45 20 26 26 20 67 2e 61 46 69 6c 65 5b 69  ILE && g.aFile[i
1c70: 5d 2e 73 7a 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a  ].sz>=0; i++){}.
1c80: 20 20 69 66 28 20 69 3e 3d 4d 58 5f 46 49 4c 45    if( i>=MX_FILE
1c90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1ca0: 4e 65 77 20 3d 20 26 67 2e 61 46 69 6c 65 5b 69  New = &g.aFile[i
1cb0: 5d 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  ];.  if( zName )
1cc0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 46 69 6c  {.    pNew->zFil
1cd0: 65 6e 61 6d 65 20 3d 20 73 61 66 65 5f 72 65 61  ename = safe_rea
1ce0: 6c 6c 6f 63 28 30 2c 20 73 74 72 6c 65 6e 28 7a  lloc(0, strlen(z
1cf0: 4e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20 6d 65  Name)+1);.    me
1d00: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 46 69 6c 65  mcpy(pNew->zFile
1d10: 6e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 73 74 72  name, zName, str
1d20: 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a 20  len(zName)+1);. 
1d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
1d40: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  ->zFilename = 0;
1d50: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  .  }.  pNew->nRe
1d60: 66 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 73  f = 0;.  pNew->s
1d70: 7a 20 3d 20 73 7a 3b 0a 20 20 70 4e 65 77 2d 3e  z = sz;.  pNew->
1d80: 61 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63  a = safe_realloc
1d90: 28 30 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 73  (0, sz);.  if( s
1da0: 7a 3e 30 20 29 20 6d 65 6d 63 70 79 28 70 4e 65  z>0 ) memcpy(pNe
1db0: 77 2d 3e 61 2c 20 70 44 61 74 61 2c 20 73 7a 29  w->a, pData, sz)
1dc0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
1dd0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  .}.../*.** Imple
1de0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
1df0: 20 22 72 65 61 64 66 69 6c 65 28 58 29 22 20 53   "readfile(X)" S
1e00: 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  QL function.  Th
1e10: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
1e20: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20  .** of the file 
1e30: 6e 61 6d 65 64 20 58 20 69 73 20 72 65 61 64 20  named X is read 
1e40: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 61 73 20  and returned as 
1e50: 61 20 42 4c 4f 42 2e 20 20 4e 55 4c 4c 20 69 73  a BLOB.  NULL is
1e60: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 66 20   returned.** if 
1e70: 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
1e80: 74 20 65 78 69 73 74 20 6f 72 20 69 73 20 75 6e  t exist or is un
1e90: 72 65 61 64 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  readable..*/.sta
1ea0: 74 69 63 20 76 6f 69 64 20 72 65 61 64 66 69 6c  tic void readfil
1eb0: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
1ec0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
1ed0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
1ee0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1ef0: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
1f00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
1f10: 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 6c 6f 6e 67  FILE *in;.  long
1f20: 20 6e 49 6e 3b 0a 20 20 76 6f 69 64 20 2a 70 42   nIn;.  void *pB
1f30: 75 66 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 28  uf;..  zName = (
1f40: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1f50: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1f60: 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[0]);.  if( z
1f70: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
1f80: 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a  ;.  in = fopen(z
1f90: 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 69  Name, "rb");.  i
1fa0: 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
1fb0: 6e 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30  n;.  fseek(in, 0
1fc0: 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e  , SEEK_END);.  n
1fd0: 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a  In = ftell(in);.
1fe0: 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20    rewind(in);.  
1ff0: 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pBuf = sqlite3_m
2000: 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 20 29 3b 0a  alloc64( nIn );.
2010: 20 20 69 66 28 20 70 42 75 66 20 26 26 20 31 3d    if( pBuf && 1=
2020: 3d 66 72 65 61 64 28 70 42 75 66 2c 20 6e 49 6e  =fread(pBuf, nIn
2030: 2c 20 31 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20  , 1, in) ){.    
2040: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62  sqlite3_result_b
2050: 6c 6f 62 28 63 6f 6e 74 65 78 74 2c 20 70 42 75  lob(context, pBu
2060: 66 2c 20 6e 49 6e 2c 20 73 71 6c 69 74 65 33 5f  f, nIn, sqlite3_
2070: 66 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  free);.  }else{.
2080: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2090: 28 70 42 75 66 29 3b 0a 20 20 7d 0a 20 20 66 63  (pBuf);.  }.  fc
20a0: 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 0a 2f 2a 0a  lose(in);.}../*.
20b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
20c0: 6e 20 6f 66 20 74 68 65 20 22 77 72 69 74 65 66  n of the "writef
20d0: 69 6c 65 28 58 2c 59 29 22 20 53 51 4c 20 66 75  ile(X,Y)" SQL fu
20e0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 61 72 67  nction.  The arg
20f0: 75 6d 65 6e 74 20 59 0a 2a 2a 20 69 73 20 77 72  ument Y.** is wr
2100: 69 74 74 65 6e 20 69 6e 74 6f 20 66 69 6c 65 20  itten into file 
2110: 58 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  X.  The number o
2120: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20  f bytes written 
2130: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 4f 72  is returned.  Or
2140: 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  .** NULL is retu
2150: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
2160: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 73 75  g goes wrong, su
2170: 63 68 20 61 73 20 62 65 69 6e 67 20 75 6e 61 62  ch as being unab
2180: 6c 65 20 74 6f 20 6f 70 65 6e 0a 2a 2a 20 66 69  le to open.** fi
2190: 6c 65 20 58 20 66 6f 72 20 77 72 69 74 69 6e 67  le X for writing
21a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21b0: 20 77 72 69 74 65 66 69 6c 65 46 75 6e 63 28 0a   writefileFunc(.
21c0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
21d0: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
21e0: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
21f0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
2200: 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 0a 20  {.  FILE *out;. 
2210: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
2220: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2230: 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rc;.  const char
2240: 20 2a 7a 46 69 6c 65 3b 0a 0a 20 20 28 76 6f 69   *zFile;..  (voi
2250: 64 29 61 72 67 63 3b 0a 20 20 7a 46 69 6c 65 20  d)argc;.  zFile 
2260: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
2270: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2280: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66  t(argv[0]);.  if
2290: 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20 72 65 74  ( zFile==0 ) ret
22a0: 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 6f 70  urn;.  out = fop
22b0: 65 6e 28 7a 46 69 6c 65 2c 20 22 77 62 22 29 3b  en(zFile, "wb");
22c0: 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 20  .  if( out==0 ) 
22d0: 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 28 63  return;.  z = (c
22e0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
22f0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
2300: 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 3d  gv[1]);.  if( z=
2310: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30  =0 ){.    rc = 0
2320: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2330: 63 20 3d 20 66 77 72 69 74 65 28 7a 2c 20 31 2c  c = fwrite(z, 1,
2340: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2350: 79 74 65 73 28 61 72 67 76 5b 31 5d 29 2c 20 6f  ytes(argv[1]), o
2360: 75 74 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  ut);.  }.  fclos
2370: 65 28 6f 75 74 29 3b 0a 20 20 73 71 6c 69 74 65  e(out);.  sqlite
2380: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 63  3_result_int64(c
2390: 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 7d 0a 0a  ontext, rc);.}..
23a0: 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 61 20 6c 69  ./*.** Load a li
23b0: 73 74 20 6f 66 20 42 6c 6f 62 20 6f 62 6a 65 63  st of Blob objec
23c0: 74 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ts from the data
23d0: 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  base.*/.static v
23e0: 6f 69 64 20 62 6c 6f 62 4c 69 73 74 4c 6f 61 64  oid blobListLoad
23f0: 46 72 6f 6d 44 62 28 0a 20 20 73 71 6c 69 74 65  FromDb(.  sqlite
2400: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
2410: 20 20 20 2f 2a 20 52 65 61 64 20 66 72 6f 6d 20     /* Read from 
2420: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
2430: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2440: 53 71 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 51  Sql,        /* Q
2450: 75 65 72 79 20 75 73 65 64 20 74 6f 20 65 78 74  uery used to ext
2460: 72 61 63 74 20 74 68 65 20 62 6c 6f 62 73 20 2a  ract the blobs *
2470: 2f 0a 20 20 69 6e 74 20 6f 6e 6c 79 49 64 2c 20  /.  int onlyId, 
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2490: 4f 6e 6c 79 20 6c 6f 61 64 20 77 68 65 72 65 20  Only load where 
24a0: 69 64 20 69 73 20 74 68 69 73 20 76 61 6c 75 65  id is this value
24b0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 2c 20 20   */.  int *pN,  
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24d0: 2a 20 4f 55 54 3a 20 57 72 69 74 65 20 6e 75 6d  * OUT: Write num
24e0: 62 65 72 20 6f 66 20 62 6c 6f 62 73 20 6c 6f 61  ber of blobs loa
24f0: 64 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 42 6c  ded here */.  Bl
2500: 6f 62 20 2a 2a 70 70 4c 69 73 74 20 20 20 20 20  ob **ppList     
2510: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57         /* OUT: W
2520: 72 69 74 65 20 74 68 65 20 68 65 61 64 20 6f 66  rite the head of
2530: 20 74 68 65 20 62 6c 6f 62 20 6c 69 73 74 20 68   the blob list h
2540: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 6c 6f 62  ere */.){.  Blob
2550: 20 68 65 61 64 3b 0a 20 20 42 6c 6f 62 20 2a 70   head;.  Blob *p
2560: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
2570: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 6e   *pStmt;.  int n
2580: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
2590: 20 20 63 68 61 72 20 2a 7a 32 3b 0a 0a 20 20 69    char *z2;..  i
25a0: 66 28 20 6f 6e 6c 79 49 64 3e 30 20 29 7b 0a 20  f( onlyId>0 ){. 
25b0: 20 20 20 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f     z2 = sqlite3_
25c0: 6d 70 72 69 6e 74 66 28 22 25 73 20 57 48 45 52  mprintf("%s WHER
25d0: 45 20 72 6f 77 69 64 3d 25 64 22 2c 20 7a 53 71  E rowid=%d", zSq
25e0: 6c 2c 20 6f 6e 6c 79 49 64 29 3b 0a 20 20 7d 65  l, onlyId);.  }e
25f0: 6c 73 65 7b 0a 20 20 20 20 7a 32 20 3d 20 73 71  lse{.    z2 = sq
2600: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2610: 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  s", zSql);.  }. 
2620: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2630: 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 32 2c  epare_v2(db, z2,
2640: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2650: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2660: 7a 32 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  z2);.  if( rc ) 
2670: 66 61 74 61 6c 45 72 72 6f 72 28 22 25 73 22 2c  fatalError("%s",
2680: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2690: 64 62 29 29 3b 0a 20 20 68 65 61 64 2e 70 4e 65  db));.  head.pNe
26a0: 78 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 26 68  xt = 0;.  p = &h
26b0: 65 61 64 3b 0a 20 20 77 68 69 6c 65 28 20 53 51  ead;.  while( SQ
26c0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
26d0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
26e0: 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 71  .    int sz = sq
26f0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2700: 65 73 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  es(pStmt, 1);.  
2710: 20 20 42 6c 6f 62 20 2a 70 4e 65 77 20 3d 20 73    Blob *pNew = s
2720: 61 66 65 5f 72 65 61 6c 6c 6f 63 28 30 2c 20 73  afe_realloc(0, s
2730: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 2b 73 7a 20  izeof(*pNew)+sz 
2740: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 64 20  );.    pNew->id 
2750: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2760: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
2770: 20 20 20 20 70 4e 65 77 2d 3e 73 7a 20 3d 20 73      pNew->sz = s
2780: 7a 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 65 71  z;.    pNew->seq
2790: 20 3d 20 6e 2b 2b 3b 0a 20 20 20 20 70 4e 65 77   = n++;.    pNew
27a0: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
27b0: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 61 2c   memcpy(pNew->a,
27c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27d0: 62 6c 6f 62 28 70 53 74 6d 74 2c 31 29 2c 20 73  blob(pStmt,1), s
27e0: 7a 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  z);.    pNew->a[
27f0: 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  sz] = 0;.    p->
2800: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
2810: 20 20 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a    p = pNew;.  }.
2820: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2830: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 2a 70 4e  ze(pStmt);.  *pN
2840: 20 3d 20 6e 3b 0a 20 20 2a 70 70 4c 69 73 74 20   = n;.  *ppList 
2850: 3d 20 68 65 61 64 2e 70 4e 65 78 74 3b 0a 7d 0a  = head.pNext;.}.
2860: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 6c 69  ./*.** Free a li
2870: 73 74 20 6f 66 20 42 6c 6f 62 20 6f 62 6a 65 63  st of Blob objec
2880: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
2890: 64 20 62 6c 6f 62 4c 69 73 74 46 72 65 65 28 42  d blobListFree(B
28a0: 6c 6f 62 20 2a 70 29 7b 0a 20 20 42 6c 6f 62 20  lob *p){.  Blob 
28b0: 2a 70 4e 65 78 74 3b 0a 20 20 77 68 69 6c 65 28  *pNext;.  while(
28c0: 20 70 20 29 7b 0a 20 20 20 20 70 4e 65 78 74 20   p ){.    pNext 
28d0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
28e0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 70 20 3d  free(p);.    p =
28f0: 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 0a   pNext;.  }.}...
2900: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  /* Return the cu
2910: 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b  rrent wall-clock
2920: 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20   time */.static 
2930: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 69  sqlite3_int64 ti
2940: 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a 20  meOfDay(void){. 
2950: 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2960: 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20  vfs *clockVfs = 
2970: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
2980: 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63  64 t;.  if( cloc
2990: 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56  kVfs==0 ) clockV
29a0: 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
29b0: 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
29c0: 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73 69  clockVfs->iVersi
29d0: 6f 6e 3e 3d 31 20 26 26 20 63 6c 6f 63 6b 56 66  on>=1 && clockVf
29e0: 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49  s->xCurrentTimeI
29f0: 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt64!=0 ){.    c
2a00: 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e  lockVfs->xCurren
2a10: 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b  tTimeInt64(clock
2a20: 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73  Vfs, &t);.  }els
2a30: 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  e{.    double r;
2a40: 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78  .    clockVfs->x
2a50: 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63  CurrentTime(cloc
2a60: 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20 74  kVfs, &r);.    t
2a70: 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
2a80: 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30 29  4)(r*86400000.0)
2a90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74  ;.  }.  return t
2aa0: 3b 0a 7d 0a 0a 2f 2a 20 4d 65 74 68 6f 64 73 20  ;.}../* Methods 
2ab0: 66 6f 72 20 74 68 65 20 56 48 61 6e 64 6c 65 20  for the VHandle 
2ac0: 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63  object.*/.static
2ad0: 20 69 6e 74 20 69 6e 6d 65 6d 43 6c 6f 73 65 28   int inmemClose(
2ae0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
2af0: 69 6c 65 29 7b 0a 20 20 56 48 61 6e 64 6c 65 20  ile){.  VHandle 
2b00: 2a 70 20 3d 20 28 56 48 61 6e 64 6c 65 2a 29 70  *p = (VHandle*)p
2b10: 46 69 6c 65 3b 0a 20 20 56 46 69 6c 65 20 2a 70  File;.  VFile *p
2b20: 56 46 69 6c 65 20 3d 20 70 2d 3e 70 56 46 69 6c  VFile = p->pVFil
2b30: 65 3b 0a 20 20 70 56 46 69 6c 65 2d 3e 6e 52 65  e;.  pVFile->nRe
2b40: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 56 46 69 6c  f--;.  if( pVFil
2b50: 65 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 70 56  e->nRef==0 && pV
2b60: 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3d  File->zFilename=
2b70: 3d 30 20 29 7b 0a 20 20 20 20 70 56 46 69 6c 65  =0 ){.    pVFile
2b80: 2d 3e 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 66  ->sz = -1;.    f
2b90: 72 65 65 28 70 56 46 69 6c 65 2d 3e 61 29 3b 0a  ree(pVFile->a);.
2ba0: 20 20 20 20 70 56 46 69 6c 65 2d 3e 61 20 3d 20      pVFile->a = 
2bb0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
2bc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
2bd0: 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 52 65 61  tic int inmemRea
2be0: 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
2bf0: 65 20 2a 70 46 69 6c 65 2c 20 20 20 2f 2a 20 52  e *pFile,   /* R
2c00: 65 61 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ead from this op
2c10: 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 76 6f 69  en file */.  voi
2c20: 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  d *pData,       
2c30: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 63 6f 6e      /* Store con
2c40: 74 65 6e 74 20 69 6e 20 74 68 69 73 20 62 75 66  tent in this buf
2c50: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 41 6d  fer */.  int iAm
2c60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2c70: 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
2c80: 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
2c90: 5f 69 6e 74 36 34 20 69 4f 66 73 74 20 20 20 20  _int64 iOfst    
2ca0: 2f 2a 20 53 74 61 72 74 20 72 65 61 64 69 6e 67  /* Start reading
2cb0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 56 48   here */.){.  VH
2cc0: 61 6e 64 6c 65 20 2a 70 48 61 6e 64 6c 65 20 3d  andle *pHandle =
2cd0: 20 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c 65   (VHandle*)pFile
2ce0: 3b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69 6c  ;.  VFile *pVFil
2cf0: 65 20 3d 20 70 48 61 6e 64 6c 65 2d 3e 70 56 46  e = pHandle->pVF
2d00: 69 6c 65 3b 0a 20 20 69 66 28 20 69 4f 66 73 74  ile;.  if( iOfst
2d10: 3c 30 20 7c 7c 20 69 4f 66 73 74 3e 3d 70 56 46  <0 || iOfst>=pVF
2d20: 69 6c 65 2d 3e 73 7a 20 29 7b 0a 20 20 20 20 6d  ile->sz ){.    m
2d30: 65 6d 73 65 74 28 70 44 61 74 61 2c 20 30 2c 20  emset(pData, 0, 
2d40: 69 41 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72  iAmt);.    retur
2d50: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
2d60: 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20  HORT_READ;.  }. 
2d70: 20 69 66 28 20 69 4f 66 73 74 2b 69 41 6d 74 3e   if( iOfst+iAmt>
2d80: 70 56 46 69 6c 65 2d 3e 73 7a 20 29 7b 0a 20 20  pVFile->sz ){.  
2d90: 20 20 6d 65 6d 73 65 74 28 70 44 61 74 61 2c 20    memset(pData, 
2da0: 30 2c 20 69 41 6d 74 29 3b 0a 20 20 20 20 69 41  0, iAmt);.    iA
2db0: 6d 74 20 3d 20 28 69 6e 74 29 28 70 56 46 69 6c  mt = (int)(pVFil
2dc0: 65 2d 3e 73 7a 20 2d 20 69 4f 66 73 74 29 3b 0a  e->sz - iOfst);.
2dd0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
2de0: 2c 20 70 56 46 69 6c 65 2d 3e 61 2c 20 69 41 6d  , pVFile->a, iAm
2df0: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
2e00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
2e10: 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6d 65  T_READ;.  }.  me
2e20: 6d 63 70 79 28 70 44 61 74 61 2c 20 70 56 46 69  mcpy(pData, pVFi
2e30: 6c 65 2d 3e 61 20 2b 20 69 4f 66 73 74 2c 20 69  le->a + iOfst, i
2e40: 41 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Amt);.  return S
2e50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
2e60: 69 63 20 69 6e 74 20 69 6e 6d 65 6d 57 72 69 74  ic int inmemWrit
2e70: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
2e80: 65 20 2a 70 46 69 6c 65 2c 20 20 20 2f 2a 20 57  e *pFile,   /* W
2e90: 72 69 74 65 20 74 6f 20 74 68 69 73 20 66 69 6c  rite to this fil
2ea0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  e */.  const voi
2eb0: 64 20 2a 70 44 61 74 61 2c 20 20 20 20 20 2f 2a  d *pData,     /*
2ec0: 20 43 6f 6e 74 65 6e 74 20 74 6f 20 77 72 69 74   Content to writ
2ed0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 41 6d 74 2c  e */.  int iAmt,
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ef0: 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
2f00: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
2f10: 36 34 20 69 4f 66 73 74 20 20 20 20 2f 2a 20 53  64 iOfst    /* S
2f20: 74 61 72 74 20 77 72 69 74 69 6e 67 20 68 65 72  tart writing her
2f30: 65 20 2a 2f 0a 29 7b 0a 20 20 56 48 61 6e 64 6c  e */.){.  VHandl
2f40: 65 20 2a 70 48 61 6e 64 6c 65 20 3d 20 28 56 48  e *pHandle = (VH
2f50: 61 6e 64 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20  andle*)pFile;.  
2f60: 56 46 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20  VFile *pVFile = 
2f70: 70 48 61 6e 64 6c 65 2d 3e 70 56 46 69 6c 65 3b  pHandle->pVFile;
2f80: 0a 20 20 69 66 28 20 69 4f 66 73 74 2b 69 41 6d  .  if( iOfst+iAm
2f90: 74 20 3e 20 70 56 46 69 6c 65 2d 3e 73 7a 20 29  t > pVFile->sz )
2fa0: 7b 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74 2b  {.    if( iOfst+
2fb0: 69 41 6d 74 20 3e 3d 20 4d 58 5f 46 49 4c 45 5f  iAmt >= MX_FILE_
2fc0: 53 5a 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  SZ ){.      retu
2fd0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
2fe0: 20 20 20 20 7d 0a 20 20 20 20 70 56 46 69 6c 65      }.    pVFile
2ff0: 2d 3e 61 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c  ->a = safe_reall
3000: 6f 63 28 70 56 46 69 6c 65 2d 3e 61 2c 20 28 69  oc(pVFile->a, (i
3010: 6e 74 29 28 69 4f 66 73 74 2b 69 41 6d 74 29 29  nt)(iOfst+iAmt))
3020: 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74 20  ;.    if( iOfst 
3030: 3e 20 70 56 46 69 6c 65 2d 3e 73 7a 20 29 7b 0a  > pVFile->sz ){.
3040: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 56 46        memset(pVF
3050: 69 6c 65 2d 3e 61 20 2b 20 70 56 46 69 6c 65 2d  ile->a + pVFile-
3060: 3e 73 7a 2c 20 30 2c 20 28 69 6e 74 29 28 69 4f  >sz, 0, (int)(iO
3070: 66 73 74 20 2d 20 70 56 46 69 6c 65 2d 3e 73 7a  fst - pVFile->sz
3080: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 56  ));.    }.    pV
3090: 46 69 6c 65 2d 3e 73 7a 20 3d 20 28 69 6e 74 29  File->sz = (int)
30a0: 28 69 4f 66 73 74 20 2b 20 69 41 6d 74 29 3b 0a  (iOfst + iAmt);.
30b0: 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 56 46    }.  memcpy(pVF
30c0: 69 6c 65 2d 3e 61 20 2b 20 69 4f 66 73 74 2c 20  ile->a + iOfst, 
30d0: 70 44 61 74 61 2c 20 69 41 6d 74 29 3b 0a 20 20  pData, iAmt);.  
30e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30f0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ;.}.static int i
3100: 6e 6d 65 6d 54 72 75 6e 63 61 74 65 28 73 71 6c  nmemTruncate(sql
3110: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
3120: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
3130: 69 53 69 7a 65 29 7b 0a 20 20 56 48 61 6e 64 6c  iSize){.  VHandl
3140: 65 20 2a 70 48 61 6e 64 6c 65 20 3d 20 28 56 48  e *pHandle = (VH
3150: 61 6e 64 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20  andle*)pFile;.  
3160: 56 46 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20  VFile *pVFile = 
3170: 70 48 61 6e 64 6c 65 2d 3e 70 56 46 69 6c 65 3b  pHandle->pVFile;
3180: 0a 20 20 69 66 28 20 70 56 46 69 6c 65 2d 3e 73  .  if( pVFile->s
3190: 7a 3e 69 53 69 7a 65 20 26 26 20 69 53 69 7a 65  z>iSize && iSize
31a0: 3e 3d 30 20 29 20 70 56 46 69 6c 65 2d 3e 73 7a  >=0 ) pVFile->sz
31b0: 20 3d 20 28 69 6e 74 29 69 53 69 7a 65 3b 0a 20   = (int)iSize;. 
31c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31d0: 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
31e0: 69 6e 6d 65 6d 53 79 6e 63 28 73 71 6c 69 74 65  inmemSync(sqlite
31f0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
3200: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74  nt flags){.  ret
3210: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3220: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65  .static int inme
3230: 6d 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  mFileSize(sqlite
3240: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73  3_file *pFile, s
3250: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53  qlite3_int64 *pS
3260: 69 7a 65 29 7b 0a 20 20 2a 70 53 69 7a 65 20 3d  ize){.  *pSize =
3270: 20 28 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c   ((VHandle*)pFil
3280: 65 29 2d 3e 70 56 46 69 6c 65 2d 3e 73 7a 3b 0a  e)->pVFile->sz;.
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 4c 6f 63 6b 28 73 71 6c 69 74   inmemLock(sqlit
32c0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
32d0: 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 72 65 74  int type){.  ret
32e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65  .static int inme
3300: 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mUnlock(sqlite3_
3310: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
3320: 20 74 79 70 65 29 7b 0a 20 20 72 65 74 75 72 6e   type){.  return
3330: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
3340: 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 43 68  atic int inmemCh
3350: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
3360: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
3370: 69 6c 65 2c 20 69 6e 74 20 2a 70 4f 75 74 29 7b  ile, int *pOut){
3380: 0a 20 20 2a 70 4f 75 74 20 3d 20 30 3b 0a 20 20  .  *pOut = 0;.  
3390: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33a0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69  ;.}.static int i
33b0: 6e 6d 65 6d 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  nmemFileControl(
33c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
33d0: 69 6c 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  ile, int op, voi
33e0: 64 20 2a 70 41 72 67 29 7b 0a 20 20 72 65 74 75  d *pArg){.  retu
33f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
3400: 4e 44 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  ND;.}.static int
3410: 20 69 6e 6d 65 6d 53 65 63 74 6f 72 53 69 7a 65   inmemSectorSize
3420: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
3430: 46 69 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  File){.  return 
3440: 35 31 32 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  512;.}.static in
3450: 74 20 69 6e 6d 65 6d 44 65 76 69 63 65 43 68 61  t inmemDeviceCha
3460: 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
3470: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
3480: 29 7b 0a 20 20 72 65 74 75 72 6e 0a 20 20 20 20  ){.  return.    
3490: 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
34a0: 41 46 45 5f 41 50 50 45 4e 44 20 7c 0a 20 20 20  AFE_APPEND |.   
34b0: 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
34c0: 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
34d0: 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 53 51  _OPEN |.      SQ
34e0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
34f0: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a  SAFE_OVERWRITE;.
3500: 7d 0a 0a 0a 2f 2a 20 4d 65 74 68 6f 64 20 74 61  }.../* Method ta
3510: 62 6c 65 20 66 6f 72 20 56 48 61 6e 64 6c 65 0a  ble for VHandle.
3520: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
3530: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 56 48 61  3_io_methods VHa
3540: 6e 64 6c 65 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  ndleMethods = {.
3550: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 20 2a    /* iVersion  *
3560: 2f 20 20 20 20 31 2c 0a 20 20 2f 2a 20 78 43 6c  /    1,.  /* xCl
3570: 6f 73 65 20 20 20 20 2a 2f 20 20 20 20 69 6e 6d  ose    */    inm
3580: 65 6d 43 6c 6f 73 65 2c 0a 20 20 2f 2a 20 78 52  emClose,.  /* xR
3590: 65 61 64 20 20 20 20 20 2a 2f 20 20 20 20 69 6e  ead     */    in
35a0: 6d 65 6d 52 65 61 64 2c 0a 20 20 2f 2a 20 78 57  memRead,.  /* xW
35b0: 72 69 74 65 20 20 20 20 2a 2f 20 20 20 20 69 6e  rite    */    in
35c0: 6d 65 6d 57 72 69 74 65 2c 0a 20 20 2f 2a 20 78  memWrite,.  /* x
35d0: 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 69  Truncate */    i
35e0: 6e 6d 65 6d 54 72 75 6e 63 61 74 65 2c 0a 20 20  nmemTruncate,.  
35f0: 2f 2a 20 78 53 79 6e 63 20 20 20 20 20 2a 2f 20  /* xSync     */ 
3600: 20 20 20 69 6e 6d 65 6d 53 79 6e 63 2c 0a 20 20     inmemSync,.  
3610: 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
3620: 20 20 20 69 6e 6d 65 6d 46 69 6c 65 53 69 7a 65     inmemFileSize
3630: 2c 0a 20 20 2f 2a 20 78 4c 6f 63 6b 20 20 20 20  ,.  /* xLock    
3640: 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 4c 6f 63 6b   */    inmemLock
3650: 2c 0a 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 20  ,.  /* xUnlock  
3660: 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 55 6e 6c 6f   */    inmemUnlo
3670: 63 6b 2c 0a 20 20 2f 2a 20 78 43 68 65 63 6b 2e  ck,.  /* xCheck.
3680: 2e 2e 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 43 68  .. */    inmemCh
3690: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
36a0: 0a 20 20 2f 2a 20 78 46 69 6c 65 43 74 72 6c 20  .  /* xFileCtrl 
36b0: 2a 2f 20 20 20 20 69 6e 6d 65 6d 46 69 6c 65 43  */    inmemFileC
36c0: 6f 6e 74 72 6f 6c 2c 0a 20 20 2f 2a 20 78 53 65  ontrol,.  /* xSe
36d0: 63 74 6f 72 53 7a 20 2a 2f 20 20 20 20 69 6e 6d  ctorSz */    inm
36e0: 65 6d 53 65 63 74 6f 72 53 69 7a 65 2c 0a 20 20  emSectorSize,.  
36f0: 2f 2a 20 78 44 65 76 63 68 61 72 20 20 2a 2f 20  /* xDevchar  */ 
3700: 20 20 20 69 6e 6d 65 6d 44 65 76 69 63 65 43 68     inmemDeviceCh
3710: 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 0a 20  aracteristics,. 
3720: 20 2f 2a 20 78 53 68 6d 4d 61 70 20 20 20 2a 2f   /* xShmMap   */
3730: 20 20 20 20 30 2c 0a 20 20 2f 2a 20 78 53 68 6d      0,.  /* xShm
3740: 4c 6f 63 6b 20 20 2a 2f 20 20 20 20 30 2c 0a 20  Lock  */    0,. 
3750: 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
3760: 2a 2f 20 20 30 2c 0a 20 20 2f 2a 20 78 53 68 6d  */  0,.  /* xShm
3770: 55 6e 6d 61 70 20 2a 2f 20 20 20 20 30 2c 0a 20  Unmap */    0,. 
3780: 20 2f 2a 20 78 46 65 74 63 68 20 20 20 20 2a 2f   /* xFetch    */
3790: 20 20 20 20 30 2c 0a 20 20 2f 2a 20 78 55 6e 66      0,.  /* xUnf
37a0: 65 74 63 68 20 20 2a 2f 20 20 20 20 30 0a 7d 3b  etch  */    0.};
37b0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
37c0: 65 77 20 66 69 6c 65 20 69 6e 20 74 68 65 20 69  ew file in the i
37d0: 6e 6d 65 6d 20 56 46 53 2e 20 20 41 6c 6c 20 66  nmem VFS.  All f
37e0: 69 6c 65 73 20 61 72 65 20 61 6e 6f 6e 79 6d 6f  iles are anonymo
37f0: 75 73 20 61 6e 64 20 61 72 65 0a 2a 2a 20 64 65  us and are.** de
3800: 6c 65 74 65 2d 6f 6e 2d 63 6c 6f 73 65 2e 0a 2a  lete-on-close..*
3810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d  /.static int inm
3820: 65 6d 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  emOpen(.  sqlite
3830: 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63  3_vfs *pVfs,.  c
3840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
3850: 6e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f  name,.  sqlite3_
3860: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69  file *pFile,.  i
3870: 6e 74 20 6f 70 65 6e 46 6c 61 67 73 2c 0a 20 20  nt openFlags,.  
3880: 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29  int *pOutFlags.)
3890: 7b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69 6c  {.  VFile *pVFil
38a0: 65 20 3d 20 63 72 65 61 74 65 56 46 69 6c 65 28  e = createVFile(
38b0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 28 75  zFilename, 0, (u
38c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 22 22  nsigned char*)""
38d0: 29 3b 0a 20 20 56 48 61 6e 64 6c 65 20 2a 70 48  );.  VHandle *pH
38e0: 61 6e 64 6c 65 20 3d 20 28 56 48 61 6e 64 6c 65  andle = (VHandle
38f0: 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  *)pFile;.  if( p
3900: 56 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  VFile==0 ){.    
3910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
3920: 4c 4c 3b 0a 20 20 7d 0a 20 20 70 48 61 6e 64 6c  LL;.  }.  pHandl
3930: 65 2d 3e 70 56 46 69 6c 65 20 3d 20 70 56 46 69  e->pVFile = pVFi
3940: 6c 65 3b 0a 20 20 70 56 46 69 6c 65 2d 3e 6e 52  le;.  pVFile->nR
3950: 65 66 2b 2b 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  ef++;.  pFile->p
3960: 4d 65 74 68 6f 64 73 20 3d 20 26 56 48 61 6e 64  Methods = &VHand
3970: 6c 65 4d 65 74 68 6f 64 73 3b 0a 20 20 69 66 28  leMethods;.  if(
3980: 20 70 4f 75 74 46 6c 61 67 73 20 29 20 2a 70 4f   pOutFlags ) *pO
3990: 75 74 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  utFlags = openFl
39a0: 61 67 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ags;.  return SQ
39b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
39c0: 2a 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65 20  * Delete a file 
39d0: 62 79 20 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69  by name.*/.stati
39e0: 63 20 69 6e 74 20 69 6e 6d 65 6d 44 65 6c 65 74  c int inmemDelet
39f0: 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
3a00: 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20   *pVfs,.  const 
3a10: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
3a20: 0a 20 20 69 6e 74 20 73 79 6e 63 64 69 72 0a 29  .  int syncdir.)
3a30: 7b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46 69 6c  {.  VFile *pVFil
3a40: 65 20 3d 20 66 69 6e 64 56 46 69 6c 65 28 7a 46  e = findVFile(zF
3a50: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
3a60: 70 56 46 69 6c 65 3d 3d 30 20 29 20 72 65 74 75  pVFile==0 ) retu
3a70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3a80: 69 66 28 20 70 56 46 69 6c 65 2d 3e 6e 52 65 66  if( pVFile->nRef
3a90: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ==0 ){.    free(
3aa0: 70 56 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d  pVFile->zFilenam
3ab0: 65 29 3b 0a 20 20 20 20 70 56 46 69 6c 65 2d 3e  e);.    pVFile->
3ac0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
3ad0: 20 20 20 70 56 46 69 6c 65 2d 3e 73 7a 20 3d 20     pVFile->sz = 
3ae0: 2d 31 3b 0a 20 20 20 20 66 72 65 65 28 70 56 46  -1;.    free(pVF
3af0: 69 6c 65 2d 3e 61 29 3b 0a 20 20 20 20 70 56 46  ile->a);.    pVF
3b00: 69 6c 65 2d 3e 61 20 3d 20 30 3b 0a 20 20 20 20  ile->a = 0;.    
3b10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3b20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
3b30: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
3b40: 54 45 3b 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20  TE;.}../* Check 
3b50: 66 6f 72 20 74 68 65 20 65 78 69 73 74 61 6e 63  for the existanc
3b60: 65 20 6f 66 20 61 20 66 69 6c 65 0a 2a 2f 0a 73  e of a file.*/.s
3b70: 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 41  tatic int inmemA
3b80: 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
3b90: 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f  _vfs *pVfs,.  co
3ba0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
3bb0: 61 6d 65 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73  ame,.  int flags
3bc0: 2c 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ,.  int *pResOut
3bd0: 0a 29 7b 0a 20 20 56 46 69 6c 65 20 2a 70 56 46  .){.  VFile *pVF
3be0: 69 6c 65 20 3d 20 66 69 6e 64 56 46 69 6c 65 28  ile = findVFile(
3bf0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 70  zFilename);.  *p
3c00: 52 65 73 4f 75 74 20 3d 20 20 70 56 46 69 6c 65  ResOut =  pVFile
3c10: 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  !=0;.  return SQ
3c20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 47  LITE_OK;.}../* G
3c30: 65 74 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  et the canonical
3c40: 20 70 61 74 68 6e 61 6d 65 20 66 6f 72 20 61 20   pathname for a 
3c50: 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  file.*/.static i
3c60: 6e 74 20 69 6e 6d 65 6d 46 75 6c 6c 50 61 74 68  nt inmemFullPath
3c70: 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  name(.  sqlite3_
3c80: 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63 6f 6e  vfs *pVfs,.  con
3c90: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
3ca0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 0a  me,.  int nOut,.
3cb0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a    char *zOut.){.
3cc0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
3cd0: 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22  tf(nOut, zOut, "
3ce0: 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  %s", zFilename);
3cf0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3d00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 47 65 74 4c 61  _OK;.}../* GetLa
3d10: 73 74 45 72 72 6f 72 28 29 20 69 73 20 6e 65 76  stError() is nev
3d20: 65 72 20 75 73 65 64 20 2a 2f 0a 73 74 61 74 69  er used */.stati
3d30: 63 20 69 6e 74 20 69 6e 6d 65 6d 47 65 74 4c 61  c int inmemGetLa
3d40: 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
3d50: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
3d60: 2c 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 72 65  , char *z){.  re
3d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
3d90: 72 20 74 68 65 20 56 46 53 20 74 68 61 74 20 72  r the VFS that r
3da0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 67 2e  eads from the g.
3db0: 61 46 69 6c 65 5b 5d 20 73 65 74 20 6f 66 20 66  aFile[] set of f
3dc0: 69 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iles..*/.static 
3dd0: 76 6f 69 64 20 69 6e 6d 65 6d 56 66 73 52 65 67  void inmemVfsReg
3de0: 69 73 74 65 72 28 76 6f 69 64 29 7b 0a 20 20 73  ister(void){.  s
3df0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
3e00: 73 20 69 6e 6d 65 6d 56 66 73 3b 0a 20 20 73 71  s inmemVfs;.  sq
3e10: 6c 69 74 65 33 5f 76 66 73 20 2a 70 44 65 66 61  lite3_vfs *pDefa
3e20: 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ult = sqlite3_vf
3e30: 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 6e 6d  s_find(0);.  inm
3e40: 65 6d 56 66 73 2e 69 56 65 72 73 69 6f 6e 20 3d  emVfs.iVersion =
3e50: 20 31 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 73   1;.  inmemVfs.s
3e60: 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f 66  zOsFile = sizeof
3e70: 28 56 48 61 6e 64 6c 65 29 3b 0a 20 20 69 6e 6d  (VHandle);.  inm
3e80: 65 6d 56 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  emVfs.mxPathname
3e90: 20 3d 20 32 30 30 3b 0a 20 20 69 6e 6d 65 6d 56   = 200;.  inmemV
3ea0: 66 73 2e 7a 4e 61 6d 65 20 3d 20 22 69 6e 6d 65  fs.zName = "inme
3eb0: 6d 22 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78  m";.  inmemVfs.x
3ec0: 4f 70 65 6e 20 3d 20 69 6e 6d 65 6d 4f 70 65 6e  Open = inmemOpen
3ed0: 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78 44 65  ;.  inmemVfs.xDe
3ee0: 6c 65 74 65 20 3d 20 69 6e 6d 65 6d 44 65 6c 65  lete = inmemDele
3ef0: 74 65 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78  te;.  inmemVfs.x
3f00: 41 63 63 65 73 73 20 3d 20 69 6e 6d 65 6d 41 63  Access = inmemAc
3f10: 63 65 73 73 3b 0a 20 20 69 6e 6d 65 6d 56 66 73  cess;.  inmemVfs
3f20: 2e 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  .xFullPathname =
3f30: 20 69 6e 6d 65 6d 46 75 6c 6c 50 61 74 68 6e 61   inmemFullPathna
3f40: 6d 65 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78  me;.  inmemVfs.x
3f50: 52 61 6e 64 6f 6d 6e 65 73 73 20 3d 20 70 44 65  Randomness = pDe
3f60: 66 61 75 6c 74 2d 3e 78 52 61 6e 64 6f 6d 6e 65  fault->xRandomne
3f70: 73 73 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78  ss;.  inmemVfs.x
3f80: 53 6c 65 65 70 20 3d 20 70 44 65 66 61 75 6c 74  Sleep = pDefault
3f90: 2d 3e 78 53 6c 65 65 70 3b 0a 20 20 69 6e 6d 65  ->xSleep;.  inme
3fa0: 6d 56 66 73 2e 78 43 75 72 72 65 6e 74 54 69 6d  mVfs.xCurrentTim
3fb0: 65 20 3d 20 70 44 65 66 61 75 6c 74 2d 3e 78 43  e = pDefault->xC
3fc0: 75 72 72 65 6e 74 54 69 6d 65 3b 0a 20 20 69 6e  urrentTime;.  in
3fd0: 6d 65 6d 56 66 73 2e 78 47 65 74 4c 61 73 74 45  memVfs.xGetLastE
3fe0: 72 72 6f 72 20 3d 20 69 6e 6d 65 6d 47 65 74 4c  rror = inmemGetL
3ff0: 61 73 74 45 72 72 6f 72 3b 0a 20 20 73 71 6c 69  astError;.  sqli
4000: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
4010: 28 26 69 6e 6d 65 6d 56 66 73 2c 20 30 29 3b 0a  (&inmemVfs, 0);.
4020: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65  };../*.** Allowe
4030: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  d values for the
4040: 20 72 75 6e 46 6c 61 67 73 20 70 61 72 61 6d 65   runFlags parame
4050: 74 65 72 20 74 6f 20 72 75 6e 53 71 6c 28 29 0a  ter to runSql().
4060: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 54  */.#define SQL_T
4070: 52 41 43 45 20 20 30 78 30 30 30 31 20 20 20 20  RACE  0x0001    
4080: 20 2f 2a 20 50 72 69 6e 74 20 65 61 63 68 20 53   /* Print each S
4090: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 73 20  QL statement as 
40a0: 69 74 20 69 73 20 70 72 65 70 61 72 65 64 20 2a  it is prepared *
40b0: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 5f 4f 55  /.#define SQL_OU
40c0: 54 50 55 54 20 30 78 30 30 30 32 20 20 20 20 20  TPUT 0x0002     
40d0: 2f 2a 20 53 68 6f 77 20 74 68 65 20 53 51 4c 20  /* Show the SQL 
40e0: 6f 75 74 70 75 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  output */../*.**
40f0: 20 52 75 6e 20 6d 75 6c 74 69 70 6c 65 20 63 6f   Run multiple co
4100: 6d 6d 61 6e 64 73 20 6f 66 20 53 51 4c 2e 20 20  mmands of SQL.  
4110: 53 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  Similar to sqlit
4120: 65 33 5f 65 78 65 63 28 29 2c 20 62 75 74 20 64  e3_exec(), but d
4130: 6f 65 73 20 6e 6f 74 0a 2a 2a 20 73 74 6f 70 20  oes not.** stop 
4140: 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
4150: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73  ncountered..*/.s
4160: 74 61 74 69 63 20 76 6f 69 64 20 72 75 6e 53 71  tatic void runSq
4170: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
4180: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
4190: 20 75 6e 73 69 67 6e 65 64 20 20 72 75 6e 46 6c   unsigned  runFl
41a0: 61 67 73 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  ags){.  const ch
41b0: 61 72 20 2a 7a 4d 6f 72 65 3b 0a 20 20 73 71 6c  ar *zMore;.  sql
41c0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
41d0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c  ;..  while( zSql
41e0: 20 26 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20   && zSql[0] ){. 
41f0: 20 20 20 7a 4d 6f 72 65 20 3d 20 30 3b 0a 20 20     zMore = 0;.  
4200: 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
4210: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
4220: 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
4230: 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4d 6f 72 65  , &pStmt, &zMore
4240: 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 6f 72 65  );.    if( zMore
4250: 3d 3d 7a 53 71 6c 20 29 20 62 72 65 61 6b 3b 0a  ==zSql ) break;.
4260: 20 20 20 20 69 66 28 20 72 75 6e 46 6c 61 67 73      if( runFlags
4270: 20 26 20 53 51 4c 5f 54 52 41 43 45 20 29 7b 0a   & SQL_TRACE ){.
4280: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
4290: 20 2a 7a 20 3d 20 7a 53 71 6c 3b 0a 20 20 20 20   *z = zSql;.    
42a0: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 77    int n;.      w
42b0: 68 69 6c 65 28 20 7a 3c 7a 4d 6f 72 65 20 26 26  hile( z<zMore &&
42c0: 20 69 73 73 70 61 63 65 28 7a 5b 30 5d 29 20 29   isspace(z[0]) )
42d0: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 6e 20 3d 20   z++;.      n = 
42e0: 28 69 6e 74 29 28 7a 4d 6f 72 65 20 2d 20 7a 29  (int)(zMore - z)
42f0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  ;.      while( n
4300: 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  >0 && isspace(z[
4310: 6e 2d 31 5d 29 20 29 20 6e 2d 2d 3b 0a 20 20 20  n-1]) ) n--;.   
4320: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 62 72     if( n==0 ) br
4330: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
4340: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Stmt==0 ){.     
4350: 20 20 20 70 72 69 6e 74 66 28 22 54 52 41 43 45     printf("TRACE
4360: 3a 20 25 2e 2a 73 20 28 65 72 72 6f 72 3a 20 25  : %.*s (error: %
4370: 73 29 5c 6e 22 2c 20 6e 2c 20 7a 2c 20 73 71 6c  s)\n", n, z, sql
4380: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
4390: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
43a0: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 54         printf("T
43b0: 52 41 43 45 3a 20 25 2e 2a 73 5c 6e 22 2c 20 6e  RACE: %.*s\n", n
43c0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , z);.      }.  
43d0: 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 7a    }.    zSql = z
43e0: 4d 6f 72 65 3b 0a 20 20 20 20 69 66 28 20 70 53  More;.    if( pS
43f0: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tmt ){.      if(
4400: 20 28 72 75 6e 46 6c 61 67 73 20 26 20 53 51 4c   (runFlags & SQL
4410: 5f 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b 0a 20  _OUTPUT)==0 ){. 
4420: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51         while( SQ
4430: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
4440: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
4450: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
4460: 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20         int nCol 
4470: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 77 68  = -1;.        wh
4480: 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
4490: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
44a0: 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tmt) ){.        
44b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
44c0: 20 20 20 69 66 28 20 6e 43 6f 6c 3c 30 20 29 7b     if( nCol<0 ){
44d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
44e0: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
44f0: 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b  mn_count(pStmt);
4500: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
4510: 20 69 66 28 20 6e 43 6f 6c 3e 30 20 29 7b 0a 20   if( nCol>0 ){. 
4520: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
4530: 66 28 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  f("-------------
4540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
4560: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n");.          }
4570: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
4580: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
4590: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
45a0: 74 20 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65  t eType = sqlite
45b0: 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
45c0: 74 6d 74 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  tmt,i);.        
45d0: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 20 3d      printf("%s =
45e0: 20 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ", sqlite3_colu
45f0: 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  mn_name(pStmt,i)
4600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
4610: 77 69 74 63 68 28 20 65 54 79 70 65 20 29 7b 0a  witch( eType ){.
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
4630: 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
4640: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4650: 20 20 70 72 69 6e 74 66 28 22 4e 55 4c 4c 5c 6e    printf("NULL\n
4660: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
4670: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4680: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4690: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
46a0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 70 72 69 6e 74 66 28 22 49 4e 54 20 25 73 5c 6e  printf("INT %s\n
46d0: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
46e0: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 69 29 29  n_text(pStmt,i))
46f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4700: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4710: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4720: 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
4730: 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
4740: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
4750: 74 66 28 22 46 4c 4f 41 54 20 25 73 5c 6e 22 2c  tf("FLOAT %s\n",
4760: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
4770: 74 65 78 74 28 70 53 74 6d 74 2c 69 29 29 3b 0a  text(pStmt,i));.
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
47a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
47b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
47c0: 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20  _TEXT: {.       
47d0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
47e0: 22 54 45 58 54 20 5b 25 73 5d 5c 6e 22 2c 20 73  "TEXT [%s]\n", s
47f0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
4800: 78 74 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20 20  xt(pStmt,i));.  
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
4820: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
4830: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4840: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
4850: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  LOB: {.         
4860: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 42         printf("B
4870: 4c 4f 42 20 28 25 64 20 62 79 74 65 73 29 5c 6e  LOB (%d bytes)\n
4880: 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
4890: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 69 29  n_bytes(pStmt,i)
48a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
48b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
48c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
48d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
48e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
48f0: 20 20 20 20 7d 20 20 20 20 20 20 20 20 20 0a 20      }         . 
4900: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
4910: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
4920: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4930: 20 52 65 62 75 69 6c 64 20 74 68 65 20 64 61 74   Rebuild the dat
4940: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
4950: 2a 20 20 20 20 28 31 29 20 20 52 65 6d 6f 76 65  *    (1)  Remove
4960: 20 64 75 70 6c 69 63 61 74 65 20 65 6e 74 72 69   duplicate entri
4970: 65 73 0a 2a 2a 20 20 20 20 28 32 29 20 20 50 75  es.**    (2)  Pu
4980: 74 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  t all entries in
4990: 20 6f 72 64 65 72 0a 2a 2a 20 20 20 20 28 33 29   order.**    (3)
49a0: 20 20 56 61 63 75 75 6d 0a 2a 2f 0a 73 74 61 74    Vacuum.*/.stat
49b0: 69 63 20 76 6f 69 64 20 72 65 62 75 69 6c 64 5f  ic void rebuild_
49c0: 64 61 74 61 62 61 73 65 28 73 71 6c 69 74 65 33  database(sqlite3
49d0: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b   *db){.  int rc;
49e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
49f0: 65 78 65 63 28 64 62 2c 20 0a 20 20 20 20 20 22  exec(db, .     "
4a00: 42 45 47 49 4e 3b 5c 6e 22 0a 20 20 20 20 20 22  BEGIN;\n".     "
4a10: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
4a20: 45 20 64 62 78 20 41 53 20 53 45 4c 45 43 54 20  E dbx AS SELECT 
4a30: 44 49 53 54 49 4e 43 54 20 64 62 63 6f 6e 74 65  DISTINCT dbconte
4a40: 6e 74 20 46 52 4f 4d 20 64 62 3b 5c 6e 22 0a 20  nt FROM db;\n". 
4a50: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
4a60: 20 64 62 3b 5c 6e 22 0a 20 20 20 20 20 22 49 4e   db;\n".     "IN
4a70: 53 45 52 54 20 49 4e 54 4f 20 64 62 28 64 62 69  SERT INTO db(dbi
4a80: 64 2c 20 64 62 63 6f 6e 74 65 6e 74 29 20 53 45  d, dbcontent) SE
4a90: 4c 45 43 54 20 4e 55 4c 4c 2c 20 64 62 63 6f 6e  LECT NULL, dbcon
4aa0: 74 65 6e 74 20 46 52 4f 4d 20 64 62 78 20 4f 52  tent FROM dbx OR
4ab0: 44 45 52 20 42 59 20 32 3b 5c 6e 22 0a 20 20 20  DER BY 2;\n".   
4ac0: 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 64 62    "DROP TABLE db
4ad0: 78 3b 5c 6e 22 0a 20 20 20 20 20 22 43 52 45 41  x;\n".     "CREA
4ae0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 73 78  TE TEMP TABLE sx
4af0: 20 41 53 20 53 45 4c 45 43 54 20 44 49 53 54 49   AS SELECT DISTI
4b00: 4e 43 54 20 73 71 6c 74 65 78 74 20 46 52 4f 4d  NCT sqltext FROM
4b10: 20 78 73 71 6c 3b 5c 6e 22 0a 20 20 20 20 20 22   xsql;\n".     "
4b20: 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 73 71 6c  DELETE FROM xsql
4b30: 3b 5c 6e 22 0a 20 20 20 20 20 22 49 4e 53 45 52  ;\n".     "INSER
4b40: 54 20 49 4e 54 4f 20 78 73 71 6c 28 73 71 6c 69  T INTO xsql(sqli
4b50: 64 2c 73 71 6c 74 65 78 74 29 20 53 45 4c 45 43  d,sqltext) SELEC
4b60: 54 20 4e 55 4c 4c 2c 20 73 71 6c 74 65 78 74 20  T NULL, sqltext 
4b70: 46 52 4f 4d 20 73 78 20 4f 52 44 45 52 20 42 59  FROM sx ORDER BY
4b80: 20 32 3b 5c 6e 22 0a 20 20 20 20 20 22 44 52 4f   2;\n".     "DRO
4b90: 50 20 54 41 42 4c 45 20 73 78 3b 5c 6e 22 0a 20  P TABLE sx;\n". 
4ba0: 20 20 20 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 0a      "COMMIT;\n".
4bb0: 20 20 20 20 20 22 50 52 41 47 4d 41 20 70 61 67       "PRAGMA pag
4bc0: 65 5f 73 69 7a 65 3d 31 30 32 34 3b 5c 6e 22 0a  e_size=1024;\n".
4bd0: 20 20 20 20 20 22 56 41 43 55 55 4d 3b 5c 6e 22       "VACUUM;\n"
4be0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
4bf0: 28 20 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f  ( rc ) fatalErro
4c00: 72 28 22 63 61 6e 6e 6f 74 20 72 65 62 75 69 6c  r("cannot rebuil
4c10: 64 3a 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  d: %s", sqlite3_
4c20: 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 7d 0a 0a  errmsg(db));.}..
4c30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4c40: 20 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61   value of a hexa
4c50: 64 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20  decimal digit.  
4c60: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
4c70: 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74   input.** is not
4c80: 20 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f   a hex digit..*/
4c90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44  .static int hexD
4ca0: 69 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63  igitValue(char c
4cb0: 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20  ){.  if( c>='0' 
4cc0: 26 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75  && c<='9' ) retu
4cd0: 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66  rn c - '0';.  if
4ce0: 28 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27  ( c>='a' && c<='
4cf0: 66 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20  f' ) return c - 
4d00: 27 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20  'a' + 10;.  if( 
4d10: 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27  c>='A' && c<='F'
4d20: 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41   ) return c - 'A
4d30: 27 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e  ' + 10;.  return
4d40: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   -1;.}../*.** In
4d50: 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20  terpret zArg as 
4d60: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
4d70: 2c 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20  , possibly with 
4d80: 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61  suffixes..*/.sta
4d90: 74 69 63 20 69 6e 74 20 69 6e 74 65 67 65 72 56  tic int integerV
4da0: 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20  alue(const char 
4db0: 2a 7a 41 72 67 29 7b 0a 20 20 73 71 6c 69 74 65  *zArg){.  sqlite
4dc0: 33 5f 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20  3_int64 v = 0;. 
4dd0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
4de0: 72 75 63 74 20 7b 20 63 68 61 72 20 2a 7a 53 75  ruct { char *zSu
4df0: 66 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b  ffix; int iMult;
4e00: 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20   } aMult[] = {. 
4e10: 20 20 20 7b 20 22 4b 69 42 22 2c 20 31 30 32 34     { "KiB", 1024
4e20: 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c   },.    { "MiB",
4e30: 20 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20   1024*1024 },.  
4e40: 20 20 7b 20 22 47 69 42 22 2c 20 31 30 32 34 2a    { "GiB", 1024*
4e50: 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20  1024*1024 },.   
4e60: 20 7b 20 22 4b 42 22 2c 20 20 31 30 30 30 20 7d   { "KB",  1000 }
4e70: 2c 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20 20 31  ,.    { "MB",  1
4e80: 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
4e90: 22 47 42 22 2c 20 20 31 30 30 30 30 30 30 30 30  "GB",  100000000
4ea0: 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20  0 },.    { "K", 
4eb0: 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20    1000 },.    { 
4ec0: 22 4d 22 2c 20 20 20 31 30 30 30 30 30 30 20 7d  "M",   1000000 }
4ed0: 2c 0a 20 20 20 20 7b 20 22 47 22 2c 20 20 20 31  ,.    { "G",   1
4ee0: 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d  000000000 },.  }
4ef0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
4f00: 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66   isNeg = 0;.  if
4f10: 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29  ( zArg[0]=='-' )
4f20: 7b 0a 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b  {.    isNeg = 1;
4f30: 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d  .    zArg++;.  }
4f40: 65 6c 73 65 20 69 66 28 20 7a 41 72 67 5b 30 5d  else if( zArg[0]
4f50: 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72  =='+' ){.    zAr
4f60: 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  g++;.  }.  if( z
4f70: 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a  Arg[0]=='0' && z
4f80: 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20  Arg[1]=='x' ){. 
4f90: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41     int x;.    zA
4fa0: 72 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69  rg += 2;.    whi
4fb0: 6c 65 28 20 28 78 20 3d 20 68 65 78 44 69 67 69  le( (x = hexDigi
4fc0: 74 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29  tValue(zArg[0]))
4fd0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  >=0 ){.      v =
4fe0: 20 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20   (v<<4) + x;.   
4ff0: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d     zArg++;.    }
5000: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
5010: 69 6c 65 28 20 69 73 64 69 67 69 74 28 7a 41 72  ile( isdigit(zAr
5020: 67 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 76  g[0]) ){.      v
5030: 20 3d 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30   = v*10 + zArg[0
5040: 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a  ] - '0';.      z
5050: 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Arg++;.    }.  }
5060: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
5070: 7a 65 6f 66 28 61 4d 75 6c 74 29 2f 73 69 7a 65  zeof(aMult)/size
5080: 6f 66 28 61 4d 75 6c 74 5b 30 5d 29 3b 20 69 2b  of(aMult[0]); i+
5090: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
50a0: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c  te3_stricmp(aMul
50b0: 74 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41  t[i].zSuffix, zA
50c0: 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rg)==0 ){.      
50d0: 76 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d  v *= aMult[i].iM
50e0: 75 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ult;.      break
50f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
5100: 28 20 76 3e 30 78 37 66 66 66 66 66 66 66 20 29  ( v>0x7fffffff )
5110: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 70 61 72   fatalError("par
5120: 61 6d 65 74 65 72 20 74 6f 6f 20 6c 61 72 67 65  ameter too large
5130: 20 2d 20 6d 61 78 20 32 31 34 37 34 38 33 36 34   - max 214748364
5140: 38 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  8");.  return (i
5150: 6e 74 29 28 69 73 4e 65 67 3f 20 2d 76 20 3a 20  nt)(isNeg? -v : 
5160: 76 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  v);.}../*.** Pri
5170: 6e 74 20 73 6b 65 74 63 68 79 20 64 6f 63 75 6d  nt sketchy docum
5180: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  entation for thi
5190: 73 20 75 74 69 6c 69 74 79 20 70 72 6f 67 72 61  s utility progra
51a0: 6d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  m.*/.static void
51b0: 20 73 68 6f 77 48 65 6c 70 28 76 6f 69 64 29 7b   showHelp(void){
51c0: 0a 20 20 70 72 69 6e 74 66 28 22 55 73 61 67 65  .  printf("Usage
51d0: 3a 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 53  : %s [options] S
51e0: 4f 55 52 43 45 2d 44 42 20 3f 41 52 47 53 2e 2e  OURCE-DB ?ARGS..
51f0: 2e 3f 5c 6e 22 2c 20 67 2e 7a 41 72 67 76 30 29  .?\n", g.zArgv0)
5200: 3b 0a 20 20 70 72 69 6e 74 66 28 0a 22 52 65 61  ;.  printf(."Rea
5210: 64 20 64 61 74 61 62 61 73 65 73 20 61 6e 64 20  d databases and 
5220: 53 51 4c 20 73 63 72 69 70 74 73 20 66 72 6f 6d  SQL scripts from
5230: 20 53 4f 55 52 43 45 2d 44 42 20 61 6e 64 20 65   SOURCE-DB and e
5240: 78 65 63 75 74 65 20 65 61 63 68 20 73 63 72 69  xecute each scri
5250: 70 74 20 61 67 61 69 6e 73 74 5c 6e 22 0a 22 65  pt against\n"."e
5260: 61 63 68 20 64 61 74 61 62 61 73 65 2c 20 63 68  ach database, ch
5270: 65 63 6b 69 6e 67 20 66 6f 72 20 63 72 61 73 68  ecking for crash
5280: 65 73 20 61 6e 64 20 6d 65 6d 6f 72 79 20 6c 65  es and memory le
5290: 61 6b 73 2e 5c 6e 22 0a 22 4f 70 74 69 6f 6e 73  aks.\n"."Options
52a0: 3a 5c 6e 22 0a 22 20 20 2d 2d 63 65 6c 6c 2d 73  :\n"."  --cell-s
52b0: 69 7a 65 2d 63 68 65 63 6b 20 20 20 20 20 53 65  ize-check     Se
52c0: 74 20 74 68 65 20 50 52 41 47 4d 41 20 63 65 6c  t the PRAGMA cel
52d0: 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 5c  l_size_check=ON\
52e0: 6e 22 0a 22 20 20 2d 2d 64 62 69 64 20 4e 20 20  n"."  --dbid N  
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20              Use 
5300: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 62 61 73  only the databas
5310: 65 20 77 68 65 72 65 20 64 62 69 64 3d 4e 5c 6e  e where dbid=N\n
5320: 22 0a 22 20 20 2d 2d 65 78 70 6f 72 74 2d 64 62  "."  --export-db
5330: 20 44 49 52 20 20 20 20 20 20 20 57 72 69 74 65   DIR       Write
5340: 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 66 69   databases to fi
5350: 6c 65 73 28 73 29 20 69 6e 20 44 49 52 2e 20 57  les(s) in DIR. W
5360: 6f 72 6b 73 20 77 69 74 68 20 2d 2d 64 62 69 64  orks with --dbid
5370: 5c 6e 22 0a 22 20 20 2d 2d 65 78 70 6f 72 74 2d  \n"."  --export-
5380: 73 71 6c 20 44 49 52 20 20 20 20 20 20 57 72 69  sql DIR      Wri
5390: 74 65 20 53 51 4c 20 74 6f 20 66 69 6c 65 28 73  te SQL to file(s
53a0: 29 20 69 6e 20 44 49 52 2e 20 41 6c 73 6f 20 77  ) in DIR. Also w
53b0: 6f 72 6b 73 20 77 69 74 68 20 2d 2d 73 71 6c 69  orks with --sqli
53c0: 64 5c 6e 22 0a 22 20 20 2d 2d 68 65 6c 70 20 20  d\n"."  --help  
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
53e0: 6f 77 20 74 68 69 73 20 68 65 6c 70 20 74 65 78  ow this help tex
53f0: 74 5c 6e 22 0a 22 20 20 2d 71 20 20 20 20 20 20  t\n"."  -q      
5400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 52 65                Re
5410: 64 75 63 65 64 20 6f 75 74 70 75 74 5c 6e 22 0a  duced output\n".
5420: 22 20 20 2d 2d 71 75 69 65 74 20 20 20 20 20 20  "  --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 20 20 20 20 20 20 20 20 20 20 20  "  -v           
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 5c 6e 22 0a 22 20 20  ed output\n"."  
5750: 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20 20  --verbose       
5760: 20 20 20 20 20 20 49 6e 63 72 65 61 73 65 64 20        Increased 
5770: 6f 75 74 70 75 74 5c 6e 22 0a 20 20 29 3b 0a 7d  output\n".  );.}
5780: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
5790: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
57a0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
57b0: 36 34 20 69 42 65 67 69 6e 3b 20 20 20 20 20 20  64 iBegin;      
57c0: 20 20 2f 2a 20 53 74 61 72 74 20 74 69 6d 65 20    /* Start time 
57d0: 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 20  of this program 
57e0: 2a 2f 0a 20 20 69 6e 74 20 71 75 69 65 74 46 6c  */.  int quietFl
57f0: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
5800: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 71    /* True if --q
5810: 75 69 65 74 20 6f 72 20 2d 71 20 2a 2f 0a 20 20  uiet or -q */.  
5820: 69 6e 74 20 76 65 72 62 6f 73 65 46 6c 61 67 20  int verboseFlag 
5830: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
5840: 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73  True if --verbos
5850: 65 20 6f 72 20 2d 76 20 2a 2f 0a 20 20 63 68 61  e or -v */.  cha
5860: 72 20 2a 7a 49 6e 73 53 71 6c 20 3d 20 30 3b 20  r *zInsSql = 0; 
5870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
5880: 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 2d   statement for -
5890: 2d 6c 6f 61 64 2d 64 62 20 6f 72 20 2d 2d 6c 6f  -load-db or --lo
58a0: 61 64 2d 73 71 6c 20 2a 2f 0a 20 20 69 6e 74 20  ad-sql */.  int 
58b0: 69 46 69 72 73 74 49 6e 73 41 72 67 20 3d 20 30  iFirstInsArg = 0
58c0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
58d0: 74 20 61 72 67 76 5b 5d 20 74 6f 20 75 73 65 20  t argv[] to use 
58e0: 66 6f 72 20 2d 2d 6c 6f 61 64 2d 64 62 20 6f 72  for --load-db or
58f0: 20 2d 2d 6c 6f 61 64 2d 73 71 6c 20 2a 2f 0a 20   --load-sql */. 
5900: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30   sqlite3 *db = 0
5910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
5920: 20 54 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   The open databa
5930: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
5940: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
5950: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
5960: 2f 2a 20 41 20 70 72 65 70 61 72 65 64 20 73 74  /* A prepared st
5970: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
5980: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
5990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
59a0: 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 53 51  ult code from SQ
59b0: 4c 69 74 65 20 69 6e 74 65 72 66 61 63 65 20 63  Lite interface c
59c0: 61 6c 6c 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a  alls */.  Blob *
59d0: 70 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pSql;           
59e0: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
59f0: 6f 70 69 6e 67 20 6f 76 65 72 20 53 51 4c 20 73  oping over SQL s
5a00: 63 72 69 70 74 73 20 2a 2f 0a 20 20 42 6c 6f 62  cripts */.  Blob
5a10: 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
5a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
5a30: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 65 6d  looping over tem
5a40: 70 6c 61 74 65 20 64 61 74 61 62 61 73 65 73 20  plate databases 
5a50: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 20 2f 2a 20 4c 6f 6f 70 20 69 6e 64 65 78 20    /* Loop index 
5a80: 66 6f 72 20 74 68 65 20 61 72 67 76 5b 5d 20 6c  for the argv[] l
5a90: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c  oop */.  int onl
5aa0: 79 53 71 6c 69 64 20 3d 20 2d 31 3b 20 20 20 20  ySqlid = -1;    
5ab0: 20 20 20 20 20 20 2f 2a 20 2d 2d 73 71 6c 69 64        /* --sqlid
5ac0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c 79 44 62   */.  int onlyDb
5ad0: 69 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  id = -1;        
5ae0: 20 20 20 2f 2a 20 2d 2d 64 62 69 64 20 2a 2f 0a     /* --dbid */.
5af0: 20 20 69 6e 74 20 6e 61 74 69 76 65 46 6c 61 67    int nativeFlag
5b00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
5b10: 2a 20 2d 2d 6e 61 74 69 76 65 2d 76 66 73 20 2a  * --native-vfs *
5b20: 2f 0a 20 20 69 6e 74 20 72 65 62 75 69 6c 64 46  /.  int rebuildF
5b30: 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lag = 0;        
5b40: 20 2f 2a 20 2d 2d 72 65 62 75 69 6c 64 20 2a 2f   /* --rebuild */
5b50: 0a 20 20 69 6e 74 20 76 64 62 65 4c 69 6d 69 74  .  int vdbeLimit
5b60: 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20  Flag = 0;       
5b70: 2f 2a 20 2d 2d 6c 69 6d 69 74 2d 76 64 62 65 20  /* --limit-vdbe 
5b80: 2a 2f 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  */.  int timeout
5b90: 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Test = 0;       
5ba0: 20 20 2f 2a 20 75 6e 64 6f 63 75 6d 65 6e 74 65    /* undocumente
5bb0: 64 20 2d 2d 74 69 6d 65 6f 75 74 2d 74 65 73 74  d --timeout-test
5bc0: 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 72   flag */.  int r
5bd0: 75 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  unFlags = 0;    
5be0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
5bf0: 20 73 65 6e 74 20 74 6f 20 72 75 6e 53 71 6c 28   sent to runSql(
5c00: 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 73  ) */.  char *zMs
5c10: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
5c20: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
5c30: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74  message */.  int
5c40: 20 6e 53 72 63 44 62 20 3d 20 30 3b 20 20 20 20   nSrcDb = 0;    
5c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5c60: 62 65 72 20 6f 66 20 73 6f 75 72 63 65 20 64 61  ber of source da
5c70: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 63 68 61  tabases */.  cha
5c80: 72 20 2a 2a 61 7a 53 72 63 44 62 20 3d 20 30 3b  r **azSrcDb = 0;
5c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
5ca0: 61 79 20 6f 66 20 73 6f 75 72 63 65 20 64 61 74  ay of source dat
5cb0: 61 62 61 73 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  abase names */. 
5cc0: 20 69 6e 74 20 69 53 72 63 44 62 3b 20 20 20 20   int iSrcDb;    
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ce0: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73   Loop over all s
5cf0: 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 73 20  ource databases 
5d00: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 73 74 20 3d  */.  int nTest =
5d10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5d20: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
5d30: 72 20 6f 66 20 74 65 73 74 73 20 70 65 72 66 6f  r of tests perfo
5d40: 72 6d 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rmed */.  char *
5d50: 7a 44 62 4e 61 6d 65 20 3d 20 22 22 3b 20 20 20  zDbName = "";   
5d60: 20 20 20 20 20 20 20 2f 2a 20 41 70 70 72 65 76         /* Apprev
5d70: 69 61 74 65 64 20 6e 61 6d 65 20 6f 66 20 61 20  iated name of a 
5d80: 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  source database 
5d90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5da0: 2a 7a 46 61 69 6c 43 6f 64 65 20 3d 20 30 3b 20  *zFailCode = 0; 
5db0: 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68    /* Value of th
5dc0: 65 20 54 45 53 54 5f 46 41 49 4c 55 52 45 20 65  e TEST_FAILURE e
5dd0: 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61  nvironment varia
5de0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ble */.  int cel
5df0: 6c 53 7a 43 6b 46 6c 61 67 20 3d 20 30 3b 20 20  lSzCkFlag = 0;  
5e00: 20 20 20 20 20 20 2f 2a 20 2d 2d 63 65 6c 6c 2d        /* --cell-
5e10: 73 69 7a 65 2d 63 68 65 63 6b 20 2a 2f 0a 20 20  size-check */.  
5e20: 69 6e 74 20 73 71 6c 46 75 7a 7a 20 3d 20 30 3b  int sqlFuzz = 0;
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5e40: 54 72 75 65 20 66 6f 72 20 53 51 4c 20 66 75 7a  True for SQL fuz
5e50: 7a 20 74 65 73 74 69 6e 67 2e 20 46 61 6c 73 65  z testing. False
5e60: 20 66 6f 72 20 44 42 20 66 75 7a 7a 20 2a 2f 0a   for DB fuzz */.
5e70: 20 20 69 6e 74 20 69 54 69 6d 65 6f 75 74 20 3d    int iTimeout =
5e80: 20 31 32 30 3b 20 20 20 20 20 20 20 20 20 20 2f   120;          /
5e90: 2a 20 44 65 66 61 75 6c 74 20 31 32 30 2d 73 65  * Default 120-se
5ea0: 63 6f 6e 64 20 74 69 6d 65 6f 75 74 20 2a 2f 0a  cond timeout */.
5eb0: 20 20 69 6e 74 20 6e 4d 65 6d 20 3d 20 30 3b 20    int nMem = 0; 
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5ed0: 2a 20 4d 65 6d 6f 72 79 20 6c 69 6d 69 74 20 2a  * Memory limit *
5ee0: 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 44 62  /.  char *zExpDb
5ef0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5f00: 20 2f 2a 20 57 72 69 74 65 20 44 61 74 61 62 61   /* Write Databa
5f10: 73 65 73 20 74 6f 20 66 69 6c 65 73 20 69 6e 20  ses to files in 
5f20: 74 68 69 73 20 64 69 72 65 63 74 6f 72 79 20 2a  this directory *
5f30: 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 53 71  /.  char *zExpSq
5f40: 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
5f50: 20 2f 2a 20 57 72 69 74 65 20 53 51 4c 20 74 6f   /* Write SQL to
5f60: 20 66 69 6c 65 73 20 69 6e 20 74 68 69 73 20 64   files in this d
5f70: 69 72 65 63 74 6f 72 79 20 2a 2f 0a 0a 20 20 69  irectory */..  i
5f80: 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61  Begin = timeOfDa
5f90: 79 28 29 3b 0a 23 69 66 64 65 66 20 5f 5f 75 6e  y();.#ifdef __un
5fa0: 69 78 5f 5f 0a 20 20 73 69 67 6e 61 6c 28 53 49  ix__.  signal(SI
5fb0: 47 41 4c 52 4d 2c 20 74 69 6d 65 6f 75 74 48 61  GALRM, timeoutHa
5fc0: 6e 64 6c 65 72 29 3b 0a 23 65 6e 64 69 66 0a 20  ndler);.#endif. 
5fd0: 20 67 2e 7a 41 72 67 76 30 20 3d 20 61 72 67 76   g.zArgv0 = argv
5fe0: 5b 30 5d 3b 0a 20 20 7a 46 61 69 6c 43 6f 64 65  [0];.  zFailCode
5ff0: 20 3d 20 67 65 74 65 6e 76 28 22 54 45 53 54 5f   = getenv("TEST_
6000: 46 41 49 4c 55 52 45 22 29 3b 0a 20 20 66 6f 72  FAILURE");.  for
6010: 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=1; i<argc; i+
6020: 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
6030: 61 72 20 2a 7a 20 3d 20 61 72 67 76 5b 69 5d 3b  ar *z = argv[i];
6040: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
6050: 2d 27 20 29 7b 0a 20 20 20 20 20 20 7a 2b 2b 3b  -' ){.      z++;
6060: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
6070: 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
6080: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
6090: 63 65 6c 6c 2d 73 69 7a 65 2d 63 68 65 63 6b 22  cell-size-check"
60a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
60b0: 63 65 6c 6c 53 7a 43 6b 46 6c 61 67 20 3d 20 31  cellSzCkFlag = 1
60c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
60d0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
60e0: 2c 22 64 62 69 64 22 29 3d 3d 30 20 29 7b 0a 20  ,"dbid")==0 ){. 
60f0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 61 72         if( i>=ar
6100: 67 63 2d 31 20 29 20 66 61 74 61 6c 45 72 72 6f  gc-1 ) fatalErro
6110: 72 28 22 6d 69 73 73 69 6e 67 20 61 72 67 75 6d  r("missing argum
6120: 65 6e 74 73 20 6f 6e 20 25 73 22 2c 20 61 72 67  ents on %s", arg
6130: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 6f  v[i]);.        o
6140: 6e 6c 79 44 62 69 64 20 3d 20 69 6e 74 65 67 65  nlyDbid = intege
6150: 72 56 61 6c 75 65 28 61 72 67 76 5b 2b 2b 69 5d  rValue(argv[++i]
6160: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  );.      }else. 
6170: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6180: 7a 2c 22 65 78 70 6f 72 74 2d 64 62 22 29 3d 3d  z,"export-db")==
6190: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
61a0: 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61 74   i>=argc-1 ) fat
61b0: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  alError("missing
61c0: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73   arguments on %s
61d0: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
61e0: 20 20 20 20 20 7a 45 78 70 44 62 20 3d 20 61 72       zExpDb = ar
61f0: 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 7d  gv[++i];.      }
6200: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
6210: 74 72 63 6d 70 28 7a 2c 22 65 78 70 6f 72 74 2d  trcmp(z,"export-
6220: 73 71 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  sql")==0 ){.    
6230: 20 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d      if( i>=argc-
6240: 31 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22  1 ) fatalError("
6250: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
6260: 73 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69  s on %s", argv[i
6270: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 78 70  ]);.        zExp
6280: 53 71 6c 20 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b  Sql = argv[++i];
6290: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
62a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
62b0: 22 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "help")==0 ){.  
62c0: 20 20 20 20 20 20 73 68 6f 77 48 65 6c 70 28 29        showHelp()
62d0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
62e0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a   0;.      }else.
62f0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
6300: 28 7a 2c 22 6c 69 6d 69 74 2d 6d 65 6d 22 29 3d  (z,"limit-mem")=
6310: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
6320: 28 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61  ( i>=argc-1 ) fa
6330: 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  talError("missin
6340: 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25  g arguments on %
6350: 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  s", argv[i]);.  
6360: 20 20 20 20 20 20 6e 4d 65 6d 20 3d 20 69 6e 74        nMem = int
6370: 65 67 65 72 56 61 6c 75 65 28 61 72 67 76 5b 2b  egerValue(argv[+
6380: 2b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +i]);.      }els
6390: 65 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  e.      if( strc
63a0: 6d 70 28 7a 2c 22 6c 69 6d 69 74 2d 76 64 62 65  mp(z,"limit-vdbe
63b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
63c0: 20 76 64 62 65 4c 69 6d 69 74 46 6c 61 67 20 3d   vdbeLimitFlag =
63d0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a   1;.      }else.
63e0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
63f0: 28 7a 2c 22 6c 6f 61 64 2d 73 71 6c 22 29 3d 3d  (z,"load-sql")==
6400: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 49 6e  0 ){.        zIn
6410: 73 53 71 6c 20 3d 20 22 49 4e 53 45 52 54 20 49  sSql = "INSERT I
6420: 4e 54 4f 20 78 73 71 6c 28 73 71 6c 74 65 78 74  NTO xsql(sqltext
6430: 29 20 56 41 4c 55 45 53 28 43 41 53 54 28 72 65  ) VALUES(CAST(re
6440: 61 64 66 69 6c 65 28 3f 31 29 20 41 53 20 74 65  adfile(?1) AS te
6450: 78 74 29 29 22 3b 0a 20 20 20 20 20 20 20 20 69  xt))";.        i
6460: 46 69 72 73 74 49 6e 73 41 72 67 20 3d 20 69 2b  FirstInsArg = i+
6470: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
6480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20  ;.      }else.  
6490: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
64a0: 2c 22 6c 6f 61 64 2d 64 62 22 29 3d 3d 30 20 29  ,"load-db")==0 )
64b0: 7b 0a 20 20 20 20 20 20 20 20 7a 49 6e 73 53 71  {.        zInsSq
64c0: 6c 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  l = "INSERT INTO
64d0: 20 64 62 28 64 62 63 6f 6e 74 65 6e 74 29 20 56   db(dbcontent) V
64e0: 41 4c 55 45 53 28 72 65 61 64 66 69 6c 65 28 3f  ALUES(readfile(?
64f0: 31 29 29 22 3b 0a 20 20 20 20 20 20 20 20 69 46  1))";.        iF
6500: 69 72 73 74 49 6e 73 41 72 67 20 3d 20 69 2b 31  irstInsArg = i+1
6510: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6520: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
6530: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
6540: 22 6d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  "m")==0 ){.     
6550: 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31     if( i>=argc-1
6560: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d   ) fatalError("m
6570: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73  issing arguments
6580: 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69 5d   on %s", argv[i]
6590: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  );.        zMsg 
65a0: 3d 20 61 72 67 76 5b 2b 2b 69 5d 3b 0a 20 20 20  = argv[++i];.   
65b0: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
65c0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 61 74  f( strcmp(z,"nat
65d0: 69 76 65 2d 76 66 73 22 29 3d 3d 30 20 29 7b 0a  ive-vfs")==0 ){.
65e0: 20 20 20 20 20 20 20 20 6e 61 74 69 76 65 46 6c          nativeFl
65f0: 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ag = 1;.      }e
6600: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
6610: 72 63 6d 70 28 7a 2c 22 71 75 69 65 74 22 29 3d  rcmp(z,"quiet")=
6620: 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22  =0 || strcmp(z,"
6630: 71 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  q")==0 ){.      
6640: 20 20 71 75 69 65 74 46 6c 61 67 20 3d 20 31 3b    quietFlag = 1;
6650: 0a 20 20 20 20 20 20 20 20 76 65 72 62 6f 73 65  .        verbose
6660: 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  Flag = 0;.      
6670: 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
6680: 73 74 72 63 6d 70 28 7a 2c 22 72 65 62 75 69 6c  strcmp(z,"rebuil
6690: 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  d")==0 ){.      
66a0: 20 20 72 65 62 75 69 6c 64 46 6c 61 67 20 3d 20    rebuildFlag = 
66b0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  1;.      }else. 
66c0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
66d0: 7a 2c 22 72 65 73 75 6c 74 2d 74 72 61 63 65 22  z,"result-trace"
66e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
66f0: 72 75 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c 5f  runFlags |= SQL_
6700: 4f 55 54 50 55 54 3b 0a 20 20 20 20 20 20 7d 65  OUTPUT;.      }e
6710: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
6720: 72 63 6d 70 28 7a 2c 22 73 71 6c 69 64 22 29 3d  rcmp(z,"sqlid")=
6730: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
6740: 28 20 69 3e 3d 61 72 67 63 2d 31 20 29 20 66 61  ( i>=argc-1 ) fa
6750: 74 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e  talError("missin
6760: 67 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 25  g arguments on %
6770: 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  s", argv[i]);.  
6780: 20 20 20 20 20 20 6f 6e 6c 79 53 71 6c 69 64 20        onlySqlid 
6790: 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  = integerValue(a
67a0: 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20  rgv[++i]);.     
67b0: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
67c0: 20 73 74 72 63 6d 70 28 7a 2c 22 74 69 6d 65 6f   strcmp(z,"timeo
67d0: 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ut")==0 ){.     
67e0: 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31     if( i>=argc-1
67f0: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d   ) fatalError("m
6800: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73  issing arguments
6810: 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69 5d   on %s", argv[i]
6820: 29 3b 0a 20 20 20 20 20 20 20 20 69 54 69 6d 65  );.        iTime
6830: 6f 75 74 20 3d 20 69 6e 74 65 67 65 72 56 61 6c  out = integerVal
6840: 75 65 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20  ue(argv[++i]);. 
6850: 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
6860: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 74   if( strcmp(z,"t
6870: 69 6d 65 6f 75 74 2d 74 65 73 74 22 29 3d 3d 30  imeout-test")==0
6880: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 69 6d 65   ){.        time
6890: 6f 75 74 54 65 73 74 20 3d 20 31 3b 0a 23 69 66  outTest = 1;.#if
68a0: 6e 64 65 66 20 5f 5f 75 6e 69 78 5f 5f 0a 20 20  ndef __unix__.  
68b0: 20 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72        fatalError
68c0: 28 22 74 69 6d 65 6f 75 74 20 69 73 20 6e 6f 74  ("timeout is not
68d0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 6e 6f   available on no
68e0: 6e 2d 75 6e 69 78 20 73 79 73 74 65 6d 73 22 29  n-unix systems")
68f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
6900: 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73  else.      if( s
6910: 74 72 63 6d 70 28 7a 2c 22 76 65 72 62 6f 73 65  trcmp(z,"verbose
6920: 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  ")==0 || strcmp(
6930: 7a 2c 22 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20  z,"v")==0 ){.   
6940: 20 20 20 20 20 71 75 69 65 74 46 6c 61 67 20 3d       quietFlag =
6950: 20 30 3b 0a 20 20 20 20 20 20 20 20 76 65 72 62   0;.        verb
6960: 6f 73 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20  oseFlag = 1;.   
6970: 20 20 20 20 20 72 75 6e 46 6c 61 67 73 20 7c 3d       runFlags |=
6980: 20 53 51 4c 5f 54 52 41 43 45 3b 0a 20 20 20 20   SQL_TRACE;.    
6990: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a    }else.      {.
69a0: 20 20 20 20 20 20 20 20 66 61 74 61 6c 45 72 72          fatalErr
69b0: 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  or("unknown opti
69c0: 6f 6e 3a 20 25 73 22 2c 20 61 72 67 76 5b 69 5d  on: %s", argv[i]
69d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
69e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 72 63  else{.      nSrc
69f0: 44 62 2b 2b 3b 0a 20 20 20 20 20 20 61 7a 53 72  Db++;.      azSr
6a00: 63 44 62 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c  cDb = safe_reall
6a10: 6f 63 28 61 7a 53 72 63 44 62 2c 20 6e 53 72 63  oc(azSrcDb, nSrc
6a20: 44 62 2a 73 69 7a 65 6f 66 28 61 7a 53 72 63 44  Db*sizeof(azSrcD
6a30: 62 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 61 7a  b[0]));.      az
6a40: 53 72 63 44 62 5b 6e 53 72 63 44 62 2d 31 5d 20  SrcDb[nSrcDb-1] 
6a50: 3d 20 61 72 67 76 5b 69 5d 3b 0a 20 20 20 20 7d  = argv[i];.    }
6a60: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53 72 63 44  .  }.  if( nSrcD
6a70: 62 3d 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f  b==0 ) fatalErro
6a80: 72 28 22 6e 6f 20 73 6f 75 72 63 65 20 64 61 74  r("no source dat
6a90: 61 62 61 73 65 20 73 70 65 63 69 66 69 65 64 22  abase specified"
6aa0: 29 3b 0a 20 20 69 66 28 20 6e 53 72 63 44 62 3e  );.  if( nSrcDb>
6ab0: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 4d 73  1 ){.    if( zMs
6ac0: 67 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c  g ){.      fatal
6ad0: 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 63 68  Error("cannot ch
6ae0: 61 6e 67 65 20 74 68 65 20 64 65 73 63 72 69 70  ange the descrip
6af0: 74 69 6f 6e 20 6f 66 20 6d 6f 72 65 20 74 68 61  tion of more tha
6b00: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 22 29  n one database")
6b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6b20: 7a 49 6e 73 53 71 6c 20 29 7b 0a 20 20 20 20 20  zInsSql ){.     
6b30: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e   fatalError("can
6b40: 6e 6f 74 20 69 6d 70 6f 72 74 20 69 6e 74 6f 20  not import into 
6b50: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
6b60: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 7d 0a  tabase");.    }.
6b70: 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
6b80: 73 20 65 61 63 68 20 73 6f 75 72 63 65 20 64 61  s each source da
6b90: 74 61 62 61 73 65 20 73 65 70 61 72 61 74 65 6c  tabase separatel
6ba0: 79 20 2a 2f 0a 20 20 66 6f 72 28 69 53 72 63 44  y */.  for(iSrcD
6bb0: 62 3d 30 3b 20 69 53 72 63 44 62 3c 6e 53 72 63  b=0; iSrcDb<nSrc
6bc0: 44 62 3b 20 69 53 72 63 44 62 2b 2b 29 7b 0a 20  Db; iSrcDb++){. 
6bd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6be0: 6f 70 65 6e 28 61 7a 53 72 63 44 62 5b 69 53 72  open(azSrcDb[iSr
6bf0: 63 44 62 5d 2c 20 26 64 62 29 3b 0a 20 20 20 20  cDb], &db);.    
6c00: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
6c10: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
6c20: 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65 20 64  ot open source d
6c30: 61 74 61 62 61 73 65 20 25 73 20 2d 20 25 73 22  atabase %s - %s"
6c40: 2c 0a 20 20 20 20 20 20 61 7a 53 72 63 44 62 5b  ,.      azSrcDb[
6c50: 69 53 72 63 44 62 5d 2c 20 73 71 6c 69 74 65 33  iSrcDb], sqlite3
6c60: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
6c70: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
6c80: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 0a 20 20  ite3_exec(db,.  
6c90: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
6ca0: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
6cb0: 20 64 62 28 5c 6e 22 0a 20 20 20 20 20 20 20 22   db(\n".       "
6cc0: 20 20 64 62 69 64 20 49 4e 54 45 47 45 52 20 50    dbid INTEGER P
6cd0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 2d 2d 20 64  RIMARY KEY, -- d
6ce0: 61 74 61 62 61 73 65 20 69 64 5c 6e 22 0a 20 20  atabase id\n".  
6cf0: 20 20 20 20 20 22 20 20 64 62 63 6f 6e 74 65 6e       "  dbconten
6d00: 74 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20 20  t BLOB          
6d10: 20 20 2d 2d 20 64 61 74 61 62 61 73 65 20 64 69    -- database di
6d20: 73 6b 20 66 69 6c 65 20 69 6d 61 67 65 5c 6e 22  sk file image\n"
6d30: 0a 20 20 20 20 20 20 20 22 29 3b 5c 6e 22 0a 20  .       ");\n". 
6d40: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
6d50: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
6d60: 53 20 78 73 71 6c 28 5c 6e 22 0a 20 20 20 20 20  S xsql(\n".     
6d70: 20 20 22 20 20 73 71 6c 69 64 20 49 4e 54 45 47    "  sqlid INTEG
6d80: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
6d90: 20 20 2d 2d 20 53 51 4c 20 73 63 72 69 70 74 20    -- SQL script 
6da0: 69 64 5c 6e 22 0a 20 20 20 20 20 20 20 22 20 20  id\n".       "  
6db0: 73 71 6c 74 65 78 74 20 54 45 58 54 20 20 20 20  sqltext TEXT    
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
6dd0: 54 65 78 74 20 6f 66 20 53 51 4c 20 73 74 61 74  Text of SQL stat
6de0: 65 6d 65 6e 74 73 20 74 6f 20 72 75 6e 5c 6e 22  ements to run\n"
6df0: 0a 20 20 20 20 20 20 20 22 29 3b 22 0a 20 20 20  .       ");".   
6e00: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
6e10: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
6e20: 72 65 61 64 6d 65 28 5c 6e 22 0a 20 20 20 20 20  readme(\n".     
6e30: 20 20 22 20 20 6d 73 67 20 54 45 58 54 20 2d 2d    "  msg TEXT --
6e40: 20 48 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   Human-readable 
6e50: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
6e60: 68 69 73 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20  his file\n".    
6e70: 20 20 20 22 29 3b 22 2c 20 30 2c 20 30 2c 20 30     ");", 0, 0, 0
6e80: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
6e90: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
6ea0: 6f 74 20 63 72 65 61 74 65 20 73 63 68 65 6d 61  ot create schema
6eb0: 3a 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65  : %s", sqlite3_e
6ec0: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
6ed0: 69 66 28 20 7a 4d 73 67 20 29 7b 0a 20 20 20 20  if( zMsg ){.    
6ee0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
6ef0: 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
6f00: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6f10: 20 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45             "DELE
6f20: 54 45 20 46 52 4f 4d 20 72 65 61 64 6d 65 3b 20  TE FROM readme; 
6f30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 61 64  INSERT INTO read
6f40: 6d 65 28 6d 73 67 29 20 56 41 4c 55 45 53 28 25  me(msg) VALUES(%
6f50: 51 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  Q)", zMsg);.    
6f60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
6f70: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  xec(db, zSql, 0,
6f80: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
6f90: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
6fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
6fb0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e   fatalError("can
6fc0: 6e 6f 74 20 63 68 61 6e 67 65 20 64 65 73 63 72  not change descr
6fd0: 69 70 74 69 6f 6e 3a 20 25 73 22 2c 20 73 71 6c  iption: %s", sql
6fe0: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
6ff0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7000: 7a 49 6e 73 53 71 6c 20 29 7b 0a 20 20 20 20 20  zInsSql ){.     
7010: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7020: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 72 65  function(db, "re
7030: 61 64 66 69 6c 65 22 2c 20 31 2c 20 53 51 4c 49  adfile", 1, SQLI
7040: 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 20 20 20 20 20 20 72 65 61 64 66 69            readfi
7070: 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  leFunc, 0, 0);. 
7080: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7090: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
70a0: 20 7a 49 6e 73 53 71 6c 2c 20 2d 31 2c 20 26 70   zInsSql, -1, &p
70b0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
70c0: 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 45 72  if( rc ) fatalEr
70d0: 72 6f 72 28 22 63 61 6e 6e 6f 74 20 70 72 65 70  ror("cannot prep
70e0: 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 5b 25  are statement [%
70f0: 73 5d 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  s]: %s",.       
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 7a 49 6e 73 53 71 6c 2c 20 73 71 6c 69     zInsSql, sqli
7120: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
7130: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7140: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 42 45  te3_exec(db, "BE
7150: 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
7160: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 66        if( rc ) f
7170: 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f  atalError("canno
7180: 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
7190: 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 66  ction");.      f
71a0: 6f 72 28 69 3d 69 46 69 72 73 74 49 6e 73 41 72  or(i=iFirstInsAr
71b0: 67 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  g; i<argc; i++){
71c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
71d0: 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
71e0: 2c 20 31 2c 20 61 72 67 76 5b 69 5d 2c 20 2d 31  , 1, argv[i], -1
71f0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7200: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7210: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
7220: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
7230: 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
7240: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
7250: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 69   ) fatalError("i
7260: 6e 73 65 72 74 20 66 61 69 6c 65 64 20 66 6f 72  nsert failed for
7270: 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a   %s", argv[i]);.
7280: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
7290: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
72a0: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 63 20  Stmt);.      rc 
72b0: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
72c0: 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  b, "COMMIT", 0, 
72d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
72e0: 20 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72   rc ) fatalError
72f0: 28 22 63 61 6e 6e 6f 74 20 63 6f 6d 6d 69 74 20  ("cannot commit 
7300: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 3a  the transaction:
7310: 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72   %s", sqlite3_er
7320: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
7330: 20 72 65 62 75 69 6c 64 5f 64 61 74 61 62 61 73   rebuild_databas
7340: 65 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c  e(db);.      sql
7350: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
7360: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
7370: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45      }.    if( zE
7380: 78 70 44 62 21 3d 30 20 7c 7c 20 7a 45 78 70 53  xpDb!=0 || zExpS
7390: 71 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ql!=0 ){.      s
73a0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
73b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 77 72 69 74  nction(db, "writ
73c0: 65 66 69 6c 65 22 2c 20 32 2c 20 53 51 4c 49 54  efile", 2, SQLIT
73d0: 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 20 20 20 20 20 77 72 69 74 65 66 69           writefi
7400: 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  leFunc, 0, 0);. 
7410: 20 20 20 20 20 69 66 28 20 7a 45 78 70 44 62 21       if( zExpDb!
7420: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
7430: 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 44 62 20  nst char *zExDb 
7440: 3d 20 0a 20 20 20 20 20 20 20 20 20 20 22 53 45  = .          "SE
7450: 4c 45 43 54 20 77 72 69 74 65 66 69 6c 65 28 70  LECT writefile(p
7460: 72 69 6e 74 66 28 27 25 73 2f 64 62 25 30 36 64  rintf('%s/db%06d
7470: 2e 64 62 27 2c 3f 31 2c 64 62 69 64 29 2c 64 62  .db',?1,dbid),db
7480: 63 6f 6e 74 65 6e 74 29 2c 22 0a 20 20 20 20 20  content),".     
7490: 20 20 20 20 20 22 20 20 20 20 20 20 20 64 62 69       "       dbi
74a0: 64 2c 20 70 72 69 6e 74 66 28 27 25 73 2f 64 62  d, printf('%s/db
74b0: 25 30 36 64 2e 64 62 27 2c 3f 31 2c 64 62 69 64  %06d.db',?1,dbid
74c0: 29 2c 20 6c 65 6e 67 74 68 28 64 62 63 6f 6e 74  ), length(dbcont
74d0: 65 6e 74 29 22 0a 20 20 20 20 20 20 20 20 20 20  ent)".          
74e0: 22 20 20 46 52 4f 4d 20 64 62 20 57 48 45 52 45  "  FROM db WHERE
74f0: 20 3f 32 3c 30 20 4f 52 20 64 62 69 64 3d 3f 32   ?2<0 OR dbid=?2
7500: 3b 22 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ;";.        rc =
7510: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
7520: 5f 76 32 28 64 62 2c 20 7a 45 78 44 62 2c 20 2d  _v2(db, zExDb, -
7530: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
7540: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
7550: 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e  fatalError("cann
7560: 6f 74 20 70 72 65 70 61 72 65 20 73 74 61 74 65  ot prepare state
7570: 6d 65 6e 74 20 5b 25 73 5d 3a 20 25 73 22 2c 0a  ment [%s]: %s",.
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 78 44              zExD
75a0: 62 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  b, sqlite3_errms
75b0: 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  g(db));.        
75c0: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
75d0: 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 7a 45  t64(pStmt, 1, zE
75e0: 78 70 44 62 2c 20 73 74 72 6c 65 6e 28 7a 45 78  xpDb, strlen(zEx
75f0: 70 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  pDb),.          
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 2c    SQLITE_STATIC,
7620: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
7630: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
7640: 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  ind_int(pStmt, 2
7650: 2c 20 6f 6e 6c 79 44 62 69 64 29 3b 0a 20 20 20  , onlyDbid);.   
7660: 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
7670: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
7680: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
7690: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
76a0: 22 77 72 69 74 65 20 64 62 2d 25 64 20 28 25 64  "write db-%d (%d
76b0: 20 62 79 74 65 73 29 20 69 6e 74 6f 20 25 73 5c   bytes) into %s\
76c0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
76d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
76e0: 69 6e 74 28 70 53 74 6d 74 2c 31 29 2c 0a 20 20  int(pStmt,1),.  
76f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7700: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
7710: 74 6d 74 2c 33 29 2c 0a 20 20 20 20 20 20 20 20  tmt,3),.        
7720: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
7730: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
7740: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
7750: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
7760: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
7770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7780: 20 7a 45 78 70 53 71 6c 21 3d 30 20 29 7b 0a 20   zExpSql!=0 ){. 
7790: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
77a0: 72 20 2a 7a 45 78 53 71 6c 20 3d 20 0a 20 20 20  r *zExSql = .   
77b0: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 77         "SELECT w
77c0: 72 69 74 65 66 69 6c 65 28 70 72 69 6e 74 66 28  ritefile(printf(
77d0: 27 25 73 2f 73 71 6c 25 30 36 64 2e 74 78 74 27  '%s/sql%06d.txt'
77e0: 2c 3f 31 2c 73 71 6c 69 64 29 2c 73 71 6c 74 65  ,?1,sqlid),sqlte
77f0: 78 74 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20  xt),".          
7800: 22 20 20 20 20 20 20 20 73 71 6c 69 64 2c 20 70  "       sqlid, p
7810: 72 69 6e 74 66 28 27 25 73 2f 73 71 6c 25 30 36  rintf('%s/sql%06
7820: 64 2e 74 78 74 27 2c 3f 31 2c 73 71 6c 69 64 29  d.txt',?1,sqlid)
7830: 2c 20 6c 65 6e 67 74 68 28 73 71 6c 74 65 78 74  , length(sqltext
7840: 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  )".          "  
7850: 46 52 4f 4d 20 78 73 71 6c 20 57 48 45 52 45 20  FROM xsql WHERE 
7860: 3f 32 3c 30 20 4f 52 20 73 71 6c 69 64 3d 3f 32  ?2<0 OR sqlid=?2
7870: 3b 22 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ;";.        rc =
7880: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
7890: 5f 76 32 28 64 62 2c 20 7a 45 78 53 71 6c 2c 20  _v2(db, zExSql, 
78a0: 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
78b0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
78c0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61 6e   fatalError("can
78d0: 6e 6f 74 20 70 72 65 70 61 72 65 20 73 74 61 74  not prepare stat
78e0: 65 6d 65 6e 74 20 5b 25 73 5d 3a 20 25 73 22 2c  ement [%s]: %s",
78f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 45 78               zEx
7910: 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Sql, sqlite3_err
7920: 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
7930: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
7940: 65 78 74 36 34 28 70 53 74 6d 74 2c 20 31 2c 20  ext64(pStmt, 1, 
7950: 7a 45 78 70 53 71 6c 2c 20 73 74 72 6c 65 6e 28  zExpSql, strlen(
7960: 7a 45 78 70 53 71 6c 29 2c 0a 20 20 20 20 20 20  zExpSql),.      
7970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7980: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 41        SQLITE_STA
7990: 54 49 43 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  TIC, SQLITE_UTF8
79a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
79b0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
79c0: 74 2c 20 32 2c 20 6f 6e 6c 79 53 71 6c 69 64 29  t, 2, onlySqlid)
79d0: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
79e0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
79f0: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
7a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
7a10: 69 6e 74 66 28 22 77 72 69 74 65 20 73 71 6c 2d  intf("write sql-
7a20: 25 64 20 28 25 64 20 62 79 74 65 73 29 20 69 6e  %d (%d bytes) in
7a30: 74 6f 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  to %s\n",.      
7a40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
7a50: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
7a60: 31 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1),.            
7a70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7a80: 69 6e 74 28 70 53 74 6d 74 2c 33 29 2c 0a 20 20  int(pStmt,3),.  
7a90: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7aa0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
7ab0: 53 74 6d 74 2c 32 29 29 3b 0a 20 20 20 20 20 20  Stmt,2));.      
7ac0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
7ad0: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
7ae0: 6d 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mt);.      }.   
7af0: 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
7b00: 28 64 62 29 3b 0a 20 20 20 20 20 20 72 65 74 75  (db);.      retu
7b10: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  rn 0;.    }.  . 
7b20: 20 20 20 2f 2a 20 4c 6f 61 64 20 61 6c 6c 20 53     /* Load all S
7b30: 51 4c 20 73 63 72 69 70 74 20 63 6f 6e 74 65 6e  QL script conten
7b40: 74 20 61 6e 64 20 61 6c 6c 20 69 6e 69 74 69 61  t and all initia
7b50: 6c 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  l database image
7b60: 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a  s from the.    *
7b70: 2a 20 73 6f 75 72 63 65 20 64 62 0a 20 20 20 20  * source db.    
7b80: 2a 2f 0a 20 20 20 20 62 6c 6f 62 4c 69 73 74 4c  */.    blobListL
7b90: 6f 61 64 46 72 6f 6d 44 62 28 64 62 2c 20 22 53  oadFromDb(db, "S
7ba0: 45 4c 45 43 54 20 73 71 6c 69 64 2c 20 73 71 6c  ELECT sqlid, sql
7bb0: 74 65 78 74 20 46 52 4f 4d 20 78 73 71 6c 22 2c  text FROM xsql",
7bc0: 20 6f 6e 6c 79 53 71 6c 69 64 2c 0a 20 20 20 20   onlySqlid,.    
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 20 20 20 20 20 26 67 2e 6e 53 71 6c 2c 20         &g.nSql, 
7bf0: 26 67 2e 70 46 69 72 73 74 53 71 6c 29 3b 0a 20  &g.pFirstSql);. 
7c00: 20 20 20 69 66 28 20 67 2e 6e 53 71 6c 3d 3d 30     if( g.nSql==0
7c10: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6e   ) fatalError("n
7c20: 65 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  eed at least one
7c30: 20 53 51 4c 20 73 63 72 69 70 74 22 29 3b 0a 20   SQL script");. 
7c40: 20 20 20 62 6c 6f 62 4c 69 73 74 4c 6f 61 64 46     blobListLoadF
7c50: 72 6f 6d 44 62 28 64 62 2c 20 22 53 45 4c 45 43  romDb(db, "SELEC
7c60: 54 20 64 62 69 64 2c 20 64 62 63 6f 6e 74 65 6e  T dbid, dbconten
7c70: 74 20 46 52 4f 4d 20 64 62 22 2c 20 6f 6e 6c 79  t FROM db", only
7c80: 44 62 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20  Dbid,.          
7c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 67 2e               &g.
7ca0: 6e 44 62 2c 20 26 67 2e 70 46 69 72 73 74 44 62  nDb, &g.pFirstDb
7cb0: 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 6e 44 62  );.    if( g.nDb
7cc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 2e 70  ==0 ){.      g.p
7cd0: 46 69 72 73 74 44 62 20 3d 20 73 61 66 65 5f 72  FirstDb = safe_r
7ce0: 65 61 6c 6c 6f 63 28 30 2c 20 73 69 7a 65 6f 66  ealloc(0, sizeof
7cf0: 28 42 6c 6f 62 29 29 3b 0a 20 20 20 20 20 20 6d  (Blob));.      m
7d00: 65 6d 73 65 74 28 67 2e 70 46 69 72 73 74 44 62  emset(g.pFirstDb
7d10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 42 6c 6f 62  , 0, sizeof(Blob
7d20: 29 29 3b 0a 20 20 20 20 20 20 67 2e 70 46 69 72  ));.      g.pFir
7d30: 73 74 44 62 2d 3e 69 64 20 3d 20 31 3b 0a 20 20  stDb->id = 1;.  
7d40: 20 20 20 20 67 2e 70 46 69 72 73 74 44 62 2d 3e      g.pFirstDb->
7d50: 73 65 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  seq = 0;.      g
7d60: 2e 6e 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  .nDb = 1;.      
7d70: 73 71 6c 46 75 7a 7a 20 3d 20 31 3b 0a 20 20 20  sqlFuzz = 1;.   
7d80: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 50 72 69   }.  .    /* Pri
7d90: 6e 74 20 74 68 65 20 64 65 73 63 72 69 70 74 69  nt the descripti
7da0: 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  on, if there is 
7db0: 6f 6e 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  one */.    if( !
7dc0: 71 75 69 65 74 46 6c 61 67 20 29 7b 0a 20 20 20  quietFlag ){.   
7dd0: 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 61 7a 53     zDbName = azS
7de0: 72 63 44 62 5b 69 53 72 63 44 62 5d 3b 0a 20 20  rcDb[iSrcDb];.  
7df0: 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a      i = strlen(z
7e00: 44 62 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20  DbName) - 1;.   
7e10: 20 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26     while( i>0 &&
7e20: 20 7a 44 62 4e 61 6d 65 5b 69 2d 31 5d 21 3d 27   zDbName[i-1]!='
7e30: 2f 27 20 26 26 20 7a 44 62 4e 61 6d 65 5b 69 2d  /' && zDbName[i-
7e40: 31 5d 21 3d 27 5c 5c 27 20 29 7b 20 69 2d 2d 3b  1]!='\\' ){ i--;
7e50: 20 7d 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d 65   }.      zDbName
7e60: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 73 71 6c   += i;.      sql
7e70: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7e80: 64 62 2c 20 22 53 45 4c 45 43 54 20 6d 73 67 20  db, "SELECT msg 
7e90: 46 52 4f 4d 20 72 65 61 64 6d 65 22 2c 20 2d 31  FROM readme", -1
7ea0: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
7eb0: 20 20 20 20 69 66 28 20 70 53 74 6d 74 20 26 26      if( pStmt &&
7ec0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
7ed0: 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
7ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e   ){.        prin
7ef0: 74 66 28 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a  tf("%s: %s\n", z
7f00: 44 62 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f  DbName, sqlite3_
7f10: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
7f20: 74 2c 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t,0));.      }. 
7f30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
7f40: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
7f50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 62 75    }..    /* Rebu
7f60: 69 6c 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ild the database
7f70: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 2a  , if requested *
7f80: 2f 0a 20 20 20 20 69 66 28 20 72 65 62 75 69 6c  /.    if( rebuil
7f90: 64 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  dFlag ){.      i
7fa0: 66 28 20 21 71 75 69 65 74 46 6c 61 67 20 29 7b  f( !quietFlag ){
7fb0: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
7fc0: 22 25 73 3a 20 72 65 62 75 69 6c 64 69 6e 67 2e  "%s: rebuilding.
7fd0: 2e 2e 20 22 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  .. ", zDbName);.
7fe0: 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73          fflush(s
7ff0: 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  tdout);.      }.
8000: 20 20 20 20 20 20 72 65 62 75 69 6c 64 5f 64 61        rebuild_da
8010: 74 61 62 61 73 65 28 64 62 29 3b 0a 20 20 20 20  tabase(db);.    
8020: 20 20 69 66 28 20 21 71 75 69 65 74 46 6c 61 67    if( !quietFlag
8030: 20 29 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c   ) printf("done\
8040: 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  n");.    }.  .  
8050: 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 73    /* Close the s
8060: 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 2e 20  ource database. 
8070: 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20   Verify that no 
8080: 53 51 4c 69 74 65 20 6d 65 6d 6f 72 79 20 61 6c  SQLite memory al
8090: 6c 6f 63 61 74 69 6f 6e 73 20 61 72 65 0a 20 20  locations are.  
80a0: 20 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67    ** outstanding
80b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
80c0: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
80d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
80e0: 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3e 30 20  memory_used()>0 
80f0: 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 45 72  ){.      fatalEr
8100: 72 6f 72 28 22 53 51 4c 69 74 65 20 68 61 73 20  ror("SQLite has 
8110: 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 65  memory in use be
8120: 66 6f 72 65 20 74 68 65 20 73 74 61 72 74 20 6f  fore the start o
8130: 66 20 74 65 73 74 69 6e 67 22 29 3b 0a 20 20 20  f testing");.   
8140: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6d 69 74   }..    /* Limit
8150: 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72   available memor
8160: 79 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20  y, if requested 
8170: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 65 6d 3e  */.    if( nMem>
8180: 30 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  0 ){.      void 
8190: 2a 70 48 65 61 70 3b 0a 20 20 20 20 20 20 73 71  *pHeap;.      sq
81a0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 29  lite3_shutdown()
81b0: 3b 0a 20 20 20 20 20 20 70 48 65 61 70 20 3d 20  ;.      pHeap = 
81c0: 6d 61 6c 6c 6f 63 28 6e 4d 65 6d 29 3b 0a 20 20  malloc(nMem);.  
81d0: 20 20 20 20 69 66 28 20 70 48 65 61 70 3d 3d 30      if( pHeap==0
81e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 61 74 61   ){.        fata
81f0: 6c 45 72 72 6f 72 28 22 66 61 69 6c 65 64 20 74  lError("failed t
8200: 6f 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 62 79  o allocate %d by
8210: 74 65 73 20 6f 66 20 68 65 61 70 20 6d 65 6d 6f  tes of heap memo
8220: 72 79 22 2c 20 6e 4d 65 6d 29 3b 0a 20 20 20 20  ry", nMem);.    
8230: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8240: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
8250: 43 4f 4e 46 49 47 5f 48 45 41 50 2c 20 70 48 65  CONFIG_HEAP, pHe
8260: 61 70 2c 20 6e 4d 65 6d 2c 20 31 32 38 29 3b 0a  ap, nMem, 128);.
8270: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
8280: 52 65 67 69 73 74 65 72 20 74 68 65 20 69 6e 2d  Register the in-
8290: 6d 65 6d 6f 72 79 20 76 69 72 74 75 61 6c 20 66  memory virtual f
82a0: 69 6c 65 73 79 73 74 65 6d 0a 20 20 20 20 2a 2f  ilesystem.    */
82b0: 0a 20 20 20 20 66 6f 72 6d 61 74 56 66 73 28 29  .    formatVfs()
82c0: 3b 0a 20 20 20 20 69 6e 6d 65 6d 56 66 73 52 65  ;.    inmemVfsRe
82d0: 67 69 73 74 65 72 28 29 3b 0a 20 20 20 20 0a 20  gister();.    . 
82e0: 20 20 20 2f 2a 20 52 75 6e 20 61 20 74 65 73 74     /* Run a test
82f0: 20 75 73 69 6e 67 20 65 61 63 68 20 53 51 4c 20   using each SQL 
8300: 73 63 72 69 70 74 20 61 67 61 69 6e 73 74 20 65  script against e
8310: 61 63 68 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ach database..  
8320: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 76 65    */.    if( !ve
8330: 72 62 6f 73 65 46 6c 61 67 20 26 26 20 21 71 75  rboseFlag && !qu
8340: 69 65 74 46 6c 61 67 20 29 20 70 72 69 6e 74 66  ietFlag ) printf
8350: 28 22 25 73 3a 22 2c 20 7a 44 62 4e 61 6d 65 29  ("%s:", zDbName)
8360: 3b 0a 20 20 20 20 66 6f 72 28 70 53 71 6c 3d 67  ;.    for(pSql=g
8370: 2e 70 46 69 72 73 74 53 71 6c 3b 20 70 53 71 6c  .pFirstSql; pSql
8380: 3b 20 70 53 71 6c 3d 70 53 71 6c 2d 3e 70 4e 65  ; pSql=pSql->pNe
8390: 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  xt){.      for(p
83a0: 44 62 3d 67 2e 70 46 69 72 73 74 44 62 3b 20 70  Db=g.pFirstDb; p
83b0: 44 62 3b 20 70 44 62 3d 70 44 62 2d 3e 70 4e 65  Db; pDb=pDb->pNe
83c0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
83d0: 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 20 20   openFlags;.    
83e0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
83f0: 7a 56 66 73 20 3d 20 22 69 6e 6d 65 6d 22 3b 0a  zVfs = "inmem";.
8400: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8410: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
8420: 67 2e 7a 54 65 73 74 4e 61 6d 65 29 2c 20 67 2e  g.zTestName), g.
8430: 7a 54 65 73 74 4e 61 6d 65 2c 20 22 73 71 6c 69  zTestName, "sqli
8440: 64 3d 25 64 2c 64 62 69 64 3d 25 64 22 2c 0a 20  d=%d,dbid=%d",. 
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 20 20 20 20 70 53 71 6c 2d 3e 69 64          pSql->id
8470: 2c 20 70 44 62 2d 3e 69 64 29 3b 0a 20 20 20 20  , pDb->id);.    
8480: 20 20 20 20 69 66 28 20 76 65 72 62 6f 73 65 46      if( verboseF
8490: 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
84a0: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
84b0: 67 2e 7a 54 65 73 74 4e 61 6d 65 29 3b 0a 20 20  g.zTestName);.  
84c0: 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73          fflush(s
84d0: 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  tdout);.        
84e0: 7d 65 6c 73 65 20 69 66 28 20 21 71 75 69 65 74  }else if( !quiet
84f0: 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
8500: 20 20 73 74 61 74 69 63 20 69 6e 74 20 70 72 65    static int pre
8510: 76 41 6d 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  vAmt = -1;.     
8520: 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70       int idx = p
8530: 53 71 6c 2d 3e 73 65 71 2a 67 2e 6e 44 62 20 2b  Sql->seq*g.nDb +
8540: 20 70 44 62 2d 3e 69 64 20 2d 20 31 3b 0a 20 20   pDb->id - 1;.  
8550: 20 20 20 20 20 20 20 20 69 6e 74 20 61 6d 74 20          int amt 
8560: 3d 20 69 64 78 2a 31 30 2f 28 67 2e 6e 44 62 2a  = idx*10/(g.nDb*
8570: 67 2e 6e 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  g.nSql);.       
8580: 20 20 20 69 66 28 20 61 6d 74 21 3d 70 72 65 76     if( amt!=prev
8590: 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Amt ){.         
85a0: 20 20 20 70 72 69 6e 74 66 28 22 20 25 64 25 25     printf(" %d%%
85b0: 22 2c 20 61 6d 74 2a 31 30 29 3b 0a 20 20 20 20  ", amt*10);.    
85c0: 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73          fflush(s
85d0: 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  tdout);.        
85e0: 20 20 20 20 70 72 65 76 41 6d 74 20 3d 20 61 6d      prevAmt = am
85f0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
8600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8610: 20 63 72 65 61 74 65 56 46 69 6c 65 28 22 6d 61   createVFile("ma
8620: 69 6e 2e 64 62 22 2c 20 70 44 62 2d 3e 73 7a 2c  in.db", pDb->sz,
8630: 20 70 44 62 2d 3e 61 29 3b 0a 20 20 20 20 20 20   pDb->a);.      
8640: 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 53 51    openFlags = SQ
8650: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
8660: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
8670: 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
8680: 20 20 69 66 28 20 6e 61 74 69 76 65 46 6c 61 67    if( nativeFlag
8690: 20 26 26 20 70 44 62 2d 3e 73 7a 3d 3d 30 20 29   && pDb->sz==0 )
86a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e  {.          open
86b0: 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
86c0: 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20  OPEN_MEMORY;.   
86d0: 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 30 3b         zVfs = 0;
86e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
86f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8700: 6f 70 65 6e 5f 76 32 28 22 6d 61 69 6e 2e 64 62  open_v2("main.db
8710: 22 2c 20 26 64 62 2c 20 6f 70 65 6e 46 6c 61 67  ", &db, openFlag
8720: 73 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 20 20  s, zVfs);.      
8730: 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c    if( rc ) fatal
8740: 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70  Error("cannot op
8750: 65 6e 20 69 6e 6d 65 6d 20 64 61 74 61 62 61 73  en inmem databas
8760: 65 22 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  e");.#ifdef SQLI
8770: 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a  TE_ENABLE_JSON1.
8780: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
8790: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
87a0: 71 6c 69 74 65 33 5f 6a 73 6f 6e 5f 69 6e 69 74  qlite3_json_init
87b0: 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
87c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6a 73        sqlite3_js
87d0: 6f 6e 5f 69 6e 69 74 28 64 62 29 3b 0a 20 20 20  on_init(db);.   
87e0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
87f0: 20 20 20 20 20 20 69 66 28 20 63 65 6c 6c 53 7a        if( cellSz
8800: 43 6b 46 6c 61 67 20 29 20 72 75 6e 53 71 6c 28  CkFlag ) runSql(
8810: 64 62 2c 20 22 50 52 41 47 4d 41 20 63 65 6c 6c  db, "PRAGMA cell
8820: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 22 2c  _size_check=ON",
8830: 20 72 75 6e 46 6c 61 67 73 29 3b 0a 20 20 20 20   runFlags);.    
8840: 20 20 20 20 73 65 74 41 6c 61 72 6d 28 69 54 69      setAlarm(iTi
8850: 6d 65 6f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20  meout);.#ifndef 
8860: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47  SQLITE_OMIT_PROG
8870: 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20  RESS_CALLBACK.  
8880: 20 20 20 20 20 20 69 66 28 20 73 71 6c 46 75 7a        if( sqlFuz
8890: 7a 20 7c 7c 20 76 64 62 65 4c 69 6d 69 74 46 6c  z || vdbeLimitFl
88a0: 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
88b0: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
88c0: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 31 30 30  _handler(db, 100
88d0: 30 30 30 2c 20 70 72 6f 67 72 65 73 73 48 61 6e  000, progressHan
88e0: 64 6c 65 72 2c 20 26 76 64 62 65 4c 69 6d 69 74  dler, &vdbeLimit
88f0: 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Flag);.        }
8900: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
8910: 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 72 75  do{.          ru
8920: 6e 53 71 6c 28 64 62 2c 20 28 63 68 61 72 2a 29  nSql(db, (char*)
8930: 70 53 71 6c 2d 3e 61 2c 20 72 75 6e 46 6c 61 67  pSql->a, runFlag
8940: 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 77 68 69  s);.        }whi
8950: 6c 65 28 20 74 69 6d 65 6f 75 74 54 65 73 74 20  le( timeoutTest 
8960: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 74 41 6c  );.        setAl
8970: 61 72 6d 28 30 29 3b 0a 20 20 20 20 20 20 20 20  arm(0);.        
8980: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
8990: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
89a0: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
89b0: 65 64 28 29 3e 30 20 29 20 66 61 74 61 6c 45 72  ed()>0 ) fatalEr
89c0: 72 6f 72 28 22 6d 65 6d 6f 72 79 20 6c 65 61 6b  ror("memory leak
89d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 66 6f  ");.        refo
89e0: 72 6d 61 74 56 66 73 28 29 3b 0a 20 20 20 20 20  rmatVfs();.     
89f0: 20 20 20 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20     nTest++;.    
8a00: 20 20 20 20 67 2e 7a 54 65 73 74 4e 61 6d 65 5b      g.zTestName[
8a10: 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  0] = 0;..       
8a20: 20 2f 2a 20 53 69 6d 75 6c 61 74 65 20 61 6e 20   /* Simulate an 
8a30: 65 72 72 6f 72 20 69 66 20 74 68 65 20 54 45 53  error if the TES
8a40: 54 5f 46 41 49 4c 55 52 45 20 65 6e 76 69 72 6f  T_FAILURE enviro
8a50: 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 69  nment variable i
8a60: 73 20 22 35 22 2e 0a 20 20 20 20 20 20 20 20 2a  s "5"..        *
8a70: 2a 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  * This is used t
8a80: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 61 75  o verify that au
8a90: 74 6f 6d 61 74 65 64 20 74 65 73 74 20 73 63 72  tomated test scr
8aa0: 69 70 74 20 72 65 61 6c 6c 79 20 64 6f 20 73 70  ipt really do sp
8ab0: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 72  ot.        ** er
8ac0: 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72 20  rors that occur 
8ad0: 69 6e 20 74 68 69 73 20 74 65 73 74 20 70 72 6f  in this test pro
8ae0: 67 72 61 6d 2e 0a 20 20 20 20 20 20 20 20 2a 2f  gram..        */
8af0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 61  .        if( zFa
8b00: 69 6c 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  ilCode ){.      
8b10: 20 20 20 20 69 66 28 20 7a 46 61 69 6c 43 6f 64      if( zFailCod
8b20: 65 5b 30 5d 3d 3d 27 35 27 20 26 26 20 7a 46 61  e[0]=='5' && zFa
8b30: 69 6c 43 6f 64 65 5b 31 5d 3d 3d 30 20 29 7b 0a  ilCode[1]==0 ){.
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 74 61              fata
8b50: 6c 45 72 72 6f 72 28 22 73 69 6d 75 6c 61 74 65  lError("simulate
8b60: 64 20 66 61 69 6c 75 72 65 22 29 3b 0a 20 20 20  d failure");.   
8b70: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
8b80: 20 7a 46 61 69 6c 43 6f 64 65 5b 30 5d 21 3d 30   zFailCode[0]!=0
8b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8ba0: 2f 2a 20 49 66 20 54 45 53 54 5f 46 41 49 4c 55  /* If TEST_FAILU
8bb0: 52 45 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  RE is something 
8bc0: 6f 74 68 65 72 20 74 68 61 6e 20 35 2c 20 6a 75  other than 5, ju
8bd0: 73 74 20 65 78 69 74 20 74 68 65 20 74 65 73 74  st exit the test
8be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
8bf0: 65 61 72 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20  early */.       
8c00: 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 45       printf("\nE
8c10: 78 69 74 20 65 61 72 6c 79 20 64 75 65 20 74 6f  xit early due to
8c20: 20 54 45 53 54 5f 46 41 49 4c 55 52 45 20 62 65   TEST_FAILURE be
8c30: 69 6e 67 20 73 65 74 5c 6e 22 29 3b 0a 20 20 20  ing set\n");.   
8c40: 20 20 20 20 20 20 20 20 20 69 53 72 63 44 62 20           iSrcDb 
8c50: 3d 20 6e 53 72 63 44 62 2d 31 3b 0a 20 20 20 20  = nSrcDb-1;.    
8c60: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 6f 75          goto sou
8c70: 72 63 65 64 62 5f 63 6c 65 61 6e 75 70 3b 0a 20  rcedb_cleanup;. 
8c80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
8c90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8ca0: 20 7d 0a 20 20 20 20 69 66 28 20 21 71 75 69 65   }.    if( !quie
8cb0: 74 46 6c 61 67 20 26 26 20 21 76 65 72 62 6f 73  tFlag && !verbos
8cc0: 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 70  eFlag ){.      p
8cd0: 72 69 6e 74 66 28 22 20 31 30 30 25 25 20 2d 20  rintf(" 100%% - 
8ce0: 25 64 20 74 65 73 74 73 5c 6e 22 2c 20 67 2e 6e  %d tests\n", g.n
8cf0: 44 62 2a 67 2e 6e 53 71 6c 29 3b 0a 20 20 20 20  Db*g.nSql);.    
8d00: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6c 65 61  }.  .    /* Clea
8d10: 6e 20 75 70 20 61 74 20 74 68 65 20 65 6e 64 20  n up at the end 
8d20: 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20  of processing a 
8d30: 73 69 6e 67 6c 65 20 73 6f 75 72 63 65 20 64 61  single source da
8d40: 74 61 62 61 73 65 0a 20 20 20 20 2a 2f 0a 20 20  tabase.    */.  
8d50: 73 6f 75 72 63 65 64 62 5f 63 6c 65 61 6e 75 70  sourcedb_cleanup
8d60: 3a 0a 20 20 20 20 62 6c 6f 62 4c 69 73 74 46 72  :.    blobListFr
8d70: 65 65 28 67 2e 70 46 69 72 73 74 53 71 6c 29 3b  ee(g.pFirstSql);
8d80: 0a 20 20 20 20 62 6c 6f 62 4c 69 73 74 46 72 65  .    blobListFre
8d90: 65 28 67 2e 70 46 69 72 73 74 44 62 29 3b 0a 20  e(g.pFirstDb);. 
8da0: 20 20 20 72 65 66 6f 72 6d 61 74 56 66 73 28 29     reformatVfs()
8db0: 3b 0a 20 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  ;. .  } /* End l
8dc0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 6f 75  oop over all sou
8dd0: 72 63 65 20 64 61 74 61 62 61 73 65 73 20 2a 2f  rce databases */
8de0: 0a 0a 20 20 69 66 28 20 21 71 75 69 65 74 46 6c  ..  if( !quietFl
8df0: 61 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ag ){.    sqlite
8e00: 33 5f 69 6e 74 36 34 20 69 45 6c 61 70 73 65 20  3_int64 iElapse 
8e10: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 20 2d 20  = timeOfDay() - 
8e20: 69 42 65 67 69 6e 3b 0a 20 20 20 20 70 72 69 6e  iBegin;.    prin
8e30: 74 66 28 22 66 75 7a 7a 63 68 65 63 6b 3a 20 30  tf("fuzzcheck: 0
8e40: 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25   errors out of %
8e50: 64 20 74 65 73 74 73 20 69 6e 20 25 64 2e 25 30  d tests in %d.%0
8e60: 33 64 20 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20  3d seconds\n".  
8e70: 20 20 20 20 20 20 20 20 20 22 53 51 4c 69 74 65           "SQLite
8e80: 20 25 73 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %s %s\n",.     
8e90: 20 20 20 20 20 20 6e 54 65 73 74 2c 20 28 69 6e        nTest, (in
8ea0: 74 29 28 69 45 6c 61 70 73 65 2f 31 30 30 30 29  t)(iElapse/1000)
8eb0: 2c 20 28 69 6e 74 29 28 69 45 6c 61 70 73 65 25  , (int)(iElapse%
8ec0: 31 30 30 30 29 2c 0a 20 20 20 20 20 20 20 20 20  1000),.         
8ed0: 20 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72    sqlite3_libver
8ee0: 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f  sion(), sqlite3_
8ef0: 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 7d  sourceid());.  }
8f00: 0a 20 20 66 72 65 65 28 61 7a 53 72 63 44 62 29  .  free(azSrcDb)
8f10: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.