/ Hex Artifact Content
Login

Artifact 2bcebf99f77270e4b30ee5fad749347a6296db1662b3a196593e5410780aea85:


0000: 2f 2a 0a 2a 2a 20 32 30 31 36 2d 30 39 2d 30 37  /*.** 2016-09-07
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 2a  ****************
0170: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
0180: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0190: 69 6e 2d 6d 65 6d 6f 72 79 20 56 46 53 2e 20 20  in-memory VFS.  
01a0: 41 20 64 61 74 61 62 61 73 65 20 69 73 20 68 65  A database is he
01b0: 6c 64 20 61 73 20 61 20 63 6f 6e 74 69 67 75 6f  ld as a contiguo
01c0: 75 73 0a 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 6d  us.** block of m
01d0: 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  emory..**.** Thi
01e0: 73 20 66 69 6c 65 20 61 6c 73 6f 20 69 6d 70 6c  s file also impl
01f0: 65 6d 65 6e 74 73 20 69 6e 74 65 72 66 61 63 65  ements interface
0200: 20 73 71 6c 69 74 65 33 5f 73 65 72 69 61 6c 69   sqlite3_seriali
0210: 7a 65 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69  ze() and.** sqli
0220: 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65 28  te3_deserialize(
0230: 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  )..*/.#ifdef SQL
0240: 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
0250: 49 41 4c 49 5a 45 0a 23 69 6e 63 6c 75 64 65 20  IALIZE.#include 
0260: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0270: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
0280: 6c 61 72 61 74 69 6f 6e 20 6f 66 20 6f 62 6a 65  laration of obje
0290: 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69 73  cts used by this
02a0: 20 75 74 69 6c 69 74 79 0a 2a 2f 0a 74 79 70 65   utility.*/.type
02b0: 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69 74  def struct sqlit
02c0: 65 33 5f 76 66 73 20 4d 65 6d 56 66 73 3b 0a 74  e3_vfs MemVfs;.t
02d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4d 65  ypedef struct Me
02e0: 6d 46 69 6c 65 20 4d 65 6d 46 69 6c 65 3b 0a 0a  mFile MemFile;..
02f0: 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 61 20 6c  /* Access to a l
0300: 6f 77 65 72 2d 6c 65 76 65 6c 20 56 46 53 20 74  ower-level VFS t
0310: 68 61 74 20 28 6d 69 67 68 74 29 20 69 6d 70 6c  hat (might) impl
0320: 65 6d 65 6e 74 20 64 79 6e 61 6d 69 63 20 6c 6f  ement dynamic lo
0330: 61 64 69 6e 67 2c 0a 2a 2a 20 61 63 63 65 73 73  ading,.** access
0340: 20 74 6f 20 72 61 6e 64 6f 6d 6e 65 73 73 2c 20   to randomness, 
0350: 65 74 63 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  etc..*/.#define 
0360: 4f 52 49 47 56 46 53 28 70 29 20 28 28 73 71 6c  ORIGVFS(p) ((sql
0370: 69 74 65 33 5f 76 66 73 2a 29 28 28 70 29 2d 3e  ite3_vfs*)((p)->
0380: 70 41 70 70 44 61 74 61 29 29 0a 0a 2f 2a 20 41  pAppData))../* A
0390: 6e 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 73  n open file */.s
03a0: 74 72 75 63 74 20 4d 65 6d 46 69 6c 65 20 7b 0a  truct MemFile {.
03b0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62    sqlite3_file b
03c0: 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
03d0: 20 20 2f 2a 20 49 4f 20 6d 65 74 68 6f 64 73 20    /* IO methods 
03e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
03f0: 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  64 sz;          
0400: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
0410: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  the file */.  sq
0420: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61  lite3_int64 szMa
0430: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
0440: 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
0450: 20 74 6f 20 61 44 61 74 61 20 2a 2f 0a 20 20 75   to aData */.  u
0460: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
0470: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
0480: 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
0490: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
04a0: 4d 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  Mmap;           
04b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
04c0: 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 6d  mber of memory m
04d0: 61 70 70 65 64 20 70 61 67 65 73 20 2a 2f 0a 20  apped pages */. 
04e0: 20 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61 67 73   unsigned mFlags
04f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0500: 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 69   /* Flags */.  i
0510: 6e 74 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  nt eLock;       
0520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0530: 2a 20 4d 6f 73 74 20 72 65 63 65 6e 74 20 6c 6f  * Most recent lo
0540: 63 6b 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  ck against this 
0550: 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  file */.};../*.*
0560: 2a 20 4d 65 74 68 6f 64 73 20 66 6f 72 20 4d 65  * Methods for Me
0570: 6d 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20  mFile.*/.static 
0580: 69 6e 74 20 6d 65 6d 64 62 43 6c 6f 73 65 28 73  int memdbClose(s
0590: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
05a0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 52  tatic int memdbR
05b0: 65 61 64 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ead(sqlite3_file
05c0: 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41  *, void*, int iA
05d0: 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  mt, sqlite3_int6
05e0: 34 20 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63  4 iOfst);.static
05f0: 20 69 6e 74 20 6d 65 6d 64 62 57 72 69 74 65 28   int memdbWrite(
0600: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 63 6f  sqlite3_file*,co
0610: 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 20 69 41  nst void*,int iA
0620: 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  mt, sqlite3_int6
0630: 34 20 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63  4 iOfst);.static
0640: 20 69 6e 74 20 6d 65 6d 64 62 54 72 75 6e 63 61   int memdbTrunca
0650: 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  te(sqlite3_file*
0660: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
0670: 73 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69 6e  size);.static in
0680: 74 20 6d 65 6d 64 62 53 79 6e 63 28 73 71 6c 69  t memdbSync(sqli
0690: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 66  te3_file*, int f
06a0: 6c 61 67 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  lags);.static in
06b0: 74 20 6d 65 6d 64 62 46 69 6c 65 53 69 7a 65 28  t memdbFileSize(
06c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73  sqlite3_file*, s
06d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53  qlite3_int64 *pS
06e0: 69 7a 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ize);.static int
06f0: 20 6d 65 6d 64 62 4c 6f 63 6b 28 73 71 6c 69 74   memdbLock(sqlit
0700: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
0710: 2f 2a 20 73 74 61 74 69 63 20 69 6e 74 20 6d 65  /* static int me
0720: 6d 64 62 43 68 65 63 6b 52 65 73 65 72 76 65 64  mdbCheckReserved
0730: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
0740: 65 2a 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  e*, int *pResOut
0750: 29 3b 2f 2f 20 6e 6f 74 20 75 73 65 64 20 2a 2f  );// not used */
0760: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64  .static int memd
0770: 62 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  bFileControl(sql
0780: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20  ite3_file*, int 
0790: 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 3b  op, void *pArg);
07a0: 0a 2f 2a 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ./* static int m
07b0: 65 6d 64 62 53 65 63 74 6f 72 53 69 7a 65 28 73  emdbSectorSize(s
07c0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 20 2f  qlite3_file*); /
07d0: 2f 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 73 74  / not used */.st
07e0: 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 44 65  atic int memdbDe
07f0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
0800: 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
0810: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  *);.static int m
0820: 65 6d 64 62 46 65 74 63 68 28 73 71 6c 69 74 65  emdbFetch(sqlite
0830: 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  3_file*, sqlite3
0840: 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c 20 69 6e  _int64 iOfst, in
0850: 74 20 69 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t iAmt, void **p
0860: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  p);.static int m
0870: 65 6d 64 62 55 6e 66 65 74 63 68 28 73 71 6c 69  emdbUnfetch(sqli
0880: 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74  te3_file*, sqlit
0890: 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 2c 20  e3_int64 iOfst, 
08a0: 76 6f 69 64 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a  void *p);../*.**
08b0: 20 4d 65 74 68 6f 64 73 20 66 6f 72 20 4d 65 6d   Methods for Mem
08c0: 56 66 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Vfs.*/.static in
08d0: 74 20 6d 65 6d 64 62 4f 70 65 6e 28 73 71 6c 69  t memdbOpen(sqli
08e0: 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
08f0: 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33 5f  char *, sqlite3_
0900: 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69 6e 74  file*, int , int
0910: 20 2a 29 3b 0a 2f 2a 20 73 74 61 74 69 63 20 69   *);./* static i
0920: 6e 74 20 6d 65 6d 64 62 44 65 6c 65 74 65 28 73  nt memdbDelete(s
0930: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e  qlite3_vfs*, con
0940: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
0950: 69 6e 74 20 73 79 6e 63 44 69 72 29 3b 20 2a 2f  int syncDir); */
0960: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64  .static int memd
0970: 62 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f  bAccess(sqlite3_
0980: 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  vfs*, const char
0990: 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61   *zName, int fla
09a0: 67 73 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74  gs, int *);.stat
09b0: 69 63 20 69 6e 74 20 6d 65 6d 64 62 46 75 6c 6c  ic int memdbFull
09c0: 50 61 74 68 6e 61 6d 65 28 73 71 6c 69 74 65 33  Pathname(sqlite3
09d0: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
09e0: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20 63  r *zName, int, c
09f0: 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74  har *zOut);.stat
0a00: 69 63 20 76 6f 69 64 20 2a 6d 65 6d 64 62 44 6c  ic void *memdbDl
0a10: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
0a20: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  *, const char *z
0a30: 46 69 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74 69  Filename);.stati
0a40: 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c 45 72  c void memdbDlEr
0a50: 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ror(sqlite3_vfs*
0a60: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
0a70: 72 20 2a 7a 45 72 72 4d 73 67 29 3b 0a 73 74 61  r *zErrMsg);.sta
0a80: 74 69 63 20 76 6f 69 64 20 28 2a 6d 65 6d 64 62  tic void (*memdb
0a90: 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66  DlSym(sqlite3_vf
0aa0: 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
0ab0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79  , const char*zSy
0ac0: 6d 29 29 28 76 6f 69 64 29 3b 0a 73 74 61 74 69  m))(void);.stati
0ad0: 63 20 76 6f 69 64 20 6d 65 6d 64 62 44 6c 43 6c  c void memdbDlCl
0ae0: 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ose(sqlite3_vfs*
0af0: 2c 20 76 6f 69 64 2a 29 3b 0a 73 74 61 74 69 63  , void*);.static
0b00: 20 69 6e 74 20 6d 65 6d 64 62 52 61 6e 64 6f 6d   int memdbRandom
0b10: 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
0b20: 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68  *, int nByte, ch
0b30: 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69  ar *zOut);.stati
0b40: 63 20 69 6e 74 20 6d 65 6d 64 62 53 6c 65 65 70  c int memdbSleep
0b50: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69  (sqlite3_vfs*, i
0b60: 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
0b70: 3b 0a 2f 2a 20 73 74 61 74 69 63 20 69 6e 74 20  ;./* static int 
0b80: 6d 65 6d 64 62 43 75 72 72 65 6e 74 54 69 6d 65  memdbCurrentTime
0b90: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64  (sqlite3_vfs*, d
0ba0: 6f 75 62 6c 65 2a 29 3b 20 2a 2f 0a 73 74 61 74  ouble*); */.stat
0bb0: 69 63 20 69 6e 74 20 6d 65 6d 64 62 47 65 74 4c  ic int memdbGetL
0bc0: 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
0bd0: 5f 76 66 73 2a 2c 20 69 6e 74 2c 20 63 68 61 72  _vfs*, int, char
0be0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
0bf0: 6d 65 6d 64 62 43 75 72 72 65 6e 74 54 69 6d 65  memdbCurrentTime
0c00: 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
0c10: 73 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  s*, sqlite3_int6
0c20: 34 2a 29 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c  4*);..static sql
0c30: 69 74 65 33 5f 76 66 73 20 6d 65 6d 64 62 5f 76  ite3_vfs memdb_v
0c40: 66 73 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20  fs = {.  2,     
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
0c70: 6e 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  n */.  0,       
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
0ca0: 28 73 65 74 20 77 68 65 6e 20 72 65 67 69 73 74  (set when regist
0cb0: 65 72 65 64 29 20 2a 2f 0a 20 20 31 30 32 34 2c  ered) */.  1024,
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cd0: 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74          /* mxPat
0ce0: 68 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20  hname */.  0,   
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
0d10: 20 2a 2f 0a 20 20 22 6d 65 6d 64 62 22 2c 20 20   */.  "memdb",  
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
0d40: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d60: 20 70 41 70 70 44 61 74 61 20 28 73 65 74 20 77   pAppData (set w
0d70: 68 65 6e 20 72 65 67 69 73 74 65 72 65 64 29 20  hen registered) 
0d80: 2a 2f 20 0a 20 20 6d 65 6d 64 62 4f 70 65 6e 2c  */ .  memdbOpen,
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0da0: 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
0db0: 20 30 2c 20 2f 2a 20 6d 65 6d 64 62 44 65 6c 65   0, /* memdbDele
0dc0: 74 65 2c 20 2a 2f 20 20 20 20 20 20 20 20 2f 2a  te, */        /*
0dd0: 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 6d 65   xDelete */.  me
0de0: 6d 64 62 41 63 63 65 73 73 2c 20 20 20 20 20 20  mdbAccess,      
0df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
0e00: 63 63 65 73 73 20 2a 2f 0a 20 20 6d 65 6d 64 62  ccess */.  memdb
0e10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
0e20: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c          /* xFull
0e30: 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6d 65  Pathname */.  me
0e40: 6d 64 62 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  mdbDlOpen,      
0e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
0e60: 6c 4f 70 65 6e 20 2a 2f 0a 20 20 6d 65 6d 64 62  lOpen */.  memdb
0e70: 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
0e80: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
0e90: 72 6f 72 20 2a 2f 0a 20 20 6d 65 6d 64 62 44 6c  ror */.  memdbDl
0ea0: 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
0eb0: 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
0ec0: 2a 2f 0a 20 20 6d 65 6d 64 62 44 6c 43 6c 6f 73  */.  memdbDlClos
0ed0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
0ee0: 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
0ef0: 0a 20 20 6d 65 6d 64 62 52 61 6e 64 6f 6d 6e 65  .  memdbRandomne
0f00: 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
0f10: 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
0f20: 2f 0a 20 20 6d 65 6d 64 62 53 6c 65 65 70 2c 20  /.  memdbSleep, 
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
0f50: 30 2c 20 2f 2a 20 6d 65 6d 64 62 43 75 72 72 65  0, /* memdbCurre
0f60: 6e 74 54 69 6d 65 2c 20 2a 2f 20 20 20 2f 2a 20  ntTime, */   /* 
0f70: 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
0f80: 20 20 6d 65 6d 64 62 47 65 74 4c 61 73 74 45 72    memdbGetLastEr
0f90: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ror,           /
0fa0: 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
0fb0: 2a 2f 0a 20 20 6d 65 6d 64 62 43 75 72 72 65 6e  */.  memdbCurren
0fc0: 74 54 69 6d 65 49 6e 74 36 34 20 20 20 20 20 20  tTimeInt64      
0fd0: 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
0fe0: 65 49 6e 74 36 34 20 2a 2f 0a 7d 3b 0a 0a 73 74  eInt64 */.};..st
0ff0: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1000: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6d 65  e3_io_methods me
1010: 6d 64 62 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d  mdb_io_methods =
1020: 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1050: 20 2a 2f 0a 20 20 6d 65 6d 64 62 43 6c 6f 73 65   */.  memdbClose
1060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1070: 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1080: 20 2a 2f 0a 20 20 6d 65 6d 64 62 52 65 61 64 2c   */.  memdbRead,
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a0: 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
10b0: 2a 2f 0a 20 20 6d 65 6d 64 62 57 72 69 74 65 2c  */.  memdbWrite,
10c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d0: 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
10e0: 2a 2f 0a 20 20 6d 65 6d 64 62 54 72 75 6e 63 61  */.  memdbTrunca
10f0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1100: 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
1110: 74 65 20 2a 2f 0a 20 20 6d 65 6d 64 62 53 79 6e  te */.  memdbSyn
1120: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1130: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
1140: 63 20 2a 2f 0a 20 20 6d 65 6d 64 62 46 69 6c 65  c */.  memdbFile
1150: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1160: 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1170: 53 69 7a 65 20 2a 2f 0a 20 20 6d 65 6d 64 62 4c  Size */.  memdbL
1180: 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
11a0: 6f 63 6b 20 2a 2f 0a 20 20 6d 65 6d 64 62 4c 6f  ock */.  memdbLo
11b0: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
11d0: 6c 6f 63 6b 20 2d 20 73 61 6d 65 20 61 73 20 78  lock - same as x
11e0: 4c 6f 63 6b 20 69 6e 20 74 68 69 73 20 63 61 73  Lock in this cas
11f0: 65 20 2a 2f 20 0a 20 20 30 2c 20 2f 2a 20 6d 65  e */ .  0, /* me
1200: 6d 64 62 43 68 65 63 6b 52 65 73 65 72 76 65 64  mdbCheckReserved
1210: 4c 6f 63 6b 2c 20 2a 2f 20 2f 2a 20 78 43 68 65  Lock, */ /* xChe
1220: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1230: 2f 0a 20 20 6d 65 6d 64 62 46 69 6c 65 43 6f 6e  /.  memdbFileCon
1240: 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
1250: 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
1260: 74 72 6f 6c 20 2a 2f 0a 20 20 30 2c 20 2f 2a 20  trol */.  0, /* 
1270: 6d 65 6d 64 62 53 65 63 74 6f 72 53 69 7a 65 2c  memdbSectorSize,
1280: 2a 2f 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53  */         /* xS
1290: 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 6d  ectorSize */.  m
12a0: 65 6d 64 62 44 65 76 69 63 65 43 68 61 72 61 63  emdbDeviceCharac
12b0: 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20  teristics,      
12c0: 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63  /* xDeviceCharac
12d0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 30  teristics */.  0
12e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
1310: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a   /* xShmLock */.
1340: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
1370: 72 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20  r */.  0,       
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
13a0: 6e 6d 61 70 20 2a 2f 0a 20 20 6d 65 6d 64 62 46  nmap */.  memdbF
13b0: 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
13c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
13d0: 65 74 63 68 20 2a 2f 0a 20 20 6d 65 6d 64 62 55  etch */.  memdbU
13e0: 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20  nfetch          
13f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1400: 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 0a 0a  nfetch */.};....
1410: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6d  /*.** Close an m
1420: 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  emdb-file..**.**
1430: 20 54 68 65 20 70 44 61 74 61 20 70 6f 69 6e 74   The pData point
1440: 65 72 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74  er is owned by t
1450: 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 2c 20  he application, 
1460: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  so there is noth
1470: 69 6e 67 0a 2a 2a 20 74 6f 20 66 72 65 65 2e 0a  ing.** to free..
1480: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
1490: 6d 64 62 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  mdbClose(sqlite3
14a0: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
14b0: 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d   MemFile *p = (M
14c0: 65 6d 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  emFile *)pFile;.
14d0: 20 20 69 66 28 20 70 2d 3e 6d 46 6c 61 67 73 20    if( p->mFlags 
14e0: 26 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41  & SQLITE_DESERIA
14f0: 4c 49 5a 45 5f 46 52 45 45 4f 4e 43 4c 4f 53 45  LIZE_FREEONCLOSE
1500: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
1510: 70 2d 3e 61 44 61 74 61 29 3b 0a 20 20 72 65 74  p->aData);.  ret
1520: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1530: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
1540: 61 20 66 72 6f 6d 20 61 6e 20 6d 65 6d 64 62 2d  a from an memdb-
1550: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1560: 69 6e 74 20 6d 65 6d 64 62 52 65 61 64 28 0a 20  int memdbRead(. 
1570: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
1580: 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a  File, .  void *z
1590: 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74  Buf, .  int iAmt
15a0: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
15b0: 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 4d 65 6d  4 iOfst.){.  Mem
15c0: 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69  File *p = (MemFi
15d0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66  le *)pFile;.  if
15e0: 28 20 69 4f 66 73 74 2b 69 41 6d 74 3e 70 2d 3e  ( iOfst+iAmt>p->
15f0: 73 7a 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  sz ){.    memset
1600: 28 7a 42 75 66 2c 20 30 2c 20 69 41 6d 74 29 3b  (zBuf, 0, iAmt);
1610: 0a 20 20 20 20 69 66 28 20 69 4f 66 73 74 3c 70  .    if( iOfst<p
1620: 2d 3e 73 7a 20 29 20 6d 65 6d 63 70 79 28 7a 42  ->sz ) memcpy(zB
1630: 75 66 2c 20 70 2d 3e 61 44 61 74 61 2b 69 4f 66  uf, p->aData+iOf
1640: 73 74 2c 20 70 2d 3e 73 7a 20 2d 20 69 4f 66 73  st, p->sz - iOfs
1650: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  t);.    return S
1660: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1670: 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6d 65  T_READ;.  }.  me
1680: 6d 63 70 79 28 7a 42 75 66 2c 20 70 2d 3e 61 44  mcpy(zBuf, p->aD
1690: 61 74 61 2b 69 4f 66 73 74 2c 20 69 41 6d 74 29  ata+iOfst, iAmt)
16a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
16c0: 72 79 20 74 6f 20 65 6e 6c 61 72 67 65 20 74 68  ry to enlarge th
16d0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
16e0: 69 6f 6e 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c  ion to hold at l
16f0: 65 61 73 74 20 73 7a 20 62 79 74 65 73 0a 2a 2f  east sz bytes.*/
1700: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64  .static int memd
1710: 62 45 6e 6c 61 72 67 65 28 4d 65 6d 46 69 6c 65  bEnlarge(MemFile
1720: 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
1730: 36 34 20 6e 65 77 53 7a 29 7b 0a 20 20 75 6e 73  64 newSz){.  uns
1740: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 77  igned char *pNew
1750: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 6d 46 6c 61  ;.  if( (p->mFla
1760: 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45 53 45  gs & SQLITE_DESE
1770: 52 49 41 4c 49 5a 45 5f 52 45 53 49 5a 45 41 42  RIALIZE_RESIZEAB
1780: 4c 45 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 4d 6d  LE)==0 || p->nMm
1790: 61 70 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ap>0 ){.    retu
17a0: 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
17b0: 20 20 7d 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c    }.  pNew = sql
17c0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
17d0: 2d 3e 61 44 61 74 61 2c 20 6e 65 77 53 7a 29 3b  ->aData, newSz);
17e0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
17f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1800: 4f 4d 45 4d 3b 0a 20 20 70 2d 3e 61 44 61 74 61  OMEM;.  p->aData
1810: 20 3d 20 70 4e 65 77 3b 0a 20 20 70 2d 3e 73 7a   = pNew;.  p->sz
1820: 4d 61 78 20 3d 20 6e 65 77 53 7a 3b 0a 20 20 72  Max = newSz;.  r
1830: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
1850: 64 61 74 61 20 74 6f 20 61 6e 20 6d 65 6d 64 62  data to an memdb
1860: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
1870: 20 69 6e 74 20 6d 65 6d 64 62 57 72 69 74 65 28   int memdbWrite(
1880: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1890: 2a 70 46 69 6c 65 2c 0a 20 20 63 6f 6e 73 74 20  *pFile,.  const 
18a0: 76 6f 69 64 20 2a 7a 2c 0a 20 20 69 6e 74 20 69  void *z,.  int i
18b0: 41 6d 74 2c 0a 20 20 73 71 6c 69 74 65 5f 69 6e  Amt,.  sqlite_in
18c0: 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 4d  t64 iOfst.){.  M
18d0: 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d  emFile *p = (Mem
18e0: 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
18f0: 69 66 28 20 69 4f 66 73 74 2b 69 41 6d 74 3e 70  if( iOfst+iAmt>p
1900: 2d 3e 73 7a 20 29 7b 0a 20 20 20 20 69 6e 74 20  ->sz ){.    int 
1910: 72 63 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 73  rc;.    if( iOfs
1920: 74 2b 69 41 6d 74 3e 70 2d 3e 73 7a 4d 61 78 0a  t+iAmt>p->szMax.
1930: 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 6d 65       && (rc = me
1940: 6d 64 62 45 6e 6c 61 72 67 65 28 70 2c 20 28 69  mdbEnlarge(p, (i
1950: 4f 66 73 74 2b 69 41 6d 74 29 2a 32 29 29 21 3d  Ofst+iAmt)*2))!=
1960: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 29 7b  SQLITE_OK.    ){
1970: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1990: 69 4f 66 73 74 3e 70 2d 3e 73 7a 20 29 20 6d 65  iOfst>p->sz ) me
19a0: 6d 73 65 74 28 70 2d 3e 61 44 61 74 61 2b 70 2d  mset(p->aData+p-
19b0: 3e 73 7a 2c 20 30 2c 20 69 4f 66 73 74 2d 70 2d  >sz, 0, iOfst-p-
19c0: 3e 73 7a 29 3b 0a 20 20 20 20 70 2d 3e 73 7a 20  >sz);.    p->sz 
19d0: 3d 20 69 4f 66 73 74 2b 69 41 6d 74 3b 0a 20 20  = iOfst+iAmt;.  
19e0: 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44  }.  memcpy(p->aD
19f0: 61 74 61 2b 69 4f 66 73 74 2c 20 7a 2c 20 69 41  ata+iOfst, z, iA
1a00: 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  mt);.  return SQ
1a10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1a20: 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6d 65  * Truncate an me
1a30: 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  mdb-file..**.** 
1a40: 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  In rollback mode
1a50: 20 28 77 68 69 63 68 20 69 73 20 61 6c 77 61 79   (which is alway
1a60: 73 20 74 68 65 20 63 61 73 65 20 66 6f 72 20 6d  s the case for m
1a70: 65 6d 64 62 2c 20 61 73 20 69 74 20 64 6f 65 73  emdb, as it does
1a80: 20 6e 6f 74 0a 2a 2a 20 73 75 70 70 6f 72 74 20   not.** support 
1a90: 57 41 4c 20 6d 6f 64 65 29 20 74 68 65 20 74 72  WAL mode) the tr
1aa0: 75 6e 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20  uncate() method 
1ab0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 74 6f 20  is only used to 
1ac0: 72 65 64 75 63 65 0a 2a 2a 20 74 68 65 20 73 69  reduce.** the si
1ad0: 7a 65 20 6f 66 20 61 20 66 69 6c 65 2c 20 6e 65  ze of a file, ne
1ae0: 76 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  ver to increase 
1af0: 74 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  the size..*/.sta
1b00: 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 54 72 75  tic int memdbTru
1b10: 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
1b20: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
1b30: 65 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20  e_int64 size){. 
1b40: 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d   MemFile *p = (M
1b50: 65 6d 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  emFile *)pFile;.
1b60: 20 20 69 66 28 20 4e 45 56 45 52 28 73 69 7a 65    if( NEVER(size
1b70: 3e 70 2d 3e 73 7a 29 20 29 20 72 65 74 75 72 6e  >p->sz) ) return
1b80: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1b90: 70 2d 3e 73 7a 20 3d 20 73 69 7a 65 3b 20 0a 20  p->sz = size; . 
1ba0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
1bc0: 20 61 6e 20 6d 65 6d 64 62 2d 66 69 6c 65 2e 0a   an memdb-file..
1bd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
1be0: 6d 64 62 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  mdbSync(sqlite3_
1bf0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1c00: 20 66 6c 61 67 73 29 7b 0a 20 20 72 65 74 75 72   flags){.  retur
1c10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c20: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c30: 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d 73 69   current file-si
1c40: 7a 65 20 6f 66 20 61 6e 20 6d 65 6d 64 62 2d 66  ze of an memdb-f
1c50: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1c60: 6e 74 20 6d 65 6d 64 62 46 69 6c 65 53 69 7a 65  nt memdbFileSize
1c70: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
1c80: 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74  File, sqlite_int
1c90: 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 4d 65  64 *pSize){.  Me
1ca0: 6d 46 69 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46  mFile *p = (MemF
1cb0: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 2a  ile *)pFile;.  *
1cc0: 70 53 69 7a 65 20 3d 20 70 2d 3e 73 7a 3b 0a 20  pSize = p->sz;. 
1cd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ce0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  K;.}../*.** Lock
1cf0: 20 61 6e 20 6d 65 6d 64 62 2d 66 69 6c 65 2e 0a   an memdb-file..
1d00: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65  */.static int me
1d10: 6d 64 62 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  mdbLock(sqlite3_
1d20: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
1d30: 20 65 4c 6f 63 6b 29 7b 0a 20 20 4d 65 6d 46 69   eLock){.  MemFi
1d40: 6c 65 20 2a 70 20 3d 20 28 4d 65 6d 46 69 6c 65  le *p = (MemFile
1d50: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 65   *)pFile;.  p->e
1d60: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
1d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d80: 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e 65  ;.}..#if 0 /* Ne
1d90: 76 65 72 20 75 73 65 64 20 62 65 63 61 75 73 65  ver used because
1da0: 20 6d 65 6d 64 62 41 63 63 65 73 73 28 29 20 61   memdbAccess() a
1db0: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 66 61  lways returns fa
1dc0: 6c 73 65 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68 65  lse */./*.** Che
1dd0: 63 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66 69  ck if another fi
1de0: 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20  le-handle holds 
1df0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1e00: 6f 6e 20 61 6e 20 6d 65 6d 64 62 2d 66 69 6c 65  on an memdb-file
1e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e20: 6d 65 6d 64 62 43 68 65 63 6b 52 65 73 65 72 76  memdbCheckReserv
1e30: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
1e40: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
1e50: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 2a 70 52  *pResOut){.  *pR
1e60: 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
1e70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
1e90: 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile control meth
1ea0: 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f  od. For custom o
1eb0: 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20  perations on an 
1ec0: 6d 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  memdb-file..*/.s
1ed0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 46  tatic int memdbF
1ee0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1ef0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
1f00: 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1f10: 72 67 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a  rg){.  MemFile *
1f20: 70 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a 29 70  p = (MemFile *)p
1f30: 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d  File;.  int rc =
1f40: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1f50: 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  ;.  if( op==SQLI
1f60: 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
1f70: 20 29 7b 0a 20 20 20 20 2a 28 63 68 61 72 2a 2a   ){.    *(char**
1f80: 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
1f90: 6d 70 72 69 6e 74 66 28 22 6d 65 6d 64 62 28 25  mprintf("memdb(%
1fa0: 70 2c 25 6c 6c 64 29 22 2c 20 70 2d 3e 61 44 61  p,%lld)", p->aDa
1fb0: 74 61 2c 20 70 2d 3e 73 7a 29 3b 0a 20 20 20 20  ta, p->sz);.    
1fc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1fd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1fe0: 0a 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f  .}..#if 0  /* No
1ff0: 74 20 75 73 65 64 20 62 65 63 61 75 73 65 20 6f  t used because o
2000: 66 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  f SQLITE_IOCAP_P
2010: 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
2020: 54 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TE */./*.** Retu
2030: 72 6e 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  rn the sector-si
2040: 7a 65 20 69 6e 20 62 79 74 65 73 20 66 6f 72 20  ze in bytes for 
2050: 61 6e 20 6d 65 6d 64 62 2d 66 69 6c 65 2e 0a 2a  an memdb-file..*
2060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d  /.static int mem
2070: 64 62 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  dbSectorSize(sql
2080: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2090: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34  ){.  return 1024
20a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
20b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
20c0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
20d0: 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74  ic flags support
20e0: 65 64 20 62 79 20 61 6e 20 6d 65 6d 64 62 2d 66  ed by an memdb-f
20f0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
2100: 6e 74 20 6d 65 6d 64 62 44 65 76 69 63 65 43 68  nt memdbDeviceCh
2110: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
2120: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2130: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e){.  return SQL
2140: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2150: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 53 51 4c   | .         SQL
2160: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
2170: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 7c 0a  AFE_OVERWRITE |.
2180: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2190: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
21a0: 44 20 7c 0a 20 20 20 20 20 20 20 20 20 53 51 4c  D |.         SQL
21b0: 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
21c0: 54 49 41 4c 3b 0a 7d 0a 0a 2f 2a 20 46 65 74 63  TIAL;.}../* Fetc
21d0: 68 20 61 20 70 61 67 65 20 6f 66 20 61 20 6d 65  h a page of a me
21e0: 6d 6f 72 79 2d 6d 61 70 70 65 64 20 66 69 6c 65  mory-mapped file
21f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
2200: 65 6d 64 62 46 65 74 63 68 28 0a 20 20 73 71 6c  emdbFetch(.  sql
2210: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
2220: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
2230: 34 20 69 4f 66 73 74 2c 0a 20 20 69 6e 74 20 69  4 iOfst,.  int i
2240: 41 6d 74 2c 0a 20 20 76 6f 69 64 20 2a 2a 70 70  Amt,.  void **pp
2250: 0a 29 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70  .){.  MemFile *p
2260: 20 3d 20 28 4d 65 6d 46 69 6c 65 20 2a 29 70 46   = (MemFile *)pF
2270: 69 6c 65 3b 0a 20 20 70 2d 3e 6e 4d 6d 61 70 2b  ile;.  p->nMmap+
2280: 2b 3b 0a 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  +;.  *pp = (void
2290: 2a 29 28 70 2d 3e 61 44 61 74 61 20 2b 20 69 4f  *)(p->aData + iO
22a0: 66 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  fst);.  return S
22b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
22c0: 52 65 6c 65 61 73 65 20 61 20 6d 65 6d 6f 72 79  Release a memory
22d0: 2d 6d 61 70 70 65 64 20 70 61 67 65 20 2a 2f 0a  -mapped page */.
22e0: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62  static int memdb
22f0: 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
2300: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
2310: 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74  ite3_int64 iOfst
2320: 2c 20 76 6f 69 64 20 2a 70 50 61 67 65 29 7b 0a  , void *pPage){.
2330: 20 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28    MemFile *p = (
2340: 4d 65 6d 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  MemFile *)pFile;
2350: 0a 20 20 70 2d 3e 6e 4d 6d 61 70 2d 2d 3b 0a 20  .  p->nMmap--;. 
2360: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2370: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  K;.}../*.** Open
2380: 20 61 6e 20 6d 65 6d 20 66 69 6c 65 20 68 61 6e   an mem file han
2390: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
23a0: 6e 74 20 6d 65 6d 64 62 4f 70 65 6e 28 0a 20 20  nt memdbOpen(.  
23b0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23c0: 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s,.  const char 
23d0: 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65  *zName,.  sqlite
23e0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20  3_file *pFile,. 
23f0: 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e   int flags,.  in
2400: 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a  t *pOutFlags.){.
2410: 20 20 4d 65 6d 46 69 6c 65 20 2a 70 20 3d 20 28    MemFile *p = (
2420: 4d 65 6d 46 69 6c 65 2a 29 70 46 69 6c 65 3b 0a  MemFile*)pFile;.
2430: 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 53    if( (flags & S
2440: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2450: 44 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  DB)==0 ){.    re
2460: 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66  turn ORIGVFS(pVf
2470: 73 29 2d 3e 78 4f 70 65 6e 28 4f 52 49 47 56 46  s)->xOpen(ORIGVF
2480: 53 28 70 56 66 73 29 2c 20 7a 4e 61 6d 65 2c 20  S(pVfs), zName, 
2490: 70 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 70 4f  pFile, flags, pO
24a0: 75 74 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  utFlags);.  }.  
24b0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
24c0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e 6d  eof(*p));.  p->m
24d0: 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 44  Flags = SQLITE_D
24e0: 45 53 45 52 49 41 4c 49 5a 45 5f 52 45 53 49 5a  ESERIALIZE_RESIZ
24f0: 45 41 42 4c 45 20 7c 20 53 51 4c 49 54 45 5f 44  EABLE | SQLITE_D
2500: 45 53 45 52 49 41 4c 49 5a 45 5f 46 52 45 45 4f  ESERIALIZE_FREEO
2510: 4e 43 4c 4f 53 45 3b 0a 20 20 61 73 73 65 72 74  NCLOSE;.  assert
2520: 28 20 70 4f 75 74 46 6c 61 67 73 21 3d 30 20 29  ( pOutFlags!=0 )
2530: 3b 20 20 2f 2a 20 54 72 75 65 20 62 65 63 61 75  ;  /* True becau
2540: 73 65 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  se flags==SQLITE
2550: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 2a 2f  _OPEN_MAIN_DB */
2560: 0a 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20  .  *pOutFlags = 
2570: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
2580: 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 70 2d  PEN_MEMORY;.  p-
2590: 3e 62 61 73 65 2e 70 4d 65 74 68 6f 64 73 20 3d  >base.pMethods =
25a0: 20 26 6d 65 6d 64 62 5f 69 6f 5f 6d 65 74 68 6f   &memdb_io_metho
25b0: 64 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ds;.  return SQL
25c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30  ITE_OK;.}..#if 0
25d0: 20 2f 2a 20 4f 6e 6c 79 20 75 73 65 64 20 74 6f   /* Only used to
25e0: 20 64 65 6c 65 74 65 20 72 6f 6c 6c 62 61 63 6b   delete rollback
25f0: 20 6a 6f 75 72 6e 61 6c 73 2c 20 6d 61 73 74 65   journals, maste
2600: 72 20 6a 6f 75 72 6e 61 6c 73 2c 20 61 6e 64 20  r journals, and 
2610: 57 41 4c 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  WAL.      ** fil
2620: 65 73 2c 20 6e 6f 6e 65 20 6f 66 20 77 68 69 63  es, none of whic
2630: 68 20 65 78 69 73 74 20 69 6e 20 6d 65 6d 64 62  h exist in memdb
2640: 2e 20 20 53 6f 20 74 68 69 73 20 72 6f 75 74 69  .  So this routi
2650: 6e 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  ne is never used
2660: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65   */./*.** Delete
2670: 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 61 74 65   the file locate
2680: 64 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74  d at zPath. If t
2690: 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d  he dirSync argum
26a0: 65 6e 74 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  ent is true,.** 
26b0: 65 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 2d  ensure the file-
26c0: 73 79 73 74 65 6d 20 6d 6f 64 69 66 69 63 61 74  system modificat
26d0: 69 6f 6e 73 20 61 72 65 20 73 79 6e 63 65 64 20  ions are synced 
26e0: 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 0a 2a  to disk before.*
26f0: 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  * returning..*/.
2700: 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62  static int memdb
2710: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
2720: 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
2730: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
2740: 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 72 65 74   dirSync){.  ret
2750: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2760: 5f 44 45 4c 45 54 45 3b 0a 7d 0a 23 65 6e 64 69  _DELETE;.}.#endi
2770: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f  f../*.** Test fo
2780: 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
2790: 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75  ions. Return tru
27a0: 65 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  e if the request
27b0: 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a  ed permission.**
27c0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f   is available, o
27d0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
27e0: 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 6d 65  e..**.** With me
27f0: 6d 64 62 2c 20 6e 6f 20 66 69 6c 65 73 20 65 76  mdb, no files ev
2800: 65 72 20 65 78 69 73 74 20 6f 6e 20 64 69 73 6b  er exist on disk
2810: 2e 20 20 53 6f 20 61 6c 77 61 79 73 20 72 65 74  .  So always ret
2820: 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74  urn false..*/.st
2830: 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 41 63  atic int memdbAc
2840: 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
2850: 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f  vfs *pVfs, .  co
2860: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
2870: 20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a   .  int flags, .
2880: 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29    int *pResOut.)
2890: 7b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  {.  *pResOut = 0
28a0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
28b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  E_OK;.}../*.** P
28c0: 6f 70 75 6c 61 74 65 20 62 75 66 66 65 72 20 7a  opulate buffer z
28d0: 4f 75 74 20 77 69 74 68 20 74 68 65 20 66 75 6c  Out with the ful
28e0: 6c 20 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68  l canonical path
28f0: 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  name correspondi
2900: 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 74  ng.** to the pat
2910: 68 6e 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20  hname in zPath. 
2920: 7a 4f 75 74 20 69 73 20 67 75 61 72 61 6e 74 65  zOut is guarante
2930: 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  ed to point to a
2940: 20 62 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74   buffer.** of at
2950: 20 6c 65 61 73 74 20 28 49 4e 53 54 5f 4d 41 58   least (INST_MAX
2960: 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20 62 79 74  _PATHNAME+1) byt
2970: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2980: 74 20 6d 65 6d 64 62 46 75 6c 6c 50 61 74 68 6e  t memdbFullPathn
2990: 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
29a0: 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e  fs *pVfs, .  con
29b0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
29c0: 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20  .  int nOut, .  
29d0: 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20  char *zOut.){.  
29e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
29f0: 28 6e 4f 75 74 2c 20 7a 4f 75 74 2c 20 22 25 73  (nOut, zOut, "%s
2a00: 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72 65 74  ", zPath);.  ret
2a10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a20: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
2a30: 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79   dynamic library
2a40: 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74   located at zPat
2a50: 68 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 68  h and return a h
2a60: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
2a70: 20 76 6f 69 64 20 2a 6d 65 6d 64 62 44 6c 4f 70   void *memdbDlOp
2a80: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
2a90: 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
2aa0: 20 2a 7a 50 61 74 68 29 7b 0a 20 20 72 65 74 75   *zPath){.  retu
2ab0: 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66 73 29  rn ORIGVFS(pVfs)
2ac0: 2d 3e 78 44 6c 4f 70 65 6e 28 4f 52 49 47 56 46  ->xDlOpen(ORIGVF
2ad0: 53 28 70 56 66 73 29 2c 20 7a 50 61 74 68 29 3b  S(pVfs), zPath);
2ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
2af0: 74 65 20 74 68 65 20 62 75 66 66 65 72 20 7a 45  te the buffer zE
2b00: 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74  rrMsg (size nByt
2b10: 65 20 62 79 74 65 73 29 20 77 69 74 68 20 61 20  e bytes) with a 
2b20: 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a  human readable.*
2b30: 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64  * utf-8 string d
2b40: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f  escribing the mo
2b50: 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
2b60: 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f  encountered asso
2b70: 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
2b80: 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65  dynamic librarie
2b90: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2ba0: 64 20 6d 65 6d 64 62 44 6c 45 72 72 6f 72 28 73  d memdbDlError(s
2bb0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2bc0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
2bd0: 72 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 4f  r *zErrMsg){.  O
2be0: 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78 44  RIGVFS(pVfs)->xD
2bf0: 6c 45 72 72 6f 72 28 4f 52 49 47 56 46 53 28 70  lError(ORIGVFS(p
2c00: 56 66 73 29 2c 20 6e 42 79 74 65 2c 20 7a 45 72  Vfs), nByte, zEr
2c10: 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rMsg);.}../*.** 
2c20: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
2c30: 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a   to the symbol z
2c40: 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64 79  Symbol in the dy
2c50: 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70 48  namic library pH
2c60: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
2c70: 20 76 6f 69 64 20 28 2a 6d 65 6d 64 62 44 6c 53   void (*memdbDlS
2c80: 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ym(sqlite3_vfs *
2c90: 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63  pVfs, void *p, c
2ca0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29  onst char *zSym)
2cb0: 29 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  )(void){.  retur
2cc0: 6e 20 4f 52 49 47 56 46 53 28 70 56 66 73 29 2d  n ORIGVFS(pVfs)-
2cd0: 3e 78 44 6c 53 79 6d 28 4f 52 49 47 56 46 53 28  >xDlSym(ORIGVFS(
2ce0: 70 56 66 73 29 2c 20 70 2c 20 7a 53 79 6d 29 3b  pVfs), p, zSym);
2cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
2d00: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
2d10: 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64  ary handle pHand
2d20: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
2d30: 69 64 20 6d 65 6d 64 62 44 6c 43 6c 6f 73 65 28  id memdbDlClose(
2d40: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2d50: 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
2d60: 29 7b 0a 20 20 4f 52 49 47 56 46 53 28 70 56 66  ){.  ORIGVFS(pVf
2d70: 73 29 2d 3e 78 44 6c 43 6c 6f 73 65 28 4f 52 49  s)->xDlClose(ORI
2d80: 47 56 46 53 28 70 56 66 73 29 2c 20 70 48 61 6e  GVFS(pVfs), pHan
2d90: 64 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  dle);.}../*.** P
2da0: 6f 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66  opulate the buff
2db0: 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  er pointed to by
2dc0: 20 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42   zBufOut with nB
2dd0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a  yte bytes of .**
2de0: 20 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f   random data..*/
2df0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64  .static int memd
2e00: 62 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  bRandomness(sqli
2e10: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
2e20: 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a  nt nByte, char *
2e30: 7a 42 75 66 4f 75 74 29 7b 0a 20 20 72 65 74 75  zBufOut){.  retu
2e40: 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66 73 29  rn ORIGVFS(pVfs)
2e50: 2d 3e 78 52 61 6e 64 6f 6d 6e 65 73 73 28 4f 52  ->xRandomness(OR
2e60: 49 47 56 46 53 28 70 56 66 73 29 2c 20 6e 42 79  IGVFS(pVfs), nBy
2e70: 74 65 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a  te, zBufOut);.}.
2e80: 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
2e90: 20 6e 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63   nMicro microsec
2ea0: 6f 6e 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65  onds. Return the
2eb0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
2ec0: 73 65 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75  seconds .** actu
2ed0: 61 6c 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  ally slept..*/.s
2ee0: 74 61 74 69 63 20 69 6e 74 20 6d 65 6d 64 62 53  tatic int memdbS
2ef0: 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
2f00: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d 69 63   *pVfs, int nMic
2f10: 72 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f 52  ro){.  return OR
2f20: 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78 53 6c  IGVFS(pVfs)->xSl
2f30: 65 65 70 28 4f 52 49 47 56 46 53 28 70 56 66 73  eep(ORIGVFS(pVfs
2f40: 29 2c 20 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 23  ), nMicro);.}..#
2f50: 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 75  if 0  /* Never u
2f60: 73 65 64 2e 20 20 4d 6f 64 65 72 6e 20 63 6f 72  sed.  Modern cor
2f70: 65 73 20 6f 6e 6c 79 20 63 61 6c 6c 20 78 43 75  es only call xCu
2f80: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 29  rrentTimeInt64()
2f90: 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
2fa0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
2fb0: 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
2fc0: 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69  y number in *pTi
2fd0: 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  meOut..*/.static
2fe0: 20 69 6e 74 20 6d 65 6d 64 62 43 75 72 72 65 6e   int memdbCurren
2ff0: 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
3000: 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
3010: 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72 65  *pTimeOut){.  re
3020: 74 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66  turn ORIGVFS(pVf
3030: 73 29 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  s)->xCurrentTime
3040: 28 4f 52 49 47 56 46 53 28 70 56 66 73 29 2c 20  (ORIGVFS(pVfs), 
3050: 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 23 65 6e  pTimeOut);.}.#en
3060: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
3070: 6d 65 6d 64 62 47 65 74 4c 61 73 74 45 72 72 6f  memdbGetLastErro
3080: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
3090: 56 66 73 2c 20 69 6e 74 20 61 2c 20 63 68 61 72  Vfs, int a, char
30a0: 20 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 4f   *b){.  return O
30b0: 52 49 47 56 46 53 28 70 56 66 73 29 2d 3e 78 47  RIGVFS(pVfs)->xG
30c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 4f 52 49 47  etLastError(ORIG
30d0: 56 46 53 28 70 56 66 73 29 2c 20 61 2c 20 62 29  VFS(pVfs), a, b)
30e0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.}.static int m
30f0: 65 6d 64 62 43 75 72 72 65 6e 74 54 69 6d 65 49  emdbCurrentTimeI
3100: 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
3110: 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f   *pVfs, sqlite3_
3120: 69 6e 74 36 34 20 2a 70 29 7b 0a 20 20 72 65 74  int64 *p){.  ret
3130: 75 72 6e 20 4f 52 49 47 56 46 53 28 70 56 66 73  urn ORIGVFS(pVfs
3140: 29 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49  )->xCurrentTimeI
3150: 6e 74 36 34 28 4f 52 49 47 56 46 53 28 70 56 66  nt64(ORIGVFS(pVf
3160: 73 29 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  s), p);.}../*.**
3170: 20 54 72 61 6e 73 6c 61 74 65 20 61 20 64 61 74   Translate a dat
3180: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
3190: 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 63 68   pointer and sch
31a0: 65 6d 61 20 6e 61 6d 65 20 69 6e 74 6f 20 61 0a  ema name into a.
31b0: 2a 2a 20 4d 65 6d 46 69 6c 65 20 70 6f 69 6e 74  ** MemFile point
31c0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
31d0: 6d 46 69 6c 65 20 2a 6d 65 6d 64 62 46 72 6f 6d  mFile *memdbFrom
31e0: 44 62 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  DbSchema(sqlite3
31f0: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
3200: 20 2a 7a 53 63 68 65 6d 61 29 7b 0a 20 20 4d 65   *zSchema){.  Me
3210: 6d 46 69 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  mFile *p = 0;.  
3220: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
3230: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
3240: 2c 20 7a 53 63 68 65 6d 61 2c 20 53 51 4c 49 54  , zSchema, SQLIT
3250: 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
3260: 4e 54 45 52 2c 20 26 70 29 3b 0a 20 20 69 66 28  NTER, &p);.  if(
3270: 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   rc ) return 0;.
3280: 20 20 69 66 28 20 70 2d 3e 62 61 73 65 2e 70 4d    if( p->base.pM
3290: 65 74 68 6f 64 73 21 3d 26 6d 65 6d 64 62 5f 69  ethods!=&memdb_i
32a0: 6f 5f 6d 65 74 68 6f 64 73 20 29 20 72 65 74 75  o_methods ) retu
32b0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 0;.  return p
32c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
32d0: 6e 20 74 68 65 20 73 65 72 69 61 6c 69 7a 61 74  n the serializat
32e0: 69 6f 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73  ion of a databas
32f0: 65 0a 2a 2f 0a 75 6e 73 69 67 6e 65 64 20 63 68  e.*/.unsigned ch
3300: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 65 72 69  ar *sqlite3_seri
3310: 61 6c 69 7a 65 28 0a 20 20 73 71 6c 69 74 65 33  alize(.  sqlite3
3320: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
3330: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3340: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
3350: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3360: 53 63 68 65 6d 61 2c 20 20 20 20 20 20 2f 2a 20  Schema,      /* 
3370: 57 68 69 63 68 20 64 61 74 61 62 61 73 65 20 77  Which database w
3380: 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 6e 65 63  ithin the connec
3390: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
33a0: 33 5f 69 6e 74 36 34 20 2a 70 69 53 69 7a 65 2c  3_int64 *piSize,
33b0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 69 7a      /* Write siz
33c0: 65 20 68 65 72 65 2c 20 69 66 20 6e 6f 74 20 4e  e here, if not N
33d0: 55 4c 4c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ULL */.  unsigne
33e0: 64 20 69 6e 74 20 6d 46 6c 61 67 73 20 20 20 20  d int mFlags    
33f0: 20 20 20 2f 2a 20 4d 61 79 62 65 20 53 51 4c 49     /* Maybe SQLI
3400: 54 45 5f 53 45 52 49 41 4c 49 5a 45 5f 4e 4f 43  TE_SERIALIZE_NOC
3410: 4f 50 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 46  OPY */.){.  MemF
3420: 69 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 44  ile *p;.  int iD
3430: 62 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  b;.  Btree *pBt;
3440: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
3450: 20 73 7a 3b 0a 20 20 69 6e 74 20 73 7a 50 61 67   sz;.  int szPag
3460: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
3470: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
3480: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
3490: 72 20 2a 70 4f 75 74 3b 0a 20 20 63 68 61 72 20  r *pOut;.  char 
34a0: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zSql;.  int rc;
34b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
34c0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
34d0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
34e0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
34f0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
3500: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
3510: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
3520: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
3530: 28 20 7a 53 63 68 65 6d 61 3d 3d 30 20 29 20 7a  ( zSchema==0 ) z
3540: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
3550: 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  [0].zDbSName;.  
3560: 70 20 3d 20 6d 65 6d 64 62 46 72 6f 6d 44 62 53  p = memdbFromDbS
3570: 63 68 65 6d 61 28 64 62 2c 20 7a 53 63 68 65 6d  chema(db, zSchem
3580: 61 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  a);.  iDb = sqli
3590: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
35a0: 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20 69 66  , zSchema);.  if
35b0: 28 20 70 69 53 69 7a 65 20 29 20 2a 70 69 53 69  ( piSize ) *piSi
35c0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 69  ze = -1;.  if( i
35d0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  Db<0 ) return 0;
35e0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
35f0: 69 66 28 20 70 69 53 69 7a 65 20 29 20 2a 70 69  if( piSize ) *pi
3600: 53 69 7a 65 20 3d 20 70 2d 3e 73 7a 3b 0a 20 20  Size = p->sz;.  
3610: 20 20 69 66 28 20 6d 46 6c 61 67 73 20 26 20 53    if( mFlags & S
3620: 51 4c 49 54 45 5f 53 45 52 49 41 4c 49 5a 45 5f  QLITE_SERIALIZE_
3630: 4e 4f 43 4f 50 59 20 29 7b 0a 20 20 20 20 20 20  NOCOPY ){.      
3640: 70 4f 75 74 20 3d 20 70 2d 3e 61 44 61 74 61 3b  pOut = p->aData;
3650: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3660: 20 20 70 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    pOut = sqlite3
3670: 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 2d 3e 73 7a  _malloc64( p->sz
3680: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
3690: 75 74 20 29 20 6d 65 6d 63 70 79 28 70 4f 75 74  ut ) memcpy(pOut
36a0: 2c 20 70 2d 3e 61 44 61 74 61 2c 20 70 2d 3e 73  , p->aData, p->s
36b0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  z);.    }.    re
36c0: 74 75 72 6e 20 70 4f 75 74 3b 0a 20 20 7d 0a 20  turn pOut;.  }. 
36d0: 20 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69   pBt = db->aDb[i
36e0: 44 62 5d 2e 70 42 74 3b 0a 20 20 69 66 28 20 70  Db].pBt;.  if( p
36f0: 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Bt==0 ) return 0
3700: 3b 0a 20 20 73 7a 50 61 67 65 20 3d 20 73 71 6c  ;.  szPage = sql
3710: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
3720: 53 69 7a 65 28 70 42 74 29 3b 0a 20 20 7a 53 71  Size(pBt);.  zSq
3730: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
3740: 6e 74 66 28 22 50 52 41 47 4d 41 20 5c 22 25 77  ntf("PRAGMA \"%w
3750: 5c 22 2e 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20  \".page_count", 
3760: 7a 53 63 68 65 6d 61 29 3b 0a 20 20 72 63 20 3d  zSchema);.  rc =
3770: 20 7a 53 71 6c 20 3f 20 73 71 6c 69 74 65 33 5f   zSql ? sqlite3_
3780: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
3790: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
37a0: 20 30 29 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d   0) : SQLITE_NOM
37b0: 45 4d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  EM;.  sqlite3_fr
37c0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ee(zSql);.  if( 
37d0: 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rc ) return 0;. 
37e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
37f0: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ep(pStmt);.  if(
3800: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
3810: 29 7b 0a 20 20 20 20 70 4f 75 74 20 3d 20 30 3b  ){.    pOut = 0;
3820: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 7a  .  }else{.    sz
3830: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
3840: 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 30  n_int64(pStmt, 0
3850: 29 2a 73 7a 50 61 67 65 3b 0a 20 20 20 20 69 66  )*szPage;.    if
3860: 28 20 70 69 53 69 7a 65 20 29 20 2a 70 69 53 69  ( piSize ) *piSi
3870: 7a 65 20 3d 20 73 7a 3b 0a 20 20 20 20 69 66 28  ze = sz;.    if(
3880: 20 6d 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45   mFlags & SQLITE
3890: 5f 53 45 52 49 41 4c 49 5a 45 5f 4e 4f 43 4f 50  _SERIALIZE_NOCOP
38a0: 59 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 20  Y ){.      pOut 
38b0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
38c0: 20 20 20 20 20 20 70 4f 75 74 20 3d 20 73 71 6c        pOut = sql
38d0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
38e0: 7a 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  z );.      if( p
38f0: 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Out ){.        i
3900: 6e 74 20 6e 50 61 67 65 20 3d 20 73 71 6c 69 74  nt nPage = sqlit
3910: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
3920: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  tmt, 0);.       
3930: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
3940: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
3950: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  er(pBt);.       
3960: 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
3970: 20 20 20 66 6f 72 28 70 67 6e 6f 3d 31 3b 20 70     for(pgno=1; p
3980: 67 6e 6f 3c 3d 6e 50 61 67 65 3b 20 70 67 6e 6f  gno<=nPage; pgno
3990: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44  ++){.          D
39a0: 62 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  bPage *pPage = 0
39b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 73 69  ;.          unsi
39c0: 67 6e 65 64 20 63 68 61 72 20 2a 70 54 6f 20 3d  gned char *pTo =
39d0: 20 70 4f 75 74 20 2b 20 73 7a 50 61 67 65 2a 28   pOut + szPage*(
39e0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 70  sqlite3_int64)(p
39f0: 67 6e 6f 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  gno-1);.        
3a00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
3a10: 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
3a20: 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
3a30: 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  pPage, 0);.     
3a40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
3a50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
3a60: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 6f        memcpy(pTo
3a70: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  , sqlite3PagerGe
3a80: 74 44 61 74 61 28 70 50 61 67 65 29 2c 20 73 7a  tData(pPage), sz
3a90: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
3aa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3ab0: 20 20 20 20 6d 65 6d 73 65 74 28 70 54 6f 2c 20      memset(pTo, 
3ac0: 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
3ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3ae0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
3af0: 72 65 66 28 70 50 61 67 65 29 3b 20 20 20 20 20  ref(pPage);     
3b00: 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20    .        }.   
3b10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
3b20: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
3b30: 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75  e(pStmt);.  retu
3b40: 72 6e 20 70 4f 75 74 3b 0a 7d 0a 0a 2f 2a 20 43  rn pOut;.}../* C
3b50: 6f 6e 76 65 72 74 20 7a 53 63 68 65 6d 61 20 74  onvert zSchema t
3b60: 6f 20 61 20 4d 65 6d 44 42 20 61 6e 64 20 69 6e  o a MemDB and in
3b70: 69 74 69 61 6c 69 7a 65 20 69 74 73 20 63 6f 6e  itialize its con
3b80: 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tent..*/.int sql
3b90: 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a 65  ite3_deserialize
3ba0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3bc0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
3bd0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
3be0: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
3bf0: 20 20 20 20 2f 2a 20 57 68 69 63 68 20 44 42 20      /* Which DB 
3c00: 74 6f 20 72 65 6f 70 65 6e 20 77 69 74 68 20 74  to reopen with t
3c10: 68 65 20 64 65 73 65 72 69 61 6c 69 7a 61 74 69  he deserializati
3c20: 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
3c30: 20 63 68 61 72 20 2a 70 44 61 74 61 2c 20 20 20   char *pData,   
3c40: 2f 2a 20 54 68 65 20 73 65 72 69 61 6c 69 7a 65  /* The serialize
3c50: 64 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  d database conte
3c60: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  nt */.  sqlite3_
3c70: 69 6e 74 36 34 20 73 7a 44 62 2c 20 20 20 20 20  int64 szDb,     
3c80: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
3c90: 69 6e 20 74 68 65 20 64 65 73 65 72 69 61 6c 69  in the deseriali
3ca0: 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
3cb0: 74 65 33 5f 69 6e 74 36 34 20 73 7a 42 75 66 2c  te3_int64 szBuf,
3cc0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
3cd0: 65 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74  e of buffer pDat
3ce0: 61 5b 5d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  a[] */.  unsigne
3cf0: 64 20 6d 46 6c 61 67 73 20 20 20 20 20 20 20 20  d mFlags        
3d00: 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   /* Zero or more
3d10: 20 53 51 4c 49 54 45 5f 44 45 53 45 52 49 41 4c   SQLITE_DESERIAL
3d20: 49 5a 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29  IZE_* flags */.)
3d30: 7b 0a 20 20 4d 65 6d 46 69 6c 65 20 2a 70 3b 0a  {.  MemFile *p;.
3d40: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
3d50: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
3d60: 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  tmt = 0;.  int r
3d70: 63 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 23  c;.  int iDb;..#
3d80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
3d90: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
3da0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
3db0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
3dc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3dd0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
3de0: 20 20 7d 0a 20 20 69 66 28 20 73 7a 44 62 3c 30    }.  if( szDb<0
3df0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
3e00: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
3e10: 69 66 28 20 73 7a 42 75 66 3c 30 20 29 20 72 65  if( szBuf<0 ) re
3e20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
3e30: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
3e40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
3e50: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
3e60: 29 3b 0a 20 20 69 66 28 20 7a 53 63 68 65 6d 61  );.  if( zSchema
3e70: 3d 3d 30 20 29 20 7a 53 63 68 65 6d 61 20 3d 20  ==0 ) zSchema = 
3e80: 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e  db->aDb[0].zDbSN
3e90: 61 6d 65 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ame;.  iDb = sql
3ea0: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
3eb0: 62 2c 20 7a 53 63 68 65 6d 61 29 3b 0a 20 20 69  b, zSchema);.  i
3ec0: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
3ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
3ee0: 52 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  R;.    goto end_
3ef0: 64 65 73 65 72 69 61 6c 69 7a 65 3b 0a 20 20 7d  deserialize;.  }
3f00: 20 20 20 20 0a 20 20 7a 53 71 6c 20 3d 20 73 71      .  zSql = sq
3f10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 41  lite3_mprintf("A
3f20: 54 54 41 43 48 20 78 20 41 53 20 25 51 22 2c 20  TTACH x AS %Q", 
3f30: 7a 53 63 68 65 6d 61 29 3b 0a 20 20 72 63 20 3d  zSchema);.  rc =
3f40: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
3f50: 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
3f60: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
3f70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
3f80: 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  l);.  if( rc ) g
3f90: 6f 74 6f 20 65 6e 64 5f 64 65 73 65 72 69 61 6c  oto end_deserial
3fa0: 69 7a 65 3b 0a 20 20 64 62 2d 3e 69 6e 69 74 2e  ize;.  db->init.
3fb0: 69 44 62 20 3d 20 28 75 38 29 69 44 62 3b 0a 20  iDb = (u8)iDb;. 
3fc0: 20 64 62 2d 3e 69 6e 69 74 2e 72 65 6f 70 65 6e   db->init.reopen
3fd0: 4d 65 6d 64 62 20 3d 20 31 3b 0a 20 20 72 63 20  Memdb = 1;.  rc 
3fe0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
3ff0: 53 74 6d 74 29 3b 0a 20 20 64 62 2d 3e 69 6e 69  Stmt);.  db->ini
4000: 74 2e 72 65 6f 70 65 6e 4d 65 6d 64 62 20 3d 20  t.reopenMemdb = 
4010: 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
4020: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
4030: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
4040: 52 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  R;.    goto end_
4050: 64 65 73 65 72 69 61 6c 69 7a 65 3b 0a 20 20 7d  deserialize;.  }
4060: 0a 20 20 70 20 3d 20 6d 65 6d 64 62 46 72 6f 6d  .  p = memdbFrom
4070: 44 62 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  DbSchema(db, zSc
4080: 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 70 3d 3d  hema);.  if( p==
4090: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
40a0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
40b0: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 61 44 61 74  lse{.    p->aDat
40c0: 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 70  a = pData;.    p
40d0: 2d 3e 73 7a 20 3d 20 73 7a 44 62 3b 0a 20 20 20  ->sz = szDb;.   
40e0: 20 70 2d 3e 73 7a 4d 61 78 20 3d 20 73 7a 42 75   p->szMax = szBu
40f0: 66 3b 0a 20 20 20 20 70 2d 3e 6d 46 6c 61 67 73  f;.    p->mFlags
4100: 20 3d 20 6d 46 6c 61 67 73 3b 0a 20 20 20 20 72   = mFlags;.    r
4110: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4120: 20 7d 0a 0a 65 6e 64 5f 64 65 73 65 72 69 61 6c   }..end_deserial
4130: 69 7a 65 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  ize:.  sqlite3_f
4140: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
4150: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
4160: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
4170: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4180: 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
4190: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
41a0: 77 68 65 6e 20 74 68 65 20 65 78 74 65 6e 73 69  when the extensi
41b0: 6f 6e 20 69 73 20 6c 6f 61 64 65 64 2e 0a 2a 2a  on is loaded..**
41c0: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6e 65   Register the ne
41d0: 77 20 56 46 53 2e 0a 2a 2f 0a 69 6e 74 20 73 71  w VFS..*/.int sq
41e0: 6c 69 74 65 33 4d 65 6d 64 62 49 6e 69 74 28 76  lite3MemdbInit(v
41f0: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
4200: 76 66 73 20 2a 70 4c 6f 77 65 72 20 3d 20 73 71  vfs *pLower = sq
4210: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
4220: 29 3b 0a 20 20 69 6e 74 20 73 7a 20 3d 20 70 4c  );.  int sz = pL
4230: 6f 77 65 72 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a  ower->szOsFile;.
4240: 20 20 6d 65 6d 64 62 5f 76 66 73 2e 70 41 70 70    memdb_vfs.pApp
4250: 44 61 74 61 20 3d 20 70 4c 6f 77 65 72 3b 0a 20  Data = pLower;. 
4260: 20 2f 2a 20 49 6e 20 61 6c 6c 20 6b 6e 6f 77 6e   /* In all known
4270: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
4280: 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20 73  of SQLite, the s
4290: 69 7a 65 20 6f 66 20 61 20 64 65 66 61 75 6c 74  ize of a default
42a0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  .  ** sqlite3_fi
42b0: 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
42c0: 61 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  an the size of a
42d0: 20 6d 65 6d 64 62 20 73 71 6c 69 74 65 33 5f 66   memdb sqlite3_f
42e0: 69 6c 65 2e 0a 20 20 2a 2a 20 53 68 6f 75 6c 64  ile..  ** Should
42f0: 20 74 68 61 74 20 65 76 65 72 20 63 68 61 6e 67   that ever chang
4300: 65 2c 20 72 65 6d 6f 76 65 20 74 68 65 20 66 6f  e, remove the fo
4310: 6c 6c 6f 77 69 6e 67 20 4e 45 56 45 52 28 29 20  llowing NEVER() 
4320: 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 73  */.  if( NEVER(s
4330: 7a 3c 73 69 7a 65 6f 66 28 4d 65 6d 46 69 6c 65  z<sizeof(MemFile
4340: 29 29 20 29 20 73 7a 20 3d 20 73 69 7a 65 6f 66  )) ) sz = sizeof
4350: 28 4d 65 6d 46 69 6c 65 29 3b 0a 20 20 6d 65 6d  (MemFile);.  mem
4360: 64 62 5f 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20  db_vfs.szOsFile 
4370: 3d 20 73 7a 3b 0a 20 20 72 65 74 75 72 6e 20 73  = sz;.  return s
4380: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
4390: 74 65 72 28 26 6d 65 6d 64 62 5f 76 66 73 2c 20  ter(&memdb_vfs, 
43a0: 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
43b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45  SQLITE_ENABLE_DE
43c0: 53 45 52 49 41 4c 49 5a 45 20 2a 2f 0a           SERIALIZE */.