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

Artifact e751524648c8cba541ecaefe102dfb32012a447b:


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 0a 2a 2a 20 6f 6e 20  ons tests.** on 
01c0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 75  SQLite library u
01d0: 73 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 61  sing data from a
01e0: 6e 20 65 78 74 65 72 6e 61 6c 20 66 75 7a 7a 65  n external fuzze
01f0: 72 2c 20 73 75 63 68 20 61 73 20 41 6d 65 72 69  r, such as Ameri
0200: 63 61 6e 0a 2a 2a 20 46 75 7a 7a 79 20 4c 6f 70  can.** Fuzzy Lop
0210: 20 28 41 46 4c 29 20 28 68 74 74 70 3a 2f 2f 6c   (AFL) (http://l
0220: 63 61 6d 74 75 66 2e 63 6f 72 65 64 75 6d 70 2e  camtuf.coredump.
0230: 63 78 2f 61 66 6c 2f 29 2e 0a 2a 2a 0a 2a 2a 20  cx/afl/)..**.** 
0240: 54 68 69 73 20 70 72 6f 67 72 61 6d 20 72 65 61  This program rea
0250: 64 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ds content from 
0260: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
0270: 73 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  se file with the
0280: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 63   following.** sc
0290: 68 65 6d 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hema:.**.**     
02a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 64 62 28  CREATE TABLE db(
02b0: 0a 2a 2a 20 20 20 20 20 20 20 64 62 69 64 20 49  .**       dbid I
02c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
02d0: 45 59 2c 20 2d 2d 20 64 61 74 61 62 61 73 65 20  EY, -- database 
02e0: 69 64 0a 2a 2a 20 20 20 20 20 20 20 64 62 63 6f  id.**       dbco
02f0: 6e 74 65 6e 74 20 42 4c 4f 42 20 20 20 20 20 20  ntent BLOB      
0300: 20 20 20 20 20 20 2d 2d 20 64 61 74 61 62 61 73        -- databas
0310: 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6d 61 67  e disk file imag
0320: 65 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a 20 20  e.**     );.**  
0330: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
0340: 78 73 71 6c 28 0a 2a 2a 20 20 20 20 20 20 20 73  xsql(.**       s
0350: 71 6c 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  qlid INTEGER PRI
0360: 4d 41 52 59 20 4b 45 59 2c 20 20 20 2d 2d 20 53  MARY KEY,   -- S
0370: 51 4c 20 73 63 72 69 70 74 20 69 64 0a 2a 2a 20  QL script id.** 
0380: 20 20 20 20 20 20 73 71 6c 74 65 78 74 20 54 45        sqltext TE
0390: 58 54 20 20 20 20 20 20 20 20 20 20 20 20 20 20  XT              
03a0: 20 20 20 2d 2d 20 54 65 78 74 20 6f 66 20 53 51     -- Text of SQ
03b0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  L statements to 
03c0: 72 75 6e 0a 2a 2a 20 20 20 20 20 29 3b 0a 2a 2a  run.**     );.**
03d0: 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20 64 61 74  .** For each dat
03e0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
03f0: 65 20 44 42 20 74 61 62 6c 65 2c 20 74 68 65 20  e DB table, the 
0400: 53 51 4c 20 74 65 78 74 20 69 6e 20 74 68 65 20  SQL text in the 
0410: 58 53 51 4c 20 74 61 62 6c 65 0a 2a 2a 20 69 73  XSQL table.** is
0420: 20 72 75 6e 20 61 67 61 69 6e 73 74 20 74 68 61   run against tha
0430: 74 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  t database.  Thi
0440: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 6f  s program is loo
0450: 6b 69 6e 67 20 66 6f 72 20 63 72 61 73 68 65 73  king for crashes
0460: 2c 0a 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 66  ,.** assertion f
0470: 61 75 6c 74 73 2c 20 61 6e 64 2f 6f 72 20 6d 65  aults, and/or me
0480: 6d 6f 72 79 20 6c 65 61 6b 73 2e 20 20 4e 6f 20  mory leaks.  No 
0490: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
04a0: 74 6f 20 76 65 72 69 66 79 0a 2a 2a 20 74 68 65  to verify.** the
04b0: 20 6f 75 74 70 75 74 2e 20 20 54 68 65 20 61 73   output.  The as
04c0: 73 75 6d 70 74 69 6f 6e 20 69 73 20 74 68 61 74  sumption is that
04d0: 20 65 69 74 68 65 72 20 61 6c 6c 20 6f 66 20 74   either all of t
04e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
04f0: 73 0a 2a 2a 20 6f 72 20 61 6c 6c 20 6f 66 20 74  s.** or all of t
0500: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
0510: 73 20 61 72 65 20 6d 61 6c 66 6f 72 6d 65 64 20  s are malformed 
0520: 69 6e 70 75 74 73 2c 20 67 65 6e 65 72 61 74 65  inputs, generate
0530: 64 20 62 79 20 61 20 66 75 7a 7a 65 72 2c 0a 2a  d by a fuzzer,.*
0540: 2a 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  * that need to b
0550: 65 20 63 68 65 63 6b 65 64 20 74 6f 20 6d 61 6b  e checked to mak
0560: 65 20 73 75 72 65 20 74 68 65 79 20 64 6f 20 6e  e sure they do n
0570: 6f 74 20 70 72 65 73 65 6e 74 20 61 20 73 65 63  ot present a sec
0580: 75 72 69 74 79 20 72 69 73 6b 2e 0a 2a 2a 0a 2a  urity risk..**.*
0590: 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 61  * This program a
05a0: 6c 73 6f 20 69 6e 63 6c 75 64 65 73 20 73 6f 6d  lso includes som
05b0: 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  e command-line o
05c0: 70 74 69 6f 6e 73 20 74 6f 20 68 65 6c 70 20 77  ptions to help w
05d0: 69 74 68 20 0a 2a 2a 20 63 72 65 61 74 69 6f 6e  ith .** creation
05e0: 20 61 6e 64 20 6d 61 69 6e 74 65 6e 61 6e 63 65   and maintenance
05f0: 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 20 63   of the source c
0600: 6f 6e 74 65 6e 74 20 64 61 74 61 62 61 73 65 2e  ontent database.
0610: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .*/.#include <st
0620: 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  dio.h>.#include 
0630: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0640: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0650: 69 6e 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e  include <stdarg.
0660: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  h>.#include <cty
0670: 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 22  pe.h>.#include "
0680: 73 71 6c 69 74 65 33 2e 68 22 0a 0a 2f 2a 0a 2a  sqlite3.h"../*.*
0690: 2a 20 46 69 6c 65 73 20 69 6e 20 74 68 65 20 76  * Files in the v
06a0: 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
06b0: 65 6d 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  em..*/.typedef s
06c0: 74 72 75 63 74 20 56 46 69 6c 65 20 56 46 69 6c  truct VFile VFil
06d0: 65 3b 0a 73 74 72 75 63 74 20 56 46 69 6c 65 20  e;.struct VFile 
06e0: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
06f0: 61 6d 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  ame;        /* F
0700: 69 6c 65 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 66  ilename.  NULL f
0710: 6f 72 20 64 65 6c 65 74 65 2d 6f 6e 2d 63 6c 6f  or delete-on-clo
0720: 73 65 2e 20 46 72 6f 6d 20 6d 61 6c 6c 6f 63 28  se. From malloc(
0730: 29 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b 20 20  ) */.  int sz;  
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0750: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 69  * Size of the fi
0760: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
0770: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
0780: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0790: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
07a0: 20 74 6f 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   to this file */
07b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
07c0: 20 2a 61 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f   *a;       /* Co
07d0: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 66 69 6c  ntent of the fil
07e0: 65 2e 20 20 46 72 6f 6d 20 6d 61 6c 6c 6f 63 28  e.  From malloc(
07f0: 29 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20  ) */.};.typedef 
0800: 73 74 72 75 63 74 20 56 48 61 6e 64 6c 65 20 56  struct VHandle V
0810: 48 61 6e 64 6c 65 3b 0a 73 74 72 75 63 74 20 56  Handle;.struct V
0820: 48 61 6e 64 6c 65 20 7b 0a 20 20 73 71 6c 69 74  Handle {.  sqlit
0830: 65 33 5f 66 69 6c 65 20 62 61 73 65 3b 20 20 20  e3_file base;   
0840: 20 20 20 2f 2a 20 42 61 73 65 20 63 6c 61 73 73     /* Base class
0850: 2e 20 20 4d 75 73 74 20 62 65 20 66 69 72 73 74  .  Must be first
0860: 20 2a 2f 0a 20 20 56 46 69 6c 65 20 2a 70 56 46   */.  VFile *pVF
0870: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ile;          /*
0880: 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
0890: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
08a0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 61  * The value of a
08b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
08c0: 65 6d 70 6c 61 74 65 2c 20 6f 72 20 6f 66 20 61  emplate, or of a
08d0: 6e 20 53 51 4c 20 73 63 72 69 70 74 0a 2a 2f 0a  n SQL script.*/.
08e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 42  typedef struct B
08f0: 6c 6f 62 20 42 6c 6f 62 3b 0a 73 74 72 75 63 74  lob Blob;.struct
0900: 20 42 6c 6f 62 20 7b 0a 20 20 42 6c 6f 62 20 2a   Blob {.  Blob *
0910: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
0920: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
0930: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 3b  ist */.  int id;
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 42   /* Id of this B
0960: 6c 6f 62 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 3b  lob */.  int sz;
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 69 73   /* Size of this
0990: 20 42 6c 6f 62 20 69 6e 20 62 79 74 65 73 20 2a   Blob in bytes *
09a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
09b0: 72 20 61 5b 31 5d 3b 20 20 20 20 20 2f 2a 20 42  r a[1];     /* B
09c0: 6c 6f 62 20 63 6f 6e 74 65 6e 74 2e 20 20 45 78  lob content.  Ex
09d0: 74 72 61 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  tra space alloca
09e0: 74 65 64 20 61 73 20 6e 65 65 64 65 64 2e 20 2a  ted as needed. *
09f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  /.};../*.** Maxi
0a00: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  mum number of fi
0a10: 6c 65 73 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  les in the in-me
0a20: 6d 6f 72 79 20 76 69 72 74 75 61 6c 20 66 69 6c  mory virtual fil
0a30: 65 73 79 73 74 65 6d 2e 0a 2a 2f 0a 23 64 65 66  esystem..*/.#def
0a40: 69 6e 65 20 4d 58 5f 46 49 4c 45 20 20 31 30 0a  ine MX_FILE  10.
0a50: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 61  ./*.** Maximum a
0a60: 6c 6c 6f 77 65 64 20 66 69 6c 65 20 73 69 7a 65  llowed file size
0a70: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 46  .*/.#define MX_F
0a80: 49 4c 45 5f 53 5a 20 31 30 30 30 30 30 30 30 0a  ILE_SZ 10000000.
0a90: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 67 6c 6f 62 61  ./*.** All globa
0aa0: 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  l variables are 
0ab0: 67 61 74 68 65 72 65 64 20 69 6e 74 6f 20 74 68  gathered into th
0ac0: 65 20 22 67 22 20 73 69 6e 67 6c 65 74 6f 6e 2e  e "g" singleton.
0ad0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
0ae0: 74 20 47 6c 6f 62 61 6c 56 61 72 73 20 7b 0a 20  t GlobalVars {. 
0af0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
0b00: 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  gv0;            
0b10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 70 72 6f    /* Name of pro
0b20: 67 72 61 6d 20 2a 2f 0a 20 20 56 46 69 6c 65 20  gram */.  VFile 
0b30: 61 46 69 6c 65 5b 4d 58 5f 46 49 4c 45 5d 3b 20  aFile[MX_FILE]; 
0b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0b50: 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 73 79  e virtual filesy
0b60: 73 74 65 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  stem */.  int nD
0b70: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
0b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0b90: 6d 62 65 72 20 6f 66 20 74 65 6d 70 6c 61 74 65  mber of template
0ba0: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
0bb0: 42 6c 6f 62 20 2a 70 46 69 72 73 74 44 62 3b 20  Blob *pFirstDb; 
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 66   /* Content of f
0be0: 69 72 73 74 20 74 65 6d 70 6c 61 74 65 20 64 61  irst template da
0bf0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
0c00: 6e 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  nSql;           
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0c20: 4e 75 6d 62 65 72 20 6f 66 20 53 51 4c 20 73 63  Number of SQL sc
0c30: 72 69 70 74 73 20 2a 2f 0a 20 20 42 6c 6f 62 20  ripts */.  Blob 
0c40: 2a 70 46 69 72 73 74 53 71 6c 3b 20 20 20 20 20  *pFirstSql;     
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
0c60: 69 72 73 74 20 53 51 4c 20 73 63 72 69 70 74 20  irst SQL script 
0c70: 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73 74 4e  */.  char zTestN
0c80: 61 6d 65 5b 31 30 30 5d 3b 20 20 20 20 20 20 20  ame[100];       
0c90: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
0ca0: 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 2a 2f   current test */
0cb0: 0a 7d 20 67 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  .} g;../*.** Pri
0cc0: 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nt an error mess
0cd0: 61 67 65 20 61 6e 64 20 71 75 69 74 2e 0a 2a 2f  age and quit..*/
0ce0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 61 74  .static void fat
0cf0: 61 6c 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68  alError(const ch
0d00: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
0d10: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
0d20: 0a 20 20 69 66 28 20 67 2e 7a 54 65 73 74 4e 61  .  if( g.zTestNa
0d30: 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 66 70 72  me[0] ){.    fpr
0d40: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
0d50: 20 28 25 73 29 3a 20 22 2c 20 67 2e 7a 41 72 67   (%s): ", g.zArg
0d60: 76 30 2c 20 67 2e 7a 54 65 73 74 4e 61 6d 65 29  v0, g.zTestName)
0d70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
0d80: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
0d90: 25 73 3a 20 22 2c 20 67 2e 7a 41 72 67 76 30 29  %s: ", g.zArgv0)
0da0: 3b 0a 20 20 7d 0a 20 20 76 61 5f 73 74 61 72 74  ;.  }.  va_start
0db0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
0dc0: 20 76 66 70 72 69 6e 74 66 28 73 74 64 65 72 72   vfprintf(stderr
0dd0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
0de0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
0df0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
0e00: 22 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29  "\n");.  exit(1)
0e10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 6c 6c  ;.}../*.** Reall
0e20: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 20 20 53  ocate memory.  S
0e30: 68 6f 77 20 61 6e 64 20 65 72 72 6f 72 20 61 6e  how and error an
0e40: 64 20 71 75 69 74 20 69 66 20 75 6e 61 62 6c 65  d quit if unable
0e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0e60: 20 2a 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28 76   *safe_realloc(v
0e70: 6f 69 64 20 2a 70 4f 6c 64 2c 20 69 6e 74 20 73  oid *pOld, int s
0e80: 7a 4e 65 77 29 7b 0a 20 20 76 6f 69 64 20 2a 70  zNew){.  void *p
0e90: 4e 65 77 20 3d 20 72 65 61 6c 6c 6f 63 28 70 4f  New = realloc(pO
0ea0: 6c 64 2c 20 73 7a 4e 65 77 29 3b 0a 20 20 69 66  ld, szNew);.  if
0eb0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 66 61 74 61  ( pNew==0 ) fata
0ec0: 6c 45 72 72 6f 72 28 22 75 6e 61 62 6c 65 20 74  lError("unable t
0ed0: 6f 20 72 65 61 6c 6c 6f 63 20 66 6f 72 20 25 64  o realloc for %d
0ee0: 20 62 79 74 65 73 22 2c 20 73 7a 4e 65 77 29 3b   bytes", szNew);
0ef0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
0f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
0f10: 69 7a 65 20 74 68 65 20 76 69 72 74 75 61 6c 20  ize the virtual 
0f20: 66 69 6c 65 20 73 79 73 74 65 6d 2e 0a 2a 2f 0a  file system..*/.
0f30: 73 74 61 74 69 63 20 76 6f 69 64 20 66 6f 72 6d  static void form
0f40: 61 74 56 66 73 28 76 6f 69 64 29 7b 0a 20 20 69  atVfs(void){.  i
0f50: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
0f60: 20 69 3c 4d 58 5f 46 49 4c 45 3b 20 69 2b 2b 29   i<MX_FILE; i++)
0f70: 7b 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69 5d  {.    g.aFile[i]
0f80: 2e 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 67 2e  .sz = -1;.    g.
0f90: 61 46 69 6c 65 5b 69 5d 2e 7a 46 69 6c 65 6e 61  aFile[i].zFilena
0fa0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 67 2e 61 46  me = 0;.    g.aF
0fb0: 69 6c 65 5b 69 5d 2e 61 20 3d 20 30 3b 0a 20 20  ile[i].a = 0;.  
0fc0: 20 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 6e 52 65    g.aFile[i].nRe
0fd0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  f = 0;.  }.}.../
0fe0: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
0ff0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
1000: 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
1010: 79 73 74 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  ystem..*/.static
1020: 20 76 6f 69 64 20 72 65 66 6f 72 6d 61 74 56 66   void reformatVf
1030: 73 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  s(void){.  int i
1040: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4d  ;.  for(i=0; i<M
1050: 58 5f 46 49 4c 45 3b 20 69 2b 2b 29 7b 0a 20 20  X_FILE; i++){.  
1060: 20 20 69 66 28 20 67 2e 61 46 69 6c 65 5b 69 5d    if( g.aFile[i]
1070: 2e 73 7a 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  .sz<0 ) continue
1080: 3b 0a 20 20 20 20 69 66 28 20 67 2e 61 46 69 6c  ;.    if( g.aFil
1090: 65 5b 69 5d 2e 7a 46 69 6c 65 6e 61 6d 65 20 29  e[i].zFilename )
10a0: 7b 0a 20 20 20 20 20 20 66 72 65 65 28 67 2e 61  {.      free(g.a
10b0: 46 69 6c 65 5b 69 5d 2e 7a 46 69 6c 65 6e 61 6d  File[i].zFilenam
10c0: 65 29 3b 0a 20 20 20 20 20 20 67 2e 61 46 69 6c  e);.      g.aFil
10d0: 65 5b 69 5d 2e 7a 46 69 6c 65 6e 61 6d 65 20 3d  e[i].zFilename =
10e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
10f0: 28 20 67 2e 61 46 69 6c 65 5b 69 5d 2e 6e 52 65  ( g.aFile[i].nRe
1100: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 66 61 74  f>0 ){.      fat
1110: 61 6c 45 72 72 6f 72 28 22 66 69 6c 65 20 25 64  alError("file %d
1120: 20 73 74 69 6c 6c 20 6f 70 65 6e 2e 20 20 6e 52   still open.  nR
1130: 65 66 3d 25 64 22 2c 20 69 2c 20 67 2e 61 46 69  ef=%d", i, g.aFi
1140: 6c 65 5b 69 5d 2e 6e 52 65 66 29 3b 0a 20 20 20  le[i].nRef);.   
1150: 20 7d 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69   }.    g.aFile[i
1160: 5d 2e 73 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 66  ].sz = -1;.    f
1170: 72 65 65 28 67 2e 61 46 69 6c 65 5b 69 5d 2e 61  ree(g.aFile[i].a
1180: 29 3b 0a 20 20 20 20 67 2e 61 46 69 6c 65 5b 69  );.    g.aFile[i
1190: 5d 2e 61 20 3d 20 30 3b 0a 20 20 20 20 67 2e 61  ].a = 0;.    g.a
11a0: 46 69 6c 65 5b 69 5d 2e 6e 52 65 66 20 3d 20 30  File[i].nRef = 0
11b0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
11c0: 69 6e 64 20 61 20 56 46 69 6c 65 20 62 79 20 6e  ind a VFile by n
11d0: 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20 56 46  ame.*/.static VF
11e0: 69 6c 65 20 2a 66 69 6e 64 56 46 69 6c 65 28 63  ile *findVFile(c
11f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1200: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1210: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
1220: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
1230: 3b 20 69 3c 4d 58 5f 46 49 4c 45 3b 20 69 2b 2b  ; i<MX_FILE; i++
1240: 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 61 46 69  ){.    if( g.aFi
1250: 6c 65 5b 69 5d 2e 7a 46 69 6c 65 6e 61 6d 65 3d  le[i].zFilename=
1260: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =0 ) continue;  
1270: 20 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70   .    if( strcmp
1280: 28 67 2e 61 46 69 6c 65 5b 69 5d 2e 7a 46 69 6c  (g.aFile[i].zFil
1290: 65 6e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  ename, zName)==0
12a0: 20 29 20 72 65 74 75 72 6e 20 26 67 2e 61 46 69   ) return &g.aFi
12b0: 6c 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  le[i];.  }.  ret
12c0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
12d0: 46 69 6e 64 20 61 20 56 46 69 6c 65 20 62 79 20  Find a VFile by 
12e0: 6e 61 6d 65 2e 20 20 43 72 65 61 74 65 20 69 74  name.  Create it
12f0: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
1300: 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 61 6e  already exist an
1310: 64 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20  d.** initialize 
1320: 69 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 61  it to the size a
1330: 6e 64 20 63 6f 6e 74 65 6e 74 20 67 69 76 65 6e  nd content given
1340: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  ..**.** Return N
1350: 55 4c 4c 20 6f 6e 6c 79 20 69 66 20 74 68 65 20  ULL only if the 
1360: 66 69 6c 65 73 79 73 74 65 6d 20 69 73 20 66 75  filesystem is fu
1370: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 56 46  ll..*/.static VF
1380: 69 6c 65 20 2a 63 72 65 61 74 65 56 46 69 6c 65  ile *createVFile
1390: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
13a0: 6d 65 2c 20 69 6e 74 20 73 7a 2c 20 75 6e 73 69  me, int sz, unsi
13b0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
13c0: 29 7b 0a 20 20 56 46 69 6c 65 20 2a 70 4e 65 77  ){.  VFile *pNew
13d0: 20 3d 20 66 69 6e 64 56 46 69 6c 65 28 7a 4e 61   = findVFile(zNa
13e0: 6d 65 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me);.  int i;.  
13f0: 69 66 28 20 70 4e 65 77 20 29 20 72 65 74 75 72  if( pNew ) retur
1400: 6e 20 70 4e 65 77 3b 0a 20 20 66 6f 72 28 69 3d  n pNew;.  for(i=
1410: 30 3b 20 69 3c 4d 58 5f 46 49 4c 45 20 26 26 20  0; i<MX_FILE && 
1420: 67 2e 61 46 69 6c 65 5b 69 5d 2e 73 7a 3e 3d 30  g.aFile[i].sz>=0
1430: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 69  ; i++){}.  if( i
1440: 3e 3d 4d 58 5f 46 49 4c 45 20 29 20 72 65 74 75  >=MX_FILE ) retu
1450: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 26  rn 0;.  pNew = &
1460: 67 2e 61 46 69 6c 65 5b 69 5d 3b 0a 20 20 69 66  g.aFile[i];.  if
1470: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 70  ( zName ){.    p
1480: 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  New->zFilename =
1490: 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28 30 2c   safe_realloc(0,
14a0: 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31   strlen(zName)+1
14b0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4e  );.    memcpy(pN
14c0: 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  ew->zFilename, z
14d0: 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28 7a 4e 61  Name, strlen(zNa
14e0: 6d 65 29 2b 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  me)+1);.  }else{
14f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  .    pNew->zFile
1500: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  name = 0;.  }.  
1510: 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a  pNew->nRef = 0;.
1520: 20 20 70 4e 65 77 2d 3e 73 7a 20 3d 20 73 7a 3b    pNew->sz = sz;
1530: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 61 66  .  pNew->a = saf
1540: 65 5f 72 65 61 6c 6c 6f 63 28 30 2c 20 73 7a 29  e_realloc(0, sz)
1550: 3b 0a 20 20 69 66 28 20 73 7a 3e 30 20 29 20 6d  ;.  if( sz>0 ) m
1560: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 61 2c 20 70  emcpy(pNew->a, p
1570: 44 61 74 61 2c 20 73 7a 29 3b 0a 20 20 72 65 74  Data, sz);.  ret
1580: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a  urn pNew;.}.../*
1590: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
15a0: 6f 6e 20 6f 66 20 74 68 65 20 22 72 65 61 64 66  on of the "readf
15b0: 69 6c 65 28 58 29 22 20 53 51 4c 20 66 75 6e 63  ile(X)" SQL func
15c0: 74 69 6f 6e 2e 20 20 54 68 65 20 65 6e 74 69 72  tion.  The entir
15d0: 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20  e content.** of 
15e0: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 58  the file named X
15f0: 20 69 73 20 72 65 61 64 20 61 6e 64 20 72 65 74   is read and ret
1600: 75 72 6e 65 64 20 61 73 20 61 20 42 4c 4f 42 2e  urned as a BLOB.
1610: 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
1620: 65 64 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  ed.** if the fil
1630: 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
1640: 20 6f 72 20 69 73 20 75 6e 72 65 61 64 61 62 6c   or is unreadabl
1650: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1660: 64 20 72 65 61 64 66 69 6c 65 46 75 6e 63 28 0a  d readfileFunc(.
1670: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1680: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
1690: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
16a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
16b0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
16c0: 7a 4e 61 6d 65 3b 0a 20 20 46 49 4c 45 20 2a 69  zName;.  FILE *i
16d0: 6e 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20  n;.  long nIn;. 
16e0: 20 76 6f 69 64 20 2a 70 42 75 66 3b 0a 0a 20 20   void *pBuf;..  
16f0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
1700: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
1710: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
1720: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
1730: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 20   ) return;.  in 
1740: 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22  = fopen(zName, "
1750: 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
1760: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 73  0 ) return;.  fs
1770: 65 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f  eek(in, 0, SEEK_
1780: 45 4e 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74  END);.  nIn = ft
1790: 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e  ell(in);.  rewin
17a0: 64 28 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20  d(in);.  pBuf = 
17b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
17c0: 28 20 6e 49 6e 20 29 3b 0a 20 20 69 66 28 20 70  ( nIn );.  if( p
17d0: 42 75 66 20 26 26 20 31 3d 3d 66 72 65 61 64 28  Buf && 1==fread(
17e0: 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e  pBuf, nIn, 1, in
17f0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1800: 5f 72 65 73 75 6c 74 5f 62 6c 6f 62 28 63 6f 6e  _result_blob(con
1810: 74 65 78 74 2c 20 70 42 75 66 2c 20 6e 49 6e 2c  text, pBuf, nIn,
1820: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
1830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1840: 69 74 65 33 5f 66 72 65 65 28 70 42 75 66 29 3b  ite3_free(pBuf);
1850: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e  .  }.  fclose(in
1860: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64  );.}../*.** Load
1870: 20 61 20 6c 69 73 74 20 6f 66 20 42 6c 6f 62 20   a list of Blob 
1880: 6f 62 6a 65 63 74 73 20 66 72 6f 6d 20 74 68 65  objects from the
1890: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61   database.*/.sta
18a0: 74 69 63 20 76 6f 69 64 20 62 6c 6f 62 4c 69 73  tic void blobLis
18b0: 74 4c 6f 61 64 46 72 6f 6d 44 62 28 0a 20 20 73  tLoadFromDb(.  s
18c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
18d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
18e0: 66 72 6f 6d 20 74 68 69 73 20 64 61 74 61 62 61  from this databa
18f0: 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  se */.  const ch
1900: 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20 20 20 20  ar *zSql,       
1910: 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74   /* Query used t
1920: 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 62 6c  o extract the bl
1930: 6f 62 73 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c  obs */.  int onl
1940: 79 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  yId,            
1950: 20 20 2f 2a 20 4f 6e 6c 79 20 6c 6f 61 64 20 77    /* Only load w
1960: 68 65 72 65 20 69 64 20 69 73 20 74 68 69 73 20  here id is this 
1970: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
1980: 70 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pN,             
1990: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 72 69 74      /* OUT: Writ
19a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 62  e number of blob
19b0: 73 20 6c 6f 61 64 65 64 20 68 65 72 65 20 2a 2f  s loaded here */
19c0: 0a 20 20 42 6c 6f 62 20 2a 2a 70 70 4c 69 73 74  .  Blob **ppList
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
19e0: 55 54 3a 20 57 72 69 74 65 20 74 68 65 20 68 65  UT: Write the he
19f0: 61 64 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 6c  ad of the blob l
1a00: 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
1a10: 20 42 6c 6f 62 20 68 65 61 64 3b 0a 20 20 42 6c   Blob head;.  Bl
1a20: 6f 62 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  ob *p;.  sqlite3
1a30: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1a40: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  int n = 0;.  int
1a50: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 32 3b   rc;.  char *z2;
1a60: 0a 0a 20 20 69 66 28 20 6f 6e 6c 79 49 64 3e 30  ..  if( onlyId>0
1a70: 20 29 7b 0a 20 20 20 20 7a 32 20 3d 20 73 71 6c   ){.    z2 = sql
1a80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1a90: 20 57 48 45 52 45 20 72 6f 77 69 64 3d 25 64 22   WHERE rowid=%d"
1aa0: 2c 20 7a 53 71 6c 2c 20 6f 6e 6c 79 49 64 29 3b  , zSql, onlyId);
1ab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 32  .  }else{.    z2
1ac0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1ad0: 74 66 28 22 25 73 22 2c 20 7a 53 71 6c 29 3b 0a  tf("%s", zSql);.
1ae0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1af0: 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1b00: 2c 20 7a 32 2c 20 2d 31 2c 20 26 70 53 74 6d 74  , z2, -1, &pStmt
1b10: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
1b20: 66 72 65 65 28 7a 32 29 3b 0a 20 20 69 66 28 20  free(z2);.  if( 
1b30: 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  rc ) fatalError(
1b40: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  "%s", sqlite3_er
1b50: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 68 65 61  rmsg(db));.  hea
1b60: 64 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  d.pNext = 0;.  p
1b70: 20 3d 20 26 68 65 61 64 3b 0a 20 20 77 68 69 6c   = &head;.  whil
1b80: 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
1b90: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1ba0: 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  t) ){.    int sz
1bb0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1bc0: 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31  n_bytes(pStmt, 1
1bd0: 29 3b 0a 20 20 20 20 42 6c 6f 62 20 2a 70 4e 65  );.    Blob *pNe
1be0: 77 20 3d 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63  w = safe_realloc
1bf0: 28 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  (0, sizeof(*pNew
1c00: 29 2b 73 7a 20 29 3b 0a 20 20 20 20 70 4e 65 77  )+sz );.    pNew
1c10: 2d 3e 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ->id = sqlite3_c
1c20: 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
1c30: 20 30 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73   0);.    pNew->s
1c40: 7a 20 3d 20 73 7a 3b 0a 20 20 20 20 70 4e 65 77  z = sz;.    pNew
1c50: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  ->pNext = 0;.   
1c60: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 61 2c   memcpy(pNew->a,
1c70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c80: 62 6c 6f 62 28 70 53 74 6d 74 2c 31 29 2c 20 73  blob(pStmt,1), s
1c90: 7a 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  z);.    pNew->a[
1ca0: 73 7a 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  sz] = 0;.    p->
1cb0: 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
1cc0: 20 20 70 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20    p = pNew;.    
1cd0: 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n++;.  }.  sqlit
1ce0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1cf0: 74 29 3b 0a 20 20 2a 70 4e 20 3d 20 6e 3b 0a 20  t);.  *pN = n;. 
1d00: 20 2a 70 70 4c 69 73 74 20 3d 20 68 65 61 64 2e   *ppList = head.
1d10: 70 4e 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pNext;.}../*.** 
1d20: 46 72 65 65 20 61 20 6c 69 73 74 20 6f 66 20 42  Free a list of B
1d30: 6c 6f 62 20 6f 62 6a 65 63 74 73 0a 2a 2f 0a 73  lob objects.*/.s
1d40: 74 61 74 69 63 20 76 6f 69 64 20 62 6c 6f 62 4c  tatic void blobL
1d50: 69 73 74 46 72 65 65 28 42 6c 6f 62 20 2a 70 29  istFree(Blob *p)
1d60: 7b 0a 20 20 42 6c 6f 62 20 2a 70 4e 65 78 74 3b  {.  Blob *pNext;
1d70: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
1d80: 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e     pNext = p->pN
1d90: 65 78 74 3b 0a 20 20 20 20 66 72 65 65 28 70 29  ext;.    free(p)
1da0: 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b  ;.    p = pNext;
1db0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 52 65 74 75  .  }.}.../* Retu
1dc0: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  rn the current w
1dd0: 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 2a  all-clock time *
1de0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1df0: 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44 61 79  _int64 timeOfDay
1e00: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1e10: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 63 6c   sqlite3_vfs *cl
1e20: 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20 73 71  ockVfs = 0;.  sq
1e30: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b 0a 20  lite3_int64 t;. 
1e40: 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d 3d 30   if( clockVfs==0
1e50: 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20 73 71   ) clockVfs = sq
1e60: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
1e70: 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  );.  if( clockVf
1e80: 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 31 20 26  s->iVersion>=1 &
1e90: 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72  & clockVfs->xCur
1ea0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21 3d 30  rentTimeInt64!=0
1eb0: 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73   ){.    clockVfs
1ec0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
1ed0: 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20 26 74  t64(clockVfs, &t
1ee0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ef0: 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20 63 6c  double r;.    cl
1f00: 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74  ockVfs->xCurrent
1f10: 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c 20 26  Time(clockVfs, &
1f20: 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73 71 6c  r);.    t = (sql
1f30: 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a 38 36  ite3_int64)(r*86
1f40: 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d 0a 20  400000.0);.  }. 
1f50: 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a 2f 2a   return t;.}../*
1f60: 20 4d 65 74 68 6f 64 73 20 66 6f 72 20 74 68 65   Methods for the
1f70: 20 56 48 61 6e 64 6c 65 20 6f 62 6a 65 63 74 0a   VHandle object.
1f80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1f90: 6d 65 6d 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  memClose(sqlite3
1fa0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1fb0: 20 56 48 61 6e 64 6c 65 20 2a 70 20 3d 20 28 56   VHandle *p = (V
1fc0: 48 61 6e 64 6c 65 2a 29 70 46 69 6c 65 3b 0a 20  Handle*)pFile;. 
1fd0: 20 56 46 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d   VFile *pVFile =
1fe0: 20 70 2d 3e 70 56 46 69 6c 65 3b 0a 20 20 70 56   p->pVFile;.  pV
1ff0: 46 69 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  File->nRef--;.  
2000: 69 66 28 20 70 56 46 69 6c 65 2d 3e 6e 52 65 66  if( pVFile->nRef
2010: 3d 3d 30 20 26 26 20 70 56 46 69 6c 65 2d 3e 7a  ==0 && pVFile->z
2020: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
2030: 20 20 20 70 56 46 69 6c 65 2d 3e 73 7a 20 3d 20     pVFile->sz = 
2040: 2d 31 3b 0a 20 20 20 20 66 72 65 65 28 70 56 46  -1;.    free(pVF
2050: 69 6c 65 2d 3e 61 29 3b 0a 20 20 20 20 70 56 46  ile->a);.    pVF
2060: 69 6c 65 2d 3e 61 20 3d 20 30 3b 0a 20 20 7d 0a  ile->a = 0;.  }.
2070: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2080: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
2090: 20 69 6e 6d 65 6d 52 65 61 64 28 0a 20 20 73 71   inmemRead(.  sq
20a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
20b0: 65 2c 20 20 20 2f 2a 20 52 65 61 64 20 66 72 6f  e,   /* Read fro
20c0: 6d 20 74 68 69 73 20 6f 70 65 6e 20 66 69 6c 65  m this open file
20d0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74   */.  void *pDat
20e0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
20f0: 53 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 69 6e  Store content in
2100: 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
2110: 20 20 69 6e 74 20 69 41 6d 74 2c 20 20 20 20 20    int iAmt,     
2120: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
2130: 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  s of content */.
2140: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
2150: 69 4f 66 73 74 20 20 20 20 2f 2a 20 53 74 61 72  iOfst    /* Star
2160: 74 20 72 65 61 64 69 6e 67 20 68 65 72 65 20 2a  t reading here *
2170: 2f 0a 29 7b 0a 20 20 56 48 61 6e 64 6c 65 20 2a  /.){.  VHandle *
2180: 70 48 61 6e 64 6c 65 20 3d 20 28 56 48 61 6e 64  pHandle = (VHand
2190: 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 56 46 69  le*)pFile;.  VFi
21a0: 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20 70 48 61  le *pVFile = pHa
21b0: 6e 64 6c 65 2d 3e 70 56 46 69 6c 65 3b 0a 20 20  ndle->pVFile;.  
21c0: 69 66 28 20 69 4f 66 73 74 3c 30 20 7c 7c 20 69  if( iOfst<0 || i
21d0: 4f 66 73 74 3e 3d 70 56 46 69 6c 65 2d 3e 73 7a  Ofst>=pVFile->sz
21e0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
21f0: 44 61 74 61 2c 20 30 2c 20 69 41 6d 74 29 3b 0a  Data, 0, iAmt);.
2200: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2210: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
2220: 41 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4f  AD;.  }.  if( iO
2230: 66 73 74 2b 69 41 6d 74 3e 70 56 46 69 6c 65 2d  fst+iAmt>pVFile-
2240: 3e 73 7a 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  >sz ){.    memse
2250: 74 28 70 44 61 74 61 2c 20 30 2c 20 69 41 6d 74  t(pData, 0, iAmt
2260: 29 3b 0a 20 20 20 20 69 41 6d 74 20 3d 20 70 56  );.    iAmt = pV
2270: 46 69 6c 65 2d 3e 73 7a 20 2d 20 69 4f 66 73 74  File->sz - iOfst
2280: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
2290: 74 61 2c 20 70 56 46 69 6c 65 2d 3e 61 2c 20 69  ta, pVFile->a, i
22a0: 41 6d 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Amt);.    return
22b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
22c0: 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20  ORT_READ;.  }.  
22d0: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 56  memcpy(pData, pV
22e0: 46 69 6c 65 2d 3e 61 2c 20 69 41 6d 74 29 3b 0a  File->a, iAmt);.
22f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2300: 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
2310: 20 69 6e 6d 65 6d 57 72 69 74 65 28 0a 20 20 73   inmemWrite(.  s
2320: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2330: 6c 65 2c 20 20 20 2f 2a 20 57 72 69 74 65 20 74  le,   /* Write t
2340: 6f 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  o this file */. 
2350: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61   const void *pDa
2360: 74 61 2c 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  ta,     /* Conte
2370: 6e 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  nt to write */. 
2380: 20 69 6e 74 20 69 41 6d 74 2c 20 20 20 20 20 20   int iAmt,      
2390: 20 20 20 20 20 20 20 20 2f 2a 20 62 79 74 65 73          /* bytes
23a0: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
23b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66  qlite3_int64 iOf
23c0: 73 74 20 20 20 20 2f 2a 20 53 74 61 72 74 20 77  st    /* Start w
23d0: 72 69 74 69 6e 67 20 68 65 72 65 20 2a 2f 0a 29  riting here */.)
23e0: 7b 0a 20 20 56 48 61 6e 64 6c 65 20 2a 70 48 61  {.  VHandle *pHa
23f0: 6e 64 6c 65 20 3d 20 28 56 48 61 6e 64 6c 65 2a  ndle = (VHandle*
2400: 29 70 46 69 6c 65 3b 0a 20 20 56 46 69 6c 65 20  )pFile;.  VFile 
2410: 2a 70 56 46 69 6c 65 20 3d 20 70 48 61 6e 64 6c  *pVFile = pHandl
2420: 65 2d 3e 70 56 46 69 6c 65 3b 0a 20 20 69 66 28  e->pVFile;.  if(
2430: 20 69 4f 66 73 74 2b 69 41 6d 74 20 3e 20 70 56   iOfst+iAmt > pV
2440: 46 69 6c 65 2d 3e 73 7a 20 29 7b 0a 20 20 20 20  File->sz ){.    
2450: 69 66 28 20 69 4f 66 73 74 2b 69 41 6d 74 20 3e  if( iOfst+iAmt >
2460: 3d 20 4d 58 5f 46 49 4c 45 5f 53 5a 20 29 7b 0a  = MX_FILE_SZ ){.
2470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2480: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
2490: 20 20 20 20 70 56 46 69 6c 65 2d 3e 61 20 3d 20      pVFile->a = 
24a0: 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28 70 56 46  safe_realloc(pVF
24b0: 69 6c 65 2d 3e 61 2c 20 69 4f 66 73 74 2b 69 41  ile->a, iOfst+iA
24c0: 6d 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  mt);.    memset(
24d0: 70 56 46 69 6c 65 2d 3e 61 20 2b 20 70 56 46 69  pVFile->a + pVFi
24e0: 6c 65 2d 3e 73 7a 2c 20 30 2c 20 69 4f 66 73 74  le->sz, 0, iOfst
24f0: 20 2d 20 70 56 46 69 6c 65 2d 3e 73 7a 29 3b 0a   - pVFile->sz);.
2500: 20 20 20 20 70 56 46 69 6c 65 2d 3e 73 7a 20 3d      pVFile->sz =
2510: 20 69 4f 66 73 74 20 2b 20 69 41 6d 74 3b 0a 20   iOfst + iAmt;. 
2520: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 56 46 69   }.  memcpy(pVFi
2530: 6c 65 2d 3e 61 20 2b 20 69 4f 66 73 74 2c 20 70  le->a + iOfst, p
2540: 44 61 74 61 2c 20 69 41 6d 74 29 3b 0a 20 20 72  Data, iAmt);.  r
2550: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2560: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  .}.static int in
2570: 6d 65 6d 54 72 75 6e 63 61 74 65 28 73 71 6c 69  memTruncate(sqli
2580: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
2590: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
25a0: 53 69 7a 65 29 7b 0a 20 20 56 48 61 6e 64 6c 65  Size){.  VHandle
25b0: 20 2a 70 48 61 6e 64 6c 65 20 3d 20 28 56 48 61   *pHandle = (VHa
25c0: 6e 64 6c 65 2a 29 70 46 69 6c 65 3b 0a 20 20 56  ndle*)pFile;.  V
25d0: 46 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20 70  File *pVFile = p
25e0: 48 61 6e 64 6c 65 2d 3e 70 56 46 69 6c 65 3b 0a  Handle->pVFile;.
25f0: 20 20 69 66 28 20 70 56 46 69 6c 65 2d 3e 73 7a    if( pVFile->sz
2600: 3e 69 53 69 7a 65 20 26 26 20 69 53 69 7a 65 3e  >iSize && iSize>
2610: 3d 30 20 29 20 70 56 46 69 6c 65 2d 3e 73 7a 20  =0 ) pVFile->sz 
2620: 3d 20 69 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  = iSize;.  retur
2630: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
2640: 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 53  tatic int inmemS
2650: 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
2660: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *pFile, int fla
2670: 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  gs){.  return SQ
2680: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
2690: 63 20 69 6e 74 20 69 6e 6d 65 6d 46 69 6c 65 53  c int inmemFileS
26a0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
26b0: 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33   *pFile, sqlite3
26c0: 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
26d0: 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 56 48 61    *pSize = ((VHa
26e0: 6e 64 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 70 56  ndle*)pFile)->pV
26f0: 46 69 6c 65 2d 3e 73 7a 3b 0a 20 20 72 65 74 75  File->sz;.  retu
2700: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2710: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d  static int inmem
2720: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
2730: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 74 79  e *pFile, int ty
2740: 70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  pe){.  return SQ
2750: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
2760: 63 20 69 6e 74 20 69 6e 6d 65 6d 55 6e 6c 6f 63  c int inmemUnloc
2770: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
2780: 70 46 69 6c 65 2c 20 69 6e 74 20 74 79 70 65 29  pFile, int type)
2790: 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
27a0: 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
27b0: 6e 74 20 69 6e 6d 65 6d 43 68 65 63 6b 52 65 73  nt inmemCheckRes
27c0: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
27d0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
27e0: 6e 74 20 2a 70 4f 75 74 29 7b 0a 20 20 2a 70 4f  nt *pOut){.  *pO
27f0: 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ut = 0;.  return
2800: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74   SQLITE_OK;.}.st
2810: 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d 46 69  atic int inmemFi
2820: 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
2830: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
2840: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
2850: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g){.  return SQL
2860: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
2870: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65 6d  static int inmem
2880: 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
2890: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b  e3_file *pFile){
28a0: 0a 20 20 72 65 74 75 72 6e 20 35 31 32 3b 0a 7d  .  return 512;.}
28b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d 65  .static int inme
28c0: 6d 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  mDeviceCharacter
28d0: 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
28e0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 72  ile *pFile){.  r
28f0: 65 74 75 72 6e 0a 20 20 20 20 20 20 53 51 4c 49  eturn.      SQLI
2900: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
2910: 50 45 4e 44 20 7c 0a 20 20 20 20 20 20 53 51 4c  PEND |.      SQL
2920: 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
2930: 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
2940: 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49  |.      SQLITE_I
2950: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
2960: 56 45 52 57 52 49 54 45 3b 0a 7d 0a 0a 0a 2f 2a  VERWRITE;.}.../*
2970: 20 4d 65 74 68 6f 64 20 74 61 62 6c 65 20 66 6f   Method table fo
2980: 72 20 56 48 61 6e 64 6c 65 0a 2a 2f 0a 73 74 61  r VHandle.*/.sta
2990: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  tic sqlite3_io_m
29a0: 65 74 68 6f 64 73 20 56 48 61 6e 64 6c 65 4d 65  ethods VHandleMe
29b0: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 2f 2a 20 69  thods = {.  /* i
29c0: 56 65 72 73 69 6f 6e 20 20 2a 2f 20 20 20 20 31  Version  */    1
29d0: 2c 0a 20 20 2f 2a 20 78 43 6c 6f 73 65 20 20 20  ,.  /* xClose   
29e0: 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 43 6c 6f 73   */    inmemClos
29f0: 65 2c 0a 20 20 2f 2a 20 78 52 65 61 64 20 20 20  e,.  /* xRead   
2a00: 20 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 52 65 61    */    inmemRea
2a10: 64 2c 0a 20 20 2f 2a 20 78 57 72 69 74 65 20 20  d,.  /* xWrite  
2a20: 20 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 57 72 69    */    inmemWri
2a30: 74 65 2c 0a 20 20 2f 2a 20 78 54 72 75 6e 63 61  te,.  /* xTrunca
2a40: 74 65 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 54 72  te */    inmemTr
2a50: 75 6e 63 61 74 65 2c 0a 20 20 2f 2a 20 78 53 79  uncate,.  /* xSy
2a60: 6e 63 20 20 20 20 20 2a 2f 20 20 20 20 69 6e 6d  nc     */    inm
2a70: 65 6d 53 79 6e 63 2c 0a 20 20 2f 2a 20 78 46 69  emSync,.  /* xFi
2a80: 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 69 6e 6d  leSize */    inm
2a90: 65 6d 46 69 6c 65 53 69 7a 65 2c 0a 20 20 2f 2a  emFileSize,.  /*
2aa0: 20 78 4c 6f 63 6b 20 20 20 20 20 2a 2f 20 20 20   xLock     */   
2ab0: 20 69 6e 6d 65 6d 4c 6f 63 6b 2c 0a 20 20 2f 2a   inmemLock,.  /*
2ac0: 20 78 55 6e 6c 6f 63 6b 20 20 20 2a 2f 20 20 20   xUnlock   */   
2ad0: 20 69 6e 6d 65 6d 55 6e 6c 6f 63 6b 2c 0a 20 20   inmemUnlock,.  
2ae0: 2f 2a 20 78 43 68 65 63 6b 2e 2e 2e 20 2a 2f 20  /* xCheck... */ 
2af0: 20 20 20 69 6e 6d 65 6d 43 68 65 63 6b 52 65 73     inmemCheckRes
2b00: 65 72 76 65 64 4c 6f 63 6b 2c 0a 20 20 2f 2a 20  ervedLock,.  /* 
2b10: 78 46 69 6c 65 43 74 72 6c 20 2a 2f 20 20 20 20  xFileCtrl */    
2b20: 69 6e 6d 65 6d 46 69 6c 65 43 6f 6e 74 72 6f 6c  inmemFileControl
2b30: 2c 0a 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 7a  ,.  /* xSectorSz
2b40: 20 2a 2f 20 20 20 20 69 6e 6d 65 6d 53 65 63 74   */    inmemSect
2b50: 6f 72 53 69 7a 65 2c 0a 20 20 2f 2a 20 78 44 65  orSize,.  /* xDe
2b60: 76 63 68 61 72 20 20 2a 2f 20 20 20 20 69 6e 6d  vchar  */    inm
2b70: 65 6d 44 65 76 69 63 65 43 68 61 72 61 63 74 65  emDeviceCharacte
2b80: 72 69 73 74 69 63 73 2c 0a 20 20 2f 2a 20 78 53  ristics,.  /* xS
2b90: 68 6d 4d 61 70 20 20 20 2a 2f 20 20 20 20 30 2c  hmMap   */    0,
2ba0: 0a 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 20  .  /* xShmLock  
2bb0: 2a 2f 20 20 20 20 30 2c 0a 20 20 2f 2a 20 78 53  */    0,.  /* xS
2bc0: 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 30 2c  hmBarrier */  0,
2bd0: 0a 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20  .  /* xShmUnmap 
2be0: 2a 2f 20 20 20 20 30 2c 0a 20 20 2f 2a 20 78 46  */    0,.  /* xF
2bf0: 65 74 63 68 20 20 20 20 2a 2f 20 20 20 20 30 2c  etch    */    0,
2c00: 0a 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 20  .  /* xUnfetch  
2c10: 2a 2f 20 20 20 20 30 0a 7d 3b 0a 0a 2f 2a 0a 2a  */    0.};../*.*
2c20: 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  * Open a new fil
2c30: 65 20 69 6e 20 74 68 65 20 69 6e 6d 65 6d 20 56  e in the inmem V
2c40: 46 53 2e 20 20 41 6c 6c 20 66 69 6c 65 73 20 61  FS.  All files a
2c50: 72 65 20 61 6e 6f 6e 79 6d 6f 75 73 20 61 6e 64  re anonymous and
2c60: 20 61 72 65 0a 2a 2a 20 64 65 6c 65 74 65 2d 6f   are.** delete-o
2c70: 6e 2d 63 6c 6f 73 65 2e 0a 2a 2f 0a 73 74 61 74  n-close..*/.stat
2c80: 69 63 20 69 6e 74 20 69 6e 6d 65 6d 4f 70 65 6e  ic int inmemOpen
2c90: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2ca0: 2a 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63  *pVfs,.  const c
2cb0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a  har *zFilename,.
2cc0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2cd0: 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 6f 70 65  pFile,.  int ope
2ce0: 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70  nFlags,.  int *p
2cf0: 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 56 46  OutFlags.){.  VF
2d00: 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20 63 72  ile *pVFile = cr
2d10: 65 61 74 65 56 46 69 6c 65 28 7a 46 69 6c 65 6e  eateVFile(zFilen
2d20: 61 6d 65 2c 20 30 2c 20 28 75 6e 73 69 67 6e 65  ame, 0, (unsigne
2d30: 64 20 63 68 61 72 2a 29 22 22 29 3b 0a 20 20 56  d char*)"");.  V
2d40: 48 61 6e 64 6c 65 20 2a 70 48 61 6e 64 6c 65 20  Handle *pHandle 
2d50: 3d 20 28 56 48 61 6e 64 6c 65 2a 29 70 46 69 6c  = (VHandle*)pFil
2d60: 65 3b 0a 20 20 69 66 28 20 70 56 46 69 6c 65 3d  e;.  if( pVFile=
2d70: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2d80: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
2d90: 7d 0a 20 20 70 48 61 6e 64 6c 65 2d 3e 70 56 46  }.  pHandle->pVF
2da0: 69 6c 65 20 3d 20 70 56 46 69 6c 65 3b 0a 20 20  ile = pVFile;.  
2db0: 70 56 46 69 6c 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  pVFile->nRef++;.
2dc0: 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
2dd0: 73 20 3d 20 26 56 48 61 6e 64 6c 65 4d 65 74 68  s = &VHandleMeth
2de0: 6f 64 73 3b 0a 20 20 69 66 28 20 70 4f 75 74 46  ods;.  if( pOutF
2df0: 6c 61 67 73 20 29 20 2a 70 4f 75 74 46 6c 61 67  lags ) *pOutFlag
2e00: 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20  s = openFlags;. 
2e10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e20: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  K;.}../*.** Dele
2e30: 74 65 20 61 20 66 69 6c 65 20 62 79 20 6e 61 6d  te a file by nam
2e40: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
2e50: 69 6e 6d 65 6d 44 65 6c 65 74 65 28 0a 20 20 73  inmemDelete(.  s
2e60: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2e70: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2e80: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 69 6e 74  zFilename,.  int
2e90: 20 73 79 6e 63 64 69 72 0a 29 7b 0a 20 20 56 46   syncdir.){.  VF
2ea0: 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20 66 69  ile *pVFile = fi
2eb0: 6e 64 56 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d  ndVFile(zFilenam
2ec0: 65 29 3b 0a 20 20 69 66 28 20 70 56 46 69 6c 65  e);.  if( pVFile
2ed0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2ee0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 56  ITE_OK;.  if( pV
2ef0: 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  File->nRef==0 ){
2f00: 0a 20 20 20 20 66 72 65 65 28 70 56 46 69 6c 65  .    free(pVFile
2f10: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
2f20: 20 20 70 56 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e    pVFile->zFilen
2f30: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 56 46  ame = 0;.    pVF
2f40: 69 6c 65 2d 3e 73 7a 20 3d 20 2d 31 3b 0a 20 20  ile->sz = -1;.  
2f50: 20 20 66 72 65 65 28 70 56 46 69 6c 65 2d 3e 61    free(pVFile->a
2f60: 29 3b 0a 20 20 20 20 70 56 46 69 6c 65 2d 3e 61  );.    pVFile->a
2f70: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
2f80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2f90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fa0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 3b 0a 7d 0a  IOERR_DELETE;.}.
2fb0: 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68  ./* Check for th
2fc0: 65 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 61  e existance of a
2fd0: 20 66 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20   file.*/.static 
2fe0: 69 6e 74 20 69 6e 6d 65 6d 41 63 63 65 73 73 28  int inmemAccess(
2ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
3000: 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pVfs,.  const ch
3010: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  ar *zFilename,. 
3020: 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e   int flags,.  in
3030: 74 20 2a 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20  t *pResOut.){.  
3040: 56 46 69 6c 65 20 2a 70 56 46 69 6c 65 20 3d 20  VFile *pVFile = 
3050: 66 69 6e 64 56 46 69 6c 65 28 7a 46 69 6c 65 6e  findVFile(zFilen
3060: 61 6d 65 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  ame);.  *pResOut
3070: 20 3d 20 20 70 56 46 69 6c 65 21 3d 30 3b 0a 20   =  pVFile!=0;. 
3080: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3090: 4b 3b 0a 7d 0a 0a 2f 2a 20 47 65 74 20 74 68 65  K;.}../* Get the
30a0: 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e   canonical pathn
30b0: 61 6d 65 20 66 6f 72 20 61 20 66 69 6c 65 0a 2a  ame for a file.*
30c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 6d  /.static int inm
30d0: 65 6d 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  emFullPathname(.
30e0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
30f0: 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Vfs,.  const cha
3100: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  r *zFilename,.  
3110: 69 6e 74 20 6e 4f 75 74 2c 0a 20 20 63 68 61 72  int nOut,.  char
3120: 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20 73 71 6c 69   *zOut.){.  sqli
3130: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
3140: 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
3150: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
3160: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3170: 0a 0a 2f 2a 20 47 65 74 4c 61 73 74 45 72 72 6f  ../* GetLastErro
3180: 72 28 29 20 69 73 20 6e 65 76 65 72 20 75 73 65  r() is never use
3190: 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d */.static int 
31a0: 69 6e 6d 65 6d 47 65 74 4c 61 73 74 45 72 72 6f  inmemGetLastErro
31b0: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
31c0: 56 66 73 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  Vfs, int n, char
31d0: 20 2a 7a 29 7b 0a 20 20 72 65 74 75 72 6e 20 53   *z){.  return S
31e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
31f0: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
3200: 56 46 53 20 74 68 61 74 20 72 65 61 64 73 20 66  VFS that reads f
3210: 72 6f 6d 20 74 68 65 20 67 2e 61 46 69 6c 65 5b  rom the g.aFile[
3220: 5d 20 73 65 74 20 6f 66 20 66 69 6c 65 73 2e 0a  ] set of files..
3230: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3240: 6e 6d 65 6d 56 66 73 52 65 67 69 73 74 65 72 28  nmemVfsRegister(
3250: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
3260: 73 71 6c 69 74 65 33 5f 76 66 73 20 69 6e 6d 65  sqlite3_vfs inme
3270: 6d 56 66 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f  mVfs;.  sqlite3_
3280: 76 66 73 20 2a 70 44 65 66 61 75 6c 74 20 3d 20  vfs *pDefault = 
3290: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
32a0: 28 30 29 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e  (0);.  inmemVfs.
32b0: 69 56 65 72 73 69 6f 6e 20 3d 20 31 3b 0a 20 20  iVersion = 1;.  
32c0: 69 6e 6d 65 6d 56 66 73 2e 73 7a 4f 73 46 69 6c  inmemVfs.szOsFil
32d0: 65 20 3d 20 73 69 7a 65 6f 66 28 56 48 61 6e 64  e = sizeof(VHand
32e0: 6c 65 29 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e  le);.  inmemVfs.
32f0: 6d 78 50 61 74 68 6e 61 6d 65 20 3d 20 32 30 30  mxPathname = 200
3300: 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 7a 4e 61  ;.  inmemVfs.zNa
3310: 6d 65 20 3d 20 22 69 6e 6d 65 6d 22 3b 0a 20 20  me = "inmem";.  
3320: 69 6e 6d 65 6d 56 66 73 2e 78 4f 70 65 6e 20 3d  inmemVfs.xOpen =
3330: 20 69 6e 6d 65 6d 4f 70 65 6e 3b 0a 20 20 69 6e   inmemOpen;.  in
3340: 6d 65 6d 56 66 73 2e 78 44 65 6c 65 74 65 20 3d  memVfs.xDelete =
3350: 20 69 6e 6d 65 6d 44 65 6c 65 74 65 3b 0a 20 20   inmemDelete;.  
3360: 69 6e 6d 65 6d 56 66 73 2e 78 41 63 63 65 73 73  inmemVfs.xAccess
3370: 20 3d 20 69 6e 6d 65 6d 41 63 63 65 73 73 3b 0a   = inmemAccess;.
3380: 20 20 69 6e 6d 65 6d 56 66 73 2e 78 46 75 6c 6c    inmemVfs.xFull
3390: 50 61 74 68 6e 61 6d 65 20 3d 20 69 6e 6d 65 6d  Pathname = inmem
33a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 3b 0a 20 20  FullPathname;.  
33b0: 69 6e 6d 65 6d 56 66 73 2e 78 52 61 6e 64 6f 6d  inmemVfs.xRandom
33c0: 6e 65 73 73 20 3d 20 70 44 65 66 61 75 6c 74 2d  ness = pDefault-
33d0: 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 3b 0a 20 20  >xRandomness;.  
33e0: 69 6e 6d 65 6d 56 66 73 2e 78 53 6c 65 65 70 20  inmemVfs.xSleep 
33f0: 3d 20 70 44 65 66 61 75 6c 74 2d 3e 78 53 6c 65  = pDefault->xSle
3400: 65 70 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 2e 78  ep;.  inmemVfs.x
3410: 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 70 44  CurrentTime = pD
3420: 65 66 61 75 6c 74 2d 3e 78 43 75 72 72 65 6e 74  efault->xCurrent
3430: 54 69 6d 65 3b 0a 20 20 69 6e 6d 65 6d 56 66 73  Time;.  inmemVfs
3440: 2e 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 3d  .xGetLastError =
3450: 20 69 6e 6d 65 6d 47 65 74 4c 61 73 74 45 72 72   inmemGetLastErr
3460: 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  or;.  sqlite3_vf
3470: 73 5f 72 65 67 69 73 74 65 72 28 26 69 6e 6d 65  s_register(&inme
3480: 6d 56 66 73 2c 20 30 29 3b 0a 7d 3b 0a 0a 2f 2a  mVfs, 0);.};../*
3490: 0a 2a 2a 20 52 75 6e 20 6d 75 6c 74 69 70 6c 65  .** Run multiple
34a0: 20 63 6f 6d 6d 61 6e 64 73 20 6f 66 20 53 51 4c   commands of SQL
34b0: 2e 20 20 53 69 6d 69 6c 61 72 20 74 6f 20 73 71  .  Similar to sq
34c0: 6c 69 74 65 33 5f 65 78 65 63 28 29 2c 20 62 75  lite3_exec(), bu
34d0: 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 73 74  t does not.** st
34e0: 6f 70 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  op if an error i
34f0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  s encountered..*
3500: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 75  /.static void ru
3510: 6e 53 71 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  nSql(sqlite3 *db
3520: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
3530: 71 6c 2c 20 69 6e 74 20 74 72 61 63 65 46 6c 61  ql, int traceFla
3540: 67 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g){.  const char
3550: 20 2a 7a 4d 6f 72 65 3b 0a 20 20 73 71 6c 69 74   *zMore;.  sqlit
3560: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
3570: 0a 20 20 77 68 69 6c 65 28 20 7a 53 71 6c 20 26  .  while( zSql &
3580: 26 20 7a 53 71 6c 5b 30 5d 20 29 7b 0a 20 20 20  & zSql[0] ){.   
3590: 20 7a 4d 6f 72 65 20 3d 20 30 3b 0a 20 20 20 20   zMore = 0;.    
35a0: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 73  pStmt = 0;.    s
35b0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
35c0: 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
35d0: 26 70 53 74 6d 74 2c 20 26 7a 4d 6f 72 65 29 3b  &pStmt, &zMore);
35e0: 0a 20 20 20 20 69 66 28 20 7a 4d 6f 72 65 3d 3d  .    if( zMore==
35f0: 7a 53 71 6c 20 29 20 62 72 65 61 6b 3b 0a 20 20  zSql ) break;.  
3600: 20 20 69 66 28 20 74 72 61 63 65 46 6c 61 67 20    if( traceFlag 
3610: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
3620: 68 61 72 20 2a 7a 20 3d 20 7a 53 71 6c 3b 0a 20  har *z = zSql;. 
3630: 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
3640: 20 20 77 68 69 6c 65 28 20 7a 3c 7a 4d 6f 72 65    while( z<zMore
3650: 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 30 5d   && isspace(z[0]
3660: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 6e  ) ) z++;.      n
3670: 20 3d 20 28 69 6e 74 29 28 7a 4d 6f 72 65 20 2d   = (int)(zMore -
3680: 20 7a 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65   z);.      while
3690: 28 20 6e 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( n>0 && isspace
36a0: 28 7a 5b 6e 2d 31 5d 29 20 29 20 6e 2d 2d 3b 0a  (z[n-1]) ) n--;.
36b0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
36c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
36d0: 28 20 70 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  ( pStmt==0 ){.  
36e0: 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 54 52        printf("TR
36f0: 41 43 45 3a 20 25 2e 2a 73 20 28 65 72 72 6f 72  ACE: %.*s (error
3700: 3a 20 25 73 29 5c 6e 22 2c 20 6e 2c 20 7a 2c 20  : %s)\n", n, z, 
3710: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
3720: 62 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  b));.      }else
3730: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
3740: 28 22 54 52 41 43 45 3a 20 25 2e 2a 73 5c 6e 22  ("TRACE: %.*s\n"
3750: 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 7d  , n, z);.      }
3760: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20  .    }.    zSql 
3770: 3d 20 7a 4d 6f 72 65 3b 0a 20 20 20 20 69 66 28  = zMore;.    if(
3780: 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20   pStmt ){.      
3790: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
37a0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
37b0: 70 53 74 6d 74 29 20 29 7b 7d 0a 20 20 20 20 20  pStmt) ){}.     
37c0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
37d0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a  e(pStmt);.    }.
37e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69    }.}../*.** Pri
37f0: 6e 74 20 73 6b 65 74 63 68 79 20 64 6f 63 75 6d  nt sketchy docum
3800: 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  entation for thi
3810: 73 20 75 74 69 6c 69 74 79 20 70 72 6f 67 72 61  s utility progra
3820: 6d 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  m.*/.static void
3830: 20 73 68 6f 77 48 65 6c 70 28 76 6f 69 64 29 7b   showHelp(void){
3840: 0a 20 20 70 72 69 6e 74 66 28 22 55 73 61 67 65  .  printf("Usage
3850: 3a 20 25 73 20 5b 6f 70 74 69 6f 6e 73 5d 20 53  : %s [options] S
3860: 4f 55 52 43 45 2d 44 42 20 3f 41 52 47 53 2e 2e  OURCE-DB ?ARGS..
3870: 2e 3f 5c 6e 22 2c 20 67 2e 7a 41 72 67 76 30 29  .?\n", g.zArgv0)
3880: 3b 0a 20 20 70 72 69 6e 74 66 28 0a 22 52 65 61  ;.  printf(."Rea
3890: 64 20 64 61 74 61 62 61 73 65 73 20 61 6e 64 20  d databases and 
38a0: 53 51 4c 20 73 63 72 69 70 74 73 20 66 72 6f 6d  SQL scripts from
38b0: 20 53 4f 55 52 43 45 2d 44 42 20 61 6e 64 20 65   SOURCE-DB and e
38c0: 78 65 63 75 74 65 20 65 61 63 68 20 73 63 72 69  xecute each scri
38d0: 70 74 20 61 67 61 69 6e 73 74 5c 6e 22 0a 22 65  pt against\n"."e
38e0: 61 63 68 20 64 61 74 61 62 61 73 65 2c 20 63 68  ach database, ch
38f0: 65 63 6b 69 6e 67 20 66 6f 72 20 63 72 61 73 68  ecking for crash
3900: 65 73 20 61 6e 64 20 6d 65 6d 6f 72 79 20 6c 65  es and memory le
3910: 61 6b 73 2e 5c 6e 22 0a 22 4f 70 74 69 6f 6e 73  aks.\n"."Options
3920: 3a 5c 6e 22 0a 22 20 20 2d 2d 64 62 69 64 20 4e  :\n"."  --dbid N
3930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
3940: 65 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 62  e only the datab
3950: 61 73 65 20 77 68 65 72 65 20 64 62 69 64 3d 4e  ase where dbid=N
3960: 5c 6e 22 0a 22 20 20 2d 2d 68 65 6c 70 20 20 20  \n"."  --help   
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
3980: 77 20 74 68 69 73 20 68 65 6c 70 20 74 65 78 74  w this help text
3990: 5c 6e 22 20 20 20 20 0a 22 20 20 2d 71 20 20 20  \n"    ."  -q   
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39b0: 20 52 65 64 75 63 65 64 20 6f 75 74 70 75 74 5c   Reduced output\
39c0: 6e 22 0a 22 20 20 2d 2d 71 75 69 65 74 20 20 20  n"."  --quiet   
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 52 65 64 75              Redu
39e0: 63 65 64 20 6f 75 74 70 75 74 5c 6e 22 0a 22 20  ced output\n"." 
39f0: 20 2d 2d 6c 6f 61 64 2d 73 71 6c 20 41 52 47 53   --load-sql ARGS
3a00: 2e 2e 2e 20 20 20 20 4c 6f 61 64 20 53 51 4c 20  ...    Load SQL 
3a10: 73 63 72 69 70 74 73 20 66 72 6f 20 66 69 6c 65  scripts fro file
3a20: 73 20 69 6e 74 6f 20 53 4f 55 52 43 45 2d 44 42  s into SOURCE-DB
3a30: 5c 6e 22 0a 22 20 20 2d 2d 6c 6f 61 64 2d 64 62  \n"."  --load-db
3a40: 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 4c 6f 61   ARGS...     Loa
3a50: 64 20 74 65 6d 70 6c 61 74 65 20 64 61 74 61 62  d template datab
3a60: 61 73 65 73 20 66 72 6f 6d 20 66 69 6c 65 73 20  ases from files 
3a70: 69 6e 74 6f 20 53 4f 55 52 43 45 5f 44 42 5c 6e  into SOURCE_DB\n
3a80: 22 0a 22 20 20 2d 2d 6e 61 74 69 76 65 2d 76 66  "."  --native-vf
3a90: 73 20 20 20 20 20 20 20 20 20 20 55 73 65 20 74  s          Use t
3aa0: 68 65 20 6e 61 74 69 76 65 20 56 46 53 20 66 6f  he native VFS fo
3ab0: 72 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  r initially empt
3ac0: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
3ad0: 5c 6e 22 0a 22 20 20 2d 2d 73 71 6c 69 64 20 4e  \n"."  --sqlid N
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
3af0: 20 6f 6e 6c 79 20 53 51 4c 20 77 68 65 72 65 20   only SQL where 
3b00: 73 71 6c 69 64 3d 4e 5c 6e 22 0a 22 20 20 2d 76  sqlid=N\n"."  -v
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 20 20 20 20 49 6e 63 72 65 61 73 65 64 20 6f 75      Increased ou
3b30: 74 70 75 74 5c 6e 22 0a 22 20 20 2d 2d 76 65 72  tput\n"."  --ver
3b40: 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  bose            
3b50: 20 49 6e 63 72 65 61 73 65 64 20 6f 75 74 70 75   Increased outpu
3b60: 74 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 0a 69 6e 74  t\n".  );.}..int
3b70: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
3b80: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
3b90: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 42  sqlite3_int64 iB
3ba0: 65 67 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  egin;        /* 
3bb0: 53 74 61 72 74 20 74 69 6d 65 20 6f 66 20 74 68  Start time of th
3bc0: 69 73 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 20 20  is program */.  
3bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 6f 75  const char *zSou
3be0: 72 63 65 44 62 20 3d 20 30 3b 20 20 20 2f 2a 20  rceDb = 0;   /* 
3bf0: 53 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  Source database 
3c00: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  filename */.  in
3c10: 74 20 71 75 69 65 74 46 6c 61 67 20 3d 20 30 3b  t quietFlag = 0;
3c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3c30: 75 65 20 69 66 20 2d 2d 71 75 69 65 74 20 6f 72  ue if --quiet or
3c40: 20 2d 71 20 2a 2f 0a 20 20 69 6e 74 20 76 65 72   -q */.  int ver
3c50: 62 6f 73 65 46 6c 61 67 20 3d 20 30 3b 20 20 20  boseFlag = 0;   
3c60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3c70: 20 2d 2d 76 65 72 62 6f 73 65 20 6f 72 20 2d 76   --verbose or -v
3c80: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 49 6e 73   */.  char *zIns
3c90: 53 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sql = 0;        
3ca0: 20 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d     /* SQL statem
3cb0: 65 6e 74 20 66 6f 72 20 2d 2d 6c 6f 61 64 2d 64  ent for --load-d
3cc0: 62 20 6f 72 20 2d 2d 6c 6f 61 64 2d 73 71 6c 20  b or --load-sql 
3cd0: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 49  */.  int iFirstI
3ce0: 6e 73 41 72 67 20 3d 20 30 3b 20 20 20 20 20 20  nsArg = 0;      
3cf0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 76 5b    /* First argv[
3d00: 5d 20 74 6f 20 75 73 65 20 66 6f 72 20 2d 2d 6c  ] to use for --l
3d10: 6f 61 64 2d 64 62 20 6f 72 20 2d 2d 6c 6f 61 64  oad-db or --load
3d20: 2d 73 71 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  -sql */.  sqlite
3d30: 33 20 2a 64 62 20 3d 20 30 3b 20 20 20 20 20 20  3 *db = 0;      
3d40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
3d50: 65 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  en database conn
3d60: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
3d70: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
3d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
3d90: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 53 51 4c  lt code from SQL
3da0: 69 74 65 20 69 6e 74 65 72 66 61 63 65 20 63 61  ite interface ca
3db0: 6c 6c 73 20 2a 2f 0a 20 20 42 6c 6f 62 20 2a 70  lls */.  Blob *p
3dc0: 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
3dd0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
3de0: 70 69 6e 67 20 6f 76 65 72 20 53 51 4c 20 73 63  ping over SQL sc
3df0: 72 69 70 74 73 20 2a 2f 0a 20 20 42 6c 6f 62 20  ripts */.  Blob 
3e00: 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
3e10: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
3e20: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 65 6d 70  ooping over temp
3e30: 6c 61 74 65 20 64 61 74 61 62 61 73 65 73 20 2a  late databases *
3e40: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 2f 2a 20 4c 6f 6f 70 20 69 6e 64 65 78 20 66   /* Loop index f
3e70: 6f 72 20 74 68 65 20 61 72 67 76 5b 5d 20 6c 6f  or the argv[] lo
3e80: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c 79  op */.  int only
3e90: 53 71 6c 69 64 20 3d 20 2d 31 3b 20 20 20 20 20  Sqlid = -1;     
3ea0: 20 20 20 20 20 2f 2a 20 2d 2d 73 71 6c 69 64 20       /* --sqlid 
3eb0: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 6c 79 44 62 69  */.  int onlyDbi
3ec0: 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  d = -1;         
3ed0: 20 20 2f 2a 20 2d 2d 64 62 69 64 20 2a 2f 0a 20    /* --dbid */. 
3ee0: 20 69 6e 74 20 6e 61 74 69 76 65 46 6c 61 67 20   int nativeFlag 
3ef0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
3f00: 20 2d 2d 6e 61 74 69 76 65 2d 76 66 73 20 2a 2f   --native-vfs */
3f10: 0a 0a 20 20 69 42 65 67 69 6e 20 3d 20 74 69 6d  ..  iBegin = tim
3f20: 65 4f 66 44 61 79 28 29 3b 0a 20 20 67 2e 7a 41  eOfDay();.  g.zA
3f30: 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a  rgv0 = argv[0];.
3f40: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67    for(i=1; i<arg
3f50: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  c; i++){.    con
3f60: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 72 67  st char *z = arg
3f70: 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b  v[i];.    if( z[
3f80: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
3f90: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   z++;.      if( 
3fa0: 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  z[0]=='-' ) z++;
3fb0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
3fc0: 70 28 7a 2c 22 64 62 69 64 22 29 3d 3d 30 20 29  p(z,"dbid")==0 )
3fd0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3e  {.        if( i>
3fe0: 3d 61 72 67 63 2d 31 20 29 20 66 61 74 61 6c 45  =argc-1 ) fatalE
3ff0: 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 61 72  rror("missing ar
4000: 67 75 6d 65 6e 74 73 20 6f 6e 20 25 73 22 2c 20  guments on %s", 
4010: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
4020: 20 20 6f 6e 6c 79 44 62 69 64 20 3d 20 61 74 6f    onlyDbid = ato
4030: 69 28 61 72 67 76 5b 2b 2b 69 5d 29 3b 0a 20 20  i(argv[++i]);.  
4040: 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
4050: 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 68 65  if( strcmp(z,"he
4060: 6c 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lp")==0 ){.     
4070: 20 20 20 73 68 6f 77 48 65 6c 70 28 29 3b 0a 20     showHelp();. 
4080: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
4090: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
40a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
40b0: 22 6c 6f 61 64 2d 73 71 6c 22 29 3d 3d 30 20 29  "load-sql")==0 )
40c0: 7b 0a 20 20 20 20 20 20 20 20 7a 49 6e 73 53 71  {.        zInsSq
40d0: 6c 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  l = "INSERT INTO
40e0: 20 78 73 71 6c 28 73 71 6c 74 65 78 74 29 20 56   xsql(sqltext) V
40f0: 41 4c 55 45 53 28 72 65 61 64 66 69 6c 65 28 3f  ALUES(readfile(?
4100: 31 29 29 22 3b 0a 20 20 20 20 20 20 20 20 69 46  1))";.        iF
4110: 69 72 73 74 49 6e 73 41 72 67 20 3d 20 69 2b 31  irstInsArg = i+1
4120: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4130: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
4140: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
4150: 22 6c 6f 61 64 2d 64 62 22 29 3d 3d 30 20 29 7b  "load-db")==0 ){
4160: 0a 20 20 20 20 20 20 20 20 7a 49 6e 73 53 71 6c  .        zInsSql
4170: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
4180: 64 62 28 64 62 63 6f 6e 74 65 6e 74 29 20 56 41  db(dbcontent) VA
4190: 4c 55 45 53 28 72 65 61 64 66 69 6c 65 28 3f 31  LUES(readfile(?1
41a0: 29 29 22 3b 0a 20 20 20 20 20 20 20 20 69 46 69  ))";.        iFi
41b0: 72 73 74 49 6e 73 41 72 67 20 3d 20 69 2b 31 3b  rstInsArg = i+1;
41c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
41d0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
41e0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
41f0: 6e 61 74 69 76 65 2d 76 66 73 22 29 3d 3d 30 20  native-vfs")==0 
4200: 29 7b 0a 20 20 20 20 20 20 20 20 6e 61 74 69 76  ){.        nativ
4210: 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20  eFlag = 1;.     
4220: 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
4230: 20 73 74 72 63 6d 70 28 7a 2c 22 71 75 69 65 74   strcmp(z,"quiet
4240: 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  ")==0 || strcmp(
4250: 7a 2c 22 71 22 29 3d 3d 30 20 29 7b 0a 20 20 20  z,"q")==0 ){.   
4260: 20 20 20 20 20 71 75 69 65 74 46 6c 61 67 20 3d       quietFlag =
4270: 20 31 3b 0a 20 20 20 20 20 20 20 20 76 65 72 62   1;.        verb
4280: 6f 73 65 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20  oseFlag = 0;.   
4290: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69     }else.      i
42a0: 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 71 6c  f( strcmp(z,"sql
42b0: 69 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  id")==0 ){.     
42c0: 20 20 20 69 66 28 20 69 3e 3d 61 72 67 63 2d 31     if( i>=argc-1
42d0: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d   ) fatalError("m
42e0: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 73  issing arguments
42f0: 20 6f 6e 20 25 73 22 2c 20 61 72 67 76 5b 69 5d   on %s", argv[i]
4300: 29 3b 0a 20 20 20 20 20 20 20 20 6f 6e 6c 79 53  );.        onlyS
4310: 71 6c 69 64 20 3d 20 61 74 6f 69 28 61 72 67 76  qlid = atoi(argv
4320: 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 65  [++i]);.      }e
4330: 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 73 74  lse.      if( st
4340: 72 63 6d 70 28 7a 2c 22 76 65 72 62 6f 73 65 22  rcmp(z,"verbose"
4350: 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  )==0 || strcmp(z
4360: 2c 22 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,"v")==0 ){.    
4370: 20 20 20 20 71 75 69 65 74 46 6c 61 67 20 3d 20      quietFlag = 
4380: 30 3b 0a 20 20 20 20 20 20 20 20 76 65 72 62 6f  0;.        verbo
4390: 73 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20  seFlag = 1;.    
43a0: 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a    }else.      {.
43b0: 20 20 20 20 20 20 20 20 66 61 74 61 6c 45 72 72          fatalErr
43c0: 6f 72 28 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  or("unknown opti
43d0: 6f 6e 3a 20 25 73 22 2c 20 61 72 67 76 5b 69 5d  on: %s", argv[i]
43e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
43f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20  else{.      if( 
4400: 7a 53 6f 75 72 63 65 44 62 20 29 20 66 61 74 61  zSourceDb ) fata
4410: 6c 45 72 72 6f 72 28 22 65 78 74 72 61 20 61 72  lError("extra ar
4420: 67 75 6d 65 6e 74 3a 20 25 73 22 2c 20 61 72 67  gument: %s", arg
4430: 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7a 53 6f  v[i]);.      zSo
4440: 75 72 63 65 44 62 20 3d 20 61 72 67 76 5b 69 5d  urceDb = argv[i]
4450: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4460: 28 20 7a 53 6f 75 72 63 65 44 62 3d 3d 30 20 29  ( zSourceDb==0 )
4470: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6e 6f 20   fatalError("no 
4480: 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20  source database 
4490: 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 72  specified");.  r
44a0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  c = sqlite3_open
44b0: 28 7a 53 6f 75 72 63 65 44 62 2c 20 26 64 62 29  (zSourceDb, &db)
44c0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
44d0: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61    fatalError("ca
44e0: 6e 6e 6f 74 20 6f 70 65 6e 20 73 6f 75 72 63 65  nnot open source
44f0: 20 64 61 74 61 62 61 73 65 20 25 73 20 2d 20 25   database %s - %
4500: 73 22 2c 0a 20 20 20 20 7a 53 6f 75 72 63 65 44  s",.    zSourceD
4510: 62 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  b, sqlite3_errms
4520: 67 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 72 63  g(db));.  }.  rc
4530: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
4540: 64 62 2c 20 0a 20 20 20 20 20 22 43 52 45 41 54  db, .     "CREAT
4550: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
4560: 58 49 53 54 53 20 64 62 28 5c 6e 22 0a 20 20 20  XISTS db(\n".   
4570: 20 20 22 20 20 64 62 69 64 20 49 4e 54 45 47 45    "  dbid INTEGE
4580: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 2d  R PRIMARY KEY, -
4590: 2d 20 64 61 74 61 62 61 73 65 20 69 64 5c 6e 22  - database id\n"
45a0: 0a 20 20 20 20 20 22 20 20 64 62 63 6f 6e 74 65  .     "  dbconte
45b0: 6e 74 20 42 4c 4f 42 20 20 20 20 20 20 20 20 20  nt BLOB         
45c0: 20 20 20 2d 2d 20 64 61 74 61 62 61 73 65 20 64     -- database d
45d0: 69 73 6b 20 66 69 6c 65 20 69 6d 61 67 65 5c 6e  isk file image\n
45e0: 22 0a 20 20 20 20 20 22 29 3b 5c 6e 22 0a 20 20  ".     ");\n".  
45f0: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
4600: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 78   IF NOT EXISTS x
4610: 73 71 6c 28 5c 6e 22 0a 20 20 20 20 20 22 20 20  sql(\n".     "  
4620: 73 71 6c 69 64 20 49 4e 54 45 47 45 52 20 50 52  sqlid INTEGER PR
4630: 49 4d 41 52 59 20 4b 45 59 2c 20 20 20 2d 2d 20  IMARY KEY,   -- 
4640: 53 51 4c 20 73 63 72 69 70 74 20 69 64 5c 6e 22  SQL script id\n"
4650: 0a 20 20 20 20 20 22 20 20 73 71 6c 74 65 78 74  .     "  sqltext
4660: 20 54 45 58 54 20 20 20 20 20 20 20 20 20 20 20   TEXT           
4670: 20 20 20 20 20 20 2d 2d 20 54 65 78 74 20 6f 66        -- Text of
4680: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
4690: 74 6f 20 72 75 6e 5c 6e 22 0a 20 20 20 20 20 22  to run\n".     "
46a0: 29 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  );", 0, 0, 0);. 
46b0: 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 45   if( rc ) fatalE
46c0: 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 63 72 65  rror("cannot cre
46d0: 61 74 65 20 73 63 68 65 6d 61 3a 20 25 73 22 2c  ate schema: %s",
46e0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
46f0: 64 62 29 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73  db));.  if( zIns
4700: 53 71 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Sql ){.    sqlit
4710: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
4720: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
4730: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
4740: 22 72 65 61 64 66 69 6c 65 22 2c 20 31 2c 20 53  "readfile", 1, S
4750: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 66             readf
4780: 69 6c 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  ileFunc, 0, 0);.
4790: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
47a0: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
47b0: 7a 49 6e 73 53 71 6c 2c 20 2d 31 2c 20 26 70 53  zInsSql, -1, &pS
47c0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
47d0: 20 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72   rc ) fatalError
47e0: 28 22 63 61 6e 6e 6f 74 20 70 72 65 70 61 72 65  ("cannot prepare
47f0: 20 73 74 61 74 65 6d 65 6e 74 20 5b 25 73 5d 3a   statement [%s]:
4800: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 49                zI
4820: 6e 73 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65  nsSql, sqlite3_e
4830: 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
4840: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
4850: 63 28 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  c(db, "BEGIN", 0
4860: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
4870: 20 72 63 20 29 20 66 61 74 61 6c 45 72 72 6f 72   rc ) fatalError
4880: 28 22 63 61 6e 6e 6f 74 20 73 74 61 72 74 20 61  ("cannot start a
4890: 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a   transaction");.
48a0: 20 20 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74      for(i=iFirst
48b0: 49 6e 73 41 72 67 3b 20 69 3c 61 72 67 63 3b 20  InsArg; i<argc; 
48c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
48d0: 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
48e0: 74 6d 74 2c 20 31 2c 20 61 72 67 76 5b 69 5d 2c  tmt, 1, argv[i],
48f0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
4900: 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  IC);.      sqlit
4910: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
4920: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4930: 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b  e3_reset(pStmt);
4940: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
4950: 66 61 74 61 6c 45 72 72 6f 72 28 22 69 6e 73 65  fatalError("inse
4960: 72 74 20 66 61 69 6c 65 64 20 66 6f 72 20 25 73  rt failed for %s
4970: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20  ", argv[i]);.   
4980: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
4990: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
49a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
49b0: 5f 65 78 65 63 28 64 62 2c 20 22 43 4f 4d 4d 49  _exec(db, "COMMI
49c0: 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
49d0: 20 20 69 66 28 20 72 63 20 29 20 66 61 74 61 6c    if( rc ) fatal
49e0: 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 63 6f  Error("cannot co
49f0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
4a00: 74 69 6f 6e 3a 20 25 73 22 2c 20 73 71 6c 69 74  tion: %s", sqlit
4a10: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
4a20: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
4a30: 65 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  e(db);.    retur
4a40: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  n 0;.  }..  /* L
4a50: 6f 61 64 20 61 6c 6c 20 53 51 4c 20 73 63 72 69  oad all SQL scri
4a60: 70 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 61  pt content and a
4a70: 6c 6c 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  ll initial datab
4a80: 61 73 65 20 69 6d 61 67 65 73 20 66 72 6f 6d 20  ase images from 
4a90: 74 68 65 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  the.  ** source 
4aa0: 64 62 0a 20 20 2a 2f 0a 20 20 62 6c 6f 62 4c 69  db.  */.  blobLi
4ab0: 73 74 4c 6f 61 64 46 72 6f 6d 44 62 28 64 62 2c  stLoadFromDb(db,
4ac0: 20 22 53 45 4c 45 43 54 20 73 71 6c 69 64 2c 20   "SELECT sqlid, 
4ad0: 73 71 6c 74 65 78 74 20 46 52 4f 4d 20 78 73 71  sqltext FROM xsq
4ae0: 6c 22 2c 20 6f 6e 6c 79 53 71 6c 69 64 2c 0a 20  l", onlySqlid,. 
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 20 20 20 20 20 20 20 20 26 67 2e 6e 53 71 6c 2c          &g.nSql,
4b10: 20 26 67 2e 70 46 69 72 73 74 53 71 6c 29 3b 0a   &g.pFirstSql);.
4b20: 20 20 69 66 28 20 67 2e 6e 53 71 6c 3d 3d 30 20    if( g.nSql==0 
4b30: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6e 65  ) fatalError("ne
4b40: 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ed at least one 
4b50: 53 51 4c 20 73 63 72 69 70 74 22 29 3b 0a 20 20  SQL script");.  
4b60: 62 6c 6f 62 4c 69 73 74 4c 6f 61 64 46 72 6f 6d  blobListLoadFrom
4b70: 44 62 28 64 62 2c 20 22 53 45 4c 45 43 54 20 64  Db(db, "SELECT d
4b80: 62 69 64 2c 20 64 62 63 6f 6e 74 65 6e 74 20 46  bid, dbcontent F
4b90: 52 4f 4d 20 64 62 22 2c 20 6f 6e 6c 79 44 62 69  ROM db", onlyDbi
4ba0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
4bb0: 20 20 20 20 20 20 20 20 26 67 2e 6e 44 62 2c 20          &g.nDb, 
4bc0: 26 67 2e 70 46 69 72 73 74 44 62 29 3b 0a 20 20  &g.pFirstDb);.  
4bd0: 69 66 28 20 67 2e 6e 44 62 3d 3d 30 20 29 7b 0a  if( g.nDb==0 ){.
4be0: 20 20 20 20 67 2e 70 46 69 72 73 74 44 62 20 3d      g.pFirstDb =
4bf0: 20 73 61 66 65 5f 72 65 61 6c 6c 6f 63 28 30 2c   safe_realloc(0,
4c00: 20 73 69 7a 65 6f 66 28 42 6c 6f 62 29 29 3b 0a   sizeof(Blob));.
4c10: 20 20 20 20 6d 65 6d 73 65 74 28 67 2e 70 46 69      memset(g.pFi
4c20: 72 73 74 44 62 2c 20 30 2c 20 73 69 7a 65 6f 66  rstDb, 0, sizeof
4c30: 28 42 6c 6f 62 29 29 3b 0a 20 20 20 20 67 2e 70  (Blob));.    g.p
4c40: 46 69 72 73 74 44 62 2d 3e 69 64 20 3d 20 31 3b  FirstDb->id = 1;
4c50: 0a 20 20 20 20 67 2e 6e 44 62 20 3d 20 31 3b 0a  .    g.nDb = 1;.
4c60: 20 20 7d 0a 20 20 20 20 0a 0a 20 20 2f 2a 20 43    }.    ..  /* C
4c70: 6c 6f 73 65 20 74 68 65 20 73 6f 75 72 63 65 20  lose the source 
4c80: 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66  database.  Verif
4c90: 79 20 74 68 61 74 20 6e 6f 20 53 51 4c 69 74 65  y that no SQLite
4ca0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
4cb0: 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 6f 75 74  ons are.  ** out
4cc0: 73 74 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  standing..  */. 
4cd0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
4ce0: 62 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b);.  if( sqlite
4cf0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3e  3_memory_used()>
4d00: 30 20 29 7b 0a 20 20 20 20 66 61 74 61 6c 45 72  0 ){.    fatalEr
4d10: 72 6f 72 28 22 53 51 4c 69 74 65 20 68 61 73 20  ror("SQLite has 
4d20: 6d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 65  memory in use be
4d30: 66 6f 72 65 20 74 68 65 20 73 74 61 72 74 20 6f  fore the start o
4d40: 66 20 74 65 73 74 69 6e 67 22 29 3b 0a 20 20 7d  f testing");.  }
4d50: 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
4d60: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 76 69  the in-memory vi
4d70: 72 74 75 61 6c 20 66 69 6c 65 73 79 73 74 65 6d  rtual filesystem
4d80: 0a 20 20 2a 2f 0a 20 20 66 6f 72 6d 61 74 56 66  .  */.  formatVf
4d90: 73 28 29 3b 0a 20 20 69 6e 6d 65 6d 56 66 73 52  s();.  inmemVfsR
4da0: 65 67 69 73 74 65 72 28 29 3b 0a 20 20 0a 20 20  egister();.  .  
4db0: 2f 2a 20 52 75 6e 20 61 20 74 65 73 74 20 75 73  /* Run a test us
4dc0: 69 6e 67 20 65 61 63 68 20 53 51 4c 20 73 63 72  ing each SQL scr
4dd0: 69 70 74 20 61 67 61 69 6e 73 74 20 65 61 63 68  ipt against each
4de0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
4df0: 20 20 69 66 28 20 21 76 65 72 62 6f 73 65 46 6c    if( !verboseFl
4e00: 61 67 20 26 26 20 21 71 75 69 65 74 46 6c 61 67  ag && !quietFlag
4e10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
4e20: 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 53     i = strlen(zS
4e30: 6f 75 72 63 65 44 62 29 20 2d 20 31 3b 0a 20 20  ourceDb) - 1;.  
4e40: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 26 26 20    while( i>0 && 
4e50: 7a 53 6f 75 72 63 65 44 62 5b 69 2d 31 5d 21 3d  zSourceDb[i-1]!=
4e60: 27 2f 27 20 26 26 20 7a 53 6f 75 72 63 65 44 62  '/' && zSourceDb
4e70: 5b 69 2d 31 5d 21 3d 27 5c 5c 27 20 29 7b 20 69  [i-1]!='\\' ){ i
4e80: 2d 2d 3b 20 7d 0a 20 20 20 20 70 72 69 6e 74 66  --; }.    printf
4e90: 28 22 25 73 3a 22 2c 20 26 7a 53 6f 75 72 63 65  ("%s:", &zSource
4ea0: 44 62 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  Db[i]);.  }.  fo
4eb0: 72 28 70 53 71 6c 3d 67 2e 70 46 69 72 73 74 53  r(pSql=g.pFirstS
4ec0: 71 6c 3b 20 70 53 71 6c 3b 20 70 53 71 6c 3d 70  ql; pSql; pSql=p
4ed0: 53 71 6c 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Sql->pNext){.   
4ee0: 20 66 6f 72 28 70 44 62 3d 67 2e 70 46 69 72 73   for(pDb=g.pFirs
4ef0: 74 44 62 3b 20 70 44 62 3b 20 70 44 62 3d 70 44  tDb; pDb; pDb=pD
4f00: 62 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  b->pNext){.     
4f10: 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b 0a   int openFlags;.
4f20: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
4f30: 20 2a 7a 56 66 73 20 3d 20 22 69 6e 6d 65 6d 22   *zVfs = "inmem"
4f40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4f50: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
4f60: 67 2e 7a 54 65 73 74 4e 61 6d 65 29 2c 20 67 2e  g.zTestName), g.
4f70: 7a 54 65 73 74 4e 61 6d 65 2c 20 22 73 71 6c 69  zTestName, "sqli
4f80: 64 3d 25 64 2c 64 62 69 64 3d 25 64 22 2c 0a 20  d=%d,dbid=%d",. 
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 20 20 20 20 20 70 53 71 6c 2d 3e 69 64 2c 20        pSql->id, 
4fb0: 70 44 62 2d 3e 69 64 29 3b 0a 20 20 20 20 20 20  pDb->id);.      
4fc0: 69 66 28 20 76 65 72 62 6f 73 65 46 6c 61 67 20  if( verboseFlag 
4fd0: 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ){.        print
4fe0: 66 28 22 25 73 5c 6e 22 2c 20 67 2e 7a 54 65 73  f("%s\n", g.zTes
4ff0: 74 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  tName);.        
5000: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
5010: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
5020: 21 71 75 69 65 74 46 6c 61 67 20 29 7b 0a 20 20  !quietFlag ){.  
5030: 20 20 20 20 20 20 73 74 61 74 69 63 20 69 6e 74        static int
5040: 20 70 72 65 76 41 6d 74 20 3d 20 2d 31 3b 0a 20   prevAmt = -1;. 
5050: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d         int idx =
5060: 20 28 70 53 71 6c 2d 3e 69 64 2d 31 29 2a 67 2e   (pSql->id-1)*g.
5070: 6e 44 62 20 2b 20 70 44 62 2d 3e 69 64 20 2d 20  nDb + pDb->id - 
5080: 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  1;.        int a
5090: 6d 74 20 3d 20 69 64 78 2a 31 30 2f 28 67 2e 6e  mt = idx*10/(g.n
50a0: 44 62 2a 67 2e 6e 53 71 6c 29 3b 0a 20 20 20 20  Db*g.nSql);.    
50b0: 20 20 20 20 69 66 28 20 61 6d 74 21 3d 70 72 65      if( amt!=pre
50c0: 76 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  vAmt ){.        
50d0: 20 20 70 72 69 6e 74 66 28 22 20 25 64 25 25 22    printf(" %d%%"
50e0: 2c 20 61 6d 74 2a 31 30 29 3b 0a 20 20 20 20 20  , amt*10);.     
50f0: 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f       fflush(stdo
5100: 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ut);.          p
5110: 72 65 76 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20  revAmt = amt;.  
5120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5130: 20 20 20 20 20 20 63 72 65 61 74 65 56 46 69 6c        createVFil
5140: 65 28 22 6d 61 69 6e 2e 64 62 22 2c 20 70 44 62  e("main.db", pDb
5150: 2d 3e 73 7a 2c 20 70 44 62 2d 3e 61 29 3b 0a 20  ->sz, pDb->a);. 
5160: 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d       openFlags =
5170: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
5180: 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
5190: 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
51a0: 20 20 20 69 66 28 20 6e 61 74 69 76 65 46 6c 61     if( nativeFla
51b0: 67 20 26 26 20 70 44 62 2d 3e 73 7a 3d 3d 30 20  g && pDb->sz==0 
51c0: 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46  ){.        openF
51d0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
51e0: 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
51f0: 20 20 20 20 7a 56 66 73 20 3d 20 30 3b 0a 20 20      zVfs = 0;.  
5200: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
5210: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
5220: 28 22 6d 61 69 6e 2e 64 62 22 2c 20 26 64 62 2c  ("main.db", &db,
5230: 20 6f 70 65 6e 46 6c 61 67 73 2c 20 7a 56 66 73   openFlags, zVfs
5240: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
5250: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61  ) fatalError("ca
5260: 6e 6e 6f 74 20 6f 70 65 6e 20 69 6e 6d 65 6d 20  nnot open inmem 
5270: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
5280: 20 20 72 75 6e 53 71 6c 28 64 62 2c 20 28 63 68    runSql(db, (ch
5290: 61 72 2a 29 70 53 71 6c 2d 3e 61 2c 20 76 65 72  ar*)pSql->a, ver
52a0: 62 6f 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  boseFlag);.     
52b0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
52c0: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  b);.      if( sq
52d0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
52e0: 64 28 29 3e 30 20 29 20 66 61 74 61 6c 45 72 72  d()>0 ) fatalErr
52f0: 6f 72 28 22 6d 65 6d 6f 72 79 20 6c 65 61 6b 22  or("memory leak"
5300: 29 3b 0a 20 20 20 20 20 20 72 65 66 6f 72 6d 61  );.      reforma
5310: 74 56 66 73 28 29 3b 0a 20 20 20 20 20 20 67 2e  tVfs();.      g.
5320: 7a 54 65 73 74 4e 61 6d 65 5b 30 5d 20 3d 20 30  zTestName[0] = 0
5330: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
5340: 66 28 20 21 71 75 69 65 74 46 6c 61 67 20 29 7b  f( !quietFlag ){
5350: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
5360: 36 34 20 69 45 6c 61 70 73 65 20 3d 20 74 69 6d  64 iElapse = tim
5370: 65 4f 66 44 61 79 28 29 20 2d 20 69 42 65 67 69  eOfDay() - iBegi
5380: 6e 3b 0a 20 20 20 20 69 66 28 20 21 76 65 72 62  n;.    if( !verb
5390: 6f 73 65 46 6c 61 67 20 29 20 70 72 69 6e 74 66  oseFlag ) printf
53a0: 28 22 5c 6e 22 29 3b 0a 20 20 20 20 70 72 69 6e  ("\n");.    prin
53b0: 74 66 28 22 66 75 7a 7a 63 68 65 63 6b 3a 20 30  tf("fuzzcheck: 0
53c0: 20 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25   errors out of %
53d0: 64 20 74 65 73 74 73 20 69 6e 20 25 64 2e 25 30  d tests in %d.%0
53e0: 33 64 20 73 65 63 6f 6e 64 73 5c 6e 53 51 4c 69  3d seconds\nSQLi
53f0: 74 65 20 25 73 20 25 73 5c 6e 22 2c 0a 20 20 20  te %s %s\n",.   
5400: 20 20 20 20 20 20 20 20 67 2e 6e 44 62 2a 67 2e          g.nDb*g.
5410: 6e 53 71 6c 2c 20 28 69 6e 74 29 28 69 45 6c 61  nSql, (int)(iEla
5420: 70 73 65 2f 31 30 30 30 29 2c 20 28 69 6e 74 29  pse/1000), (int)
5430: 28 69 45 6c 61 70 73 65 25 31 30 30 30 29 2c 0a  (iElapse%1000),.
5440: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5450: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c  e3_libversion(),
5460: 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69   sqlite3_sourcei
5470: 64 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  d());.  }..  /* 
5480: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 65 78 69  Clean up and exi
5490: 74 2e 0a 20 20 2a 2f 0a 20 20 62 6c 6f 62 4c 69  t..  */.  blobLi
54a0: 73 74 46 72 65 65 28 67 2e 70 46 69 72 73 74 53  stFree(g.pFirstS
54b0: 71 6c 29 3b 0a 20 20 62 6c 6f 62 4c 69 73 74 46  ql);.  blobListF
54c0: 72 65 65 28 67 2e 70 46 69 72 73 74 44 62 29 3b  ree(g.pFirstDb);
54d0: 0a 20 20 72 65 66 6f 72 6d 61 74 56 66 73 28 29  .  reformatVfs()
54e0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.