/ Hex Artifact Content
Login

Artifact 47acbe149a48abbe578f1d753706e6b0ab9d8001:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 39  : pager.c,v 1.59
0350: 30 20 32 30 30 39 2f 30 35 2f 32 39 20 31 31 3a  0 2009/05/29 11:
0360: 35 37 3a 33 38 20 64 72 68 20 45 78 70 20 24 0a  57:38 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  t.h"../*.** Macr
03b0: 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68  os for troublesh
03c0: 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c  ooting.  Normall
03d0: 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a  y turned off.*/.
03e0: 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69 74 65  #if 0.int sqlite
03f0: 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b 20 20  3PagerTrace=1;  
0400: 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61 62 6c  /* True to enabl
0410: 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 64 65  e tracing */.#de
0420: 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62 75  fine sqlite3Debu
0430: 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a 23  gPrintf printf.#
0440: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
0450: 45 28 58 29 20 20 20 20 20 69 66 28 20 73 71 6c  E(X)     if( sql
0460: 69 74 65 33 50 61 67 65 72 54 72 61 63 65 20 29  ite3PagerTrace )
0470: 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72  { sqlite3DebugPr
0480: 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73 65 0a  intf X; }.#else.
0490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
04a0: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
04b0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
04c0: 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65  g two macros are
04d0: 20 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65   used within the
04e0: 20 50 41 47 45 52 54 52 41 43 45 28 29 20 6d 61   PAGERTRACE() ma
04f0: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0500: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0510: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0520: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0530: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0540: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
0550: 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e  as its argument.
0560: 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   The.** associat
0570: 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ed file-descript
0580: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  or is returned. 
0590: 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74  FILEHANDLEID() t
05a0: 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65 33 5f  akes an sqlite3_
05b0: 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 20 61  file.** struct a
05c0: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a  s its argument..
05d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
05e0: 49 44 28 70 29 20 28 28 69 6e 74 29 28 70 2d 3e  ID(p) ((int)(p->
05f0: 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49 4c  fd)).#define FIL
0600: 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 28  EHANDLEID(fd) ((
0610: 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54  int)fd)../*.** T
0620: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
0630: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
0640: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0660: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0670: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0680: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0690: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
06a0: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06c0: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
06d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
06e0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
06f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0700: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
0710: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
0720: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
0730: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
0740: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0750: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0760: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0770: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0780: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0790: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
07b0: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
07c0: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
07d0: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
0800: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
0810: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
0840: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0850: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0860: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0870: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0880: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0890: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
08c0: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
08d0: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
08e0: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0900: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0910: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0920: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0930: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0950: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0960: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0970: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0990: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
09a0: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
09b0: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
09c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09d0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
09e0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
09f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0a00: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0a10: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0a20: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0a50: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0a60: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0a70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0a80: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0a90: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0aa0: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0ab0: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0ad0: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0af0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0b00: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0b10: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0b20: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0b30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b40: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0b50: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0b60: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0b70: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0ba0: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0bb0: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0bc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0bd0: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0be0: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0bf0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0c00: 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  e or.**         
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0c20: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
0c30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0c40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20 63 6f        will be co
0c70: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  mmitted..**.** T
0c80: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f  he page cache co
0c90: 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f  mes up in PAGER_
0ca0: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0cb0: 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c  st time a.** sql
0cc0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f  ite3PagerGet() o
0cd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0ce0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0cf0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0d00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0d10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0d20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0d30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0d40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0d50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0d60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0d70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0d80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67   that sqlite3Pag
0d90: 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
0da0: 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74  led, the state t
0db0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a  ransitions to.**
0dc0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0dd0: 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c    (Note that sql
0de0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
0df0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20   can only be.** 
0e00: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74  called on an out
0e10: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68  standing page wh
0e20: 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ich means that t
0e30: 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a  he pager must.**
0e40: 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41   be in PAGER_SHA
0e50: 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72  RED before it tr
0e60: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e70: 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a  ER_RESERVED.).**
0e80: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0e90: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 72 65  means that there
0ea0: 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c   is an open roll
0eb0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
0ec0: 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   The transition 
0ed0: 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
0ee0: 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f 72 65  VE occurs before
0ef0: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
0f00: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
0f10: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
0f20: 68 6f 75 67 68 20 77 72 69 74 65 73 20 74 6f 20  hough writes to 
0f30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
0f40: 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73 20 77  journal occurs w
0f50: 69 74 68 20 6a 75 73 74 20 50 41 47 45 52 5f 52  ith just PAGER_R
0f60: 45 53 45 52 56 45 44 2e 20 20 41 66 74 65 72 20  ESERVED.  After 
0f70: 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  an sqlite3PagerR
0f80: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
0f90: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
0fa0: 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20 74 68  itPhaseTwo(), th
0fb0: 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f 20 62  e state can go b
0fc0: 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
0fd0: 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61  RED,.** or it ca
0fe0: 6e 20 73 74 61 79 20 61 74 20 50 41 47 45 52 5f  n stay at PAGER_
0ff0: 45 58 43 4c 55 53 49 56 45 20 69 66 20 77 65 20  EXCLUSIVE if we 
1000: 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65  are in exclusive
1010: 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f   access mode..*/
1020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55  .#define PAGER_U
1030: 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65  NLOCK      0.#de
1040: 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45  fine PAGER_SHARE
1050: 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61  D      1   /* sa
1060: 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43  me as SHARED_LOC
1070: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1080: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32  ER_RESERVED    2
1090: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45     /* same as RE
10a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23  SERVED_LOCK */.#
10b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43  define PAGER_EXC
10c0: 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20  LUSIVE   4   /* 
10d0: 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56  same as EXCLUSIV
10e0: 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  E_LOCK */.#defin
10f0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20  e PAGER_SYNCED  
1100: 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d      5../*.** A m
1110: 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e  acro used for in
1120: 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63  voking the codec
1130: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1140: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1150: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65  E_HAS_CODEC.# de
1160: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
1170: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
1180: 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64  ec!=0 ){ P->xCod
1190: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
11a0: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69  D,N,X); }.# defi
11b0: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
11c0: 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78  X) ((char*)(P->x
11d0: 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64  Codec!=0?P->xCod
11e0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
11f0: 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65  D,N,X):D)).#else
1200: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
1210: 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d  (P,D,N,X) /* NO-
1220: 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43  OP */.# define C
1230: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28  ODEC2(P,D,N,X) (
1240: 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66  (char*)D).#endif
1250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
1260: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74  mum allowed sect
1270: 6f 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49  or size. 16MB. I
1280: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
1290: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
12a0: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
12b0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
12c0: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
12d0: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
12e0: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
12f0: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
1300: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
1310: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
1320: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
1330: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
1340: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
1350: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
1360: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
1370: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
1380: 53 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a  SIZE 0x0100000..
1390: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
13a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
13b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
13c0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
13d0: 63 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76  ch active.** sav
13e0: 65 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65  epoint and state
13f0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1400: 20 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20   in the system. 
1410: 41 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75  All such structu
1420: 72 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  res.** are store
1430: 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  d in the Pager.a
1440: 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
1450: 79 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f  y, which is allo
1460: 63 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73  cated and.** res
1470: 69 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ized using sqlit
1480: 65 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3Realloc()..**.
1490: 2a 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  ** When a savepo
14a0: 69 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20  int is created, 
14b0: 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
14c0: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
14d0: 65 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  eld is.** set to
14e0: 20 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   0. If a journal
14f0: 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74  -header is writt
1500: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  en into the main
1510: 20 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a   journal while.*
1520: 2a 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * the savepoint 
1530: 69 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20  is active, then 
1540: 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65  iHdrOffset is se
1550: 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66  t to the byte of
1560: 66 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61  fset .** immedia
1570: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
1580: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20  he last journal 
1590: 72 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69  record written i
15a0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20  nto the main.** 
15b0: 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74  journal before t
15c0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
15d0: 72 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  r. This is requi
15e0: 72 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70  red during savep
15f0: 6f 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  oint.** rollback
1600: 20 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62   (see pagerPlayb
1610: 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e  ackSavepoint()).
1620: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1630: 63 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ct PagerSavepoin
1640: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1650: 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61  ;.struct PagerSa
1660: 76 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20  vepoint {.  i64 
1670: 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  iOffset;        
1680: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
1690: 74 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d  ting offset in m
16a0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
16b0: 20 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b   i64 iHdrOffset;
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d0: 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20   See above */.  
16e0: 42 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70  Bitvec *pInSavep
16f0: 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  oint;        /* 
1700: 53 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  Set of pages in 
1710: 74 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a  this savepoint *
1720: 2f 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20  /.  Pgno nOrig; 
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d   /* Original num
1750: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1760: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  file */.  Pgno i
1770: 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20  SubRec;         
1780: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1790: 6f 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20  of first record 
17a0: 69 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  in sub-journal *
17b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  /.};../*.** A op
17c0: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
17d0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
17e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
17f0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65  ructure..**.** e
1800: 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50  rrCode.**.**   P
1810: 61 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79  ager.errCode may
1820: 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54   be set to SQLIT
1830: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
1840: 43 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20  CORRUPT, or.**  
1850: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e   or SQLITE_FULL.
1860: 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65   Once one of the
1870: 20 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72   first three err
1880: 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70  ors occurs, it p
1890: 65 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64  ersists.**   and
18a0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
18b0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76  the result of ev
18c0: 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20  ery major pager 
18d0: 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a  API call.  The.*
18e0: 2a 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  *   SQLITE_FULL 
18f0: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
1900: 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e  lightly differen
1910: 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f  t. It persists o
1920: 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  nly until the.**
1930: 20 20 20 6e 65 78 74 20 73 75 63 63 65 73 73 66     next successf
1940: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
1950: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
1960: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
1970: 6f 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46  o,.**   SQLITE_F
1980: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
1990: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
19a0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
19b0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
19c0: 28 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68  ().**   APIs, th
19d0: 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ey may still be 
19e0: 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  used successfull
19f0: 79 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56  y..**.** dbSizeV
1a00: 61 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62  alid, dbSize, db
1a10: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
1a20: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e  Size.**.**   Man
1a30: 61 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f  aging the size o
1a40: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1a50: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20  ile in pages is 
1a60: 61 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63  a little complic
1a70: 61 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76  ated..**   The v
1a80: 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62  ariable Pager.db
1a90: 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Size contains th
1aa0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1ab0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
1ac0: 61 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63  ase.**   image c
1ad0: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
1ae0: 73 2e 20 41 73 20 74 68 65 20 64 61 74 61 62 61  s. As the databa
1af0: 73 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f  se image grows o
1b00: 72 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a  r shrinks this.*
1b10: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 69 73 20  *   variable is 
1b20: 75 70 64 61 74 65 64 2e 20 54 68 65 20 76 61 72  updated. The var
1b30: 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69  iable Pager.dbFi
1b40: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
1b50: 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20  the number.**   
1b60: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
1b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1b80: 68 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65  his may be diffe
1b90: 72 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e  rent from Pager.
1ba0: 64 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73  dbSize.**   if s
1bb0: 6f 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62  ome pages have b
1bc0: 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20  een appended to 
1bd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
1be0: 67 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77  ge but not yet w
1bf0: 72 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20  ritten.**   out 
1c00: 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74  from the cache t
1c10: 6f 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  o the actual fil
1c20: 65 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66  e on disk. Or if
1c30: 20 74 68 65 20 69 6d 61 67 65 20 68 61 73 20 62   the image has b
1c40: 65 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74  een.**   truncat
1c50: 65 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65  ed by an increme
1c60: 6e 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72  ntal-vacuum oper
1c70: 61 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72  ation. The Pager
1c80: 2e 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69  .dbOrigSize vari
1c90: 61 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69  able.**   contai
1ca0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1cb0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
1cc0: 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65  tabase image whe
1cd0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
1ce0: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77     transaction w
1cf0: 61 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63  as opened. The c
1d00: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74  ontents of all t
1d10: 68 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61  hree of these va
1d20: 72 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20  riables is.**   
1d30: 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20  only guaranteed 
1d40: 74 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69 66  to be correct if
1d50: 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67   the boolean Pag
1d60: 65 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69  er.dbSizeValid i
1d70: 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  s true..**.**   
1d80: 54 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74  TODO: Under what
1d90: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64   conditions is d
1da0: 62 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20  bSizeValid set? 
1db0: 43 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63  Cleared?.**.** c
1dc0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a  hangeCountDone.*
1dd0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c  *.**   This bool
1de0: 65 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20  ean variable is 
1df0: 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
1e00: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67  e that the chang
1e10: 65 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20  e-counter .**   
1e20: 28 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64  (the 4-byte head
1e30: 65 72 20 66 69 65 6c 64 20 61 74 20 62 79 74 65  er field at byte
1e40: 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68   offset 24 of th
1e50: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1e60: 20 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70   is .**   not up
1e70: 64 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e  dated more often
1e80: 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e   than necessary.
1e90: 20 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20   .**.**   It is 
1ea0: 73 65 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e  set to true when
1eb0: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1ec0: 74 65 72 20 66 69 65 6c 64 20 69 73 20 75 70 64  ter field is upd
1ed0: 61 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20  ated, which .** 
1ee0: 20 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65    can only happe
1ef0: 6e 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76  n if an exclusiv
1f00: 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
1f10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1f20: 69 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20  ile..**   It is 
1f30: 63 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f 20  cleared (set to 
1f40: 66 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20  false) whenever 
1f50: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1f60: 6b 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e  k is .**   relin
1f70: 71 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64  quished on the d
1f80: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61  atabase file. Ea
1f90: 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
1fa0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
1fb0: 65 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61  ed,.**   The cha
1fc0: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
1fd0: 67 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20  g is inspected. 
1fe0: 49 66 20 69 74 20 69 73 20 74 72 75 65 2c 20 74  If it is true, t
1ff0: 68 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20  he work of.**   
2000: 75 70 64 61 74 69 6e 67 20 74 68 65 20 63 68 61  updating the cha
2010: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f  nge-counter is o
2020: 6d 69 74 74 65 64 20 66 6f 72 20 74 68 65 20 63  mitted for the c
2030: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2040: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  on..**.**   This
2050: 20 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73   mechanism means
2060: 20 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69   that when runni
2070: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
2080: 6d 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69  mode, a connecti
2090: 6f 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e  on .**   need on
20a0: 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ly update the ch
20b0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63  ange-counter onc
20c0: 65 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  e, for the first
20d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
20e0: 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a    committed..**.
20f0: 2a 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a  ** dbModified.**
2100: 0a 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69  .**   The dbModi
2110: 66 69 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  fied flag is set
2120: 20 77 68 65 6e 65 76 65 72 20 61 20 64 61 74 61   whenever a data
2130: 62 61 73 65 20 70 61 67 65 20 69 73 20 64 69 72  base page is dir
2140: 74 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73  tied..**   It is
2150: 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 65 20   cleared at the 
2160: 65 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e  end of each tran
2170: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
2180: 20 49 74 20 69 73 20 75 73 65 64 20 77 68 65 6e   It is used when
2190: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f   committing or o
21a0: 74 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20  therwise ending 
21b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
21c0: 66 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64  f.**   the dbMod
21d0: 69 66 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c  ified flag is cl
21e0: 65 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f  ear then less wo
21f0: 72 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e  rk has to be don
2200: 65 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e..**.** journal
2210: 53 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20  Started.**.**   
2220: 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74  This flag is set
2230: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68   whenever the th
2240: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  e main journal i
2250: 73 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  s synced. .**.**
2260: 20 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20     The point of 
2270: 74 68 69 73 20 66 6c 61 67 20 69 73 20 74 68 61  this flag is tha
2280: 74 20 69 74 20 6d 75 73 74 20 62 65 20 73 65 74  t it must be set
2290: 20 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20   after the .**  
22a0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
22b0: 65 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e  eader in a journ
22c0: 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  al file has been
22d0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
22e0: 0a 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69 73  .**   After this
22f0: 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e   has happened, n
2300: 65 77 20 70 61 67 65 73 20 61 70 70 65 6e 64 65  ew pages appende
2310: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
2320: 65 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e  e .**   do not n
2330: 65 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45  eed the PGHDR_NE
2340: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74  ED_SYNC flag set
2350: 2c 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74  , as they do not
2360: 20 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61   need.**   to wa
2370: 69 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c  it for a journal
2380: 20 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65   sync before the
2390: 79 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  y can be written
23a0: 20 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65   out to.**   the
23b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
23c0: 73 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67  see function pag
23d0: 65 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20  er_write())..** 
23e0: 20 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a    .** setMaster.
23f0: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72  **.**   This var
2400: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
2410: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
2420: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2430: 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28  file name.**   (
2440: 69 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20  if any) is only 
2450: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
2470: 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ce..**.**   When
2480: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
2490: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d  ansaction, the m
24a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
24b0: 6c 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29  le name (if any)
24c0: 0a 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69  .**   may be wri
24d0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
24e0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65  urnal file while
24f0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74   the pager is st
2500: 69 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45  ill in.**   PAGE
2510: 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2520: 20 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73   (see CommitPhas
2530: 65 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61  eOne() for the a
2540: 63 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20  ction). It.**   
2550: 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  then attempts to
2560: 20 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65   upgrade to an e
2570: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49  xclusive lock. I
2580: 66 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a  f this attempt.*
2590: 2a 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  *   fails, then 
25a0: 53 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20  SQLITE_BUSY may 
25b0: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  be returned to t
25c0: 68 65 20 75 73 65 72 20 61 6e 64 20 74 68 65 20  he user and the 
25d0: 75 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74  user.**   may at
25e0: 74 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20  tempt to commit 
25f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2600: 61 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c  again later (cal
2610: 6c 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74  ling.**   Commit
2620: 50 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e  PhaseOne() again
2630: 29 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73 20  ). This flag is 
2640: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
2650: 68 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61  hat the .**   ma
2660: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
2670: 65 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65  e is only writte
2680: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2690: 20 66 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a   file the first.
26a0: 2a 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74  **   time Commit
26b0: 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61  PhaseOne() is ca
26c0: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f  lled..**.** doNo
26d0: 74 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tSync.**.**   Th
26e0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  is variable is s
26f0: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  et and cleared b
2700: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
2710: 69 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65  ite()..**.** nee
2720: 64 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f  dSync.**.**   TO
2730: 44 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20  DO: It might be 
2740: 65 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68  easier to set th
2750: 69 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77  is variable in w
2760: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
2770: 0a 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d  .**   and writeM
2780: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f  asterJournal() o
2790: 6e 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20  nly. Change its 
27a0: 6d 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79  meaning to "unsy
27b0: 6e 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68  nced data.**   h
27c0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
27d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e  to the journal".
27e0: 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d  .**.** subjInMem
27f0: 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ory.**.**   This
2800: 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   is a boolean va
2810: 72 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c  riable. If true,
2820: 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
2830: 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  ed sub-journal.*
2840: 2a 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73  *   is opened as
2850: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
2860: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66  urnal file. If f
2870: 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65  alse, then in-me
2880: 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f  mory.**   sub-jo
2890: 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20  urnals are only 
28a0: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
28b0: 72 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a  ry pager files..
28c0: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
28d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
28e0: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
28f0: 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20  /* OS functions 
2900: 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f  to use for IO */
2910: 0a 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d  .  u8 exclusiveM
2920: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
2930: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20  * Boolean. True 
2940: 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  if locking_mode=
2950: 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20  =EXCLUSIVE */.  
2960: 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20  u8 journalMode; 
2970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2980: 6e 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a  n of the PAGER_J
2990: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c  OURNALMODE_* val
29a0: 75 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ues */.  u8 useJ
29b0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
29c0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
29d0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
29e0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
29f0: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a10: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2a20: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2a30: 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  s */.  u8 noSync
2a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a50: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
2a60: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
2a70: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
2a80: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
2a90: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
2aa0: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
2ab0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
2ac0: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73  stness */.  u8 s
2ad0: 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20  ync_flags;      
2ae0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2af0: 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  f SYNC_NORMAL or
2b00: 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20   SYNC_FULL */.  
2b10: 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20  u8 tempFile;    
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2b30: 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65  Filename is a te
2b40: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mporary file */.
2b50: 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20    u8 readOnly;  
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b70: 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
2b80: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
2b90: 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20  /.  u8 memDb;   
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62  /* True to inhib
2bc0: 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20  it all file I/O 
2bd0: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  */..  /* The fol
2be0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e  lowing block con
2bf0: 74 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73  tains those clas
2c00: 73 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61  s members that a
2c10: 72 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20  re dynamically. 
2c20: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72   ** modified dur
2c30: 69 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  ing normal opera
2c40: 74 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72  tions. The other
2c50: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
2c60: 69 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  is structure.  *
2c70: 2a 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e  * are either con
2c80: 73 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74  stant throughout
2c90: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
2ca0: 20 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65   the pager, or e
2cb0: 6c 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f  lse.  ** used to
2cc0: 20 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61   store configura
2cd0: 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20  tion parameters 
2ce0: 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20  that affect the 
2cf0: 77 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20  way the pager . 
2d00: 20 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20   ** operates..  
2d10: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61  **.  ** The 'sta
2d20: 74 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20  te' variable is 
2d30: 64 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72  described in mor
2d40: 65 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77  e detail along w
2d50: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  ith the.  ** des
2d60: 63 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65  criptions of the
2d70: 20 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74   values it may t
2d80: 61 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f  ake - PAGER_UNLO
2d90: 43 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20  CK etc. Many of 
2da0: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76  the.  ** other v
2db0: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73  ariables in this
2dc0: 20 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72   block are descr
2dd0: 69 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d  ibed in the comm
2de0: 65 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20  ent directly .  
2df0: 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c  ** above this cl
2e00: 61 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  ass definition..
2e10: 20 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b    */.  u8 state;
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
2e40: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
2e50: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
2e60: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e80: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
2e90: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
2ea0: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
2eb0: 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20   needSync;      
2ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2ed0: 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20  e if an fsync() 
2ee0: 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65  is needed on the
2ef0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
2f00: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
2f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f20: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
2f30: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2f40: 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43   */.  u8 changeC
2f50: 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20  ountDone;       
2f60: 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69    /* Set after i
2f70: 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ncrementing the 
2f80: 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a  change-counter *
2f90: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
2fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fb0: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
2fc0: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
2fd0: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
2fe0: 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63  /.  u8 doNotSync
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3000: 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c  /* Boolean. Whil
3010: 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73  e true, do not s
3020: 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a  pill the cache *
3030: 2f 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c  /.  u8 dbSizeVal
3040: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3050: 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69  /* Set when dbSi
3060: 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f  ze is correct */
3070: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
3080: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
3090: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
30a0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
30b0: 6e 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  nals */.  Pgno d
30c0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
30d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30e0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
30f0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67  database */.  Pg
3100: 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20  no dbOrigSize;  
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53            /* dbS
3120: 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63  ize before the c
3130: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
3140: 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46  on */.  Pgno dbF
3150: 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ileSize;        
3160: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3170: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
3180: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
3190: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31b0: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
31c0: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
31d0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f0: 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c  /* Pages journal
3200: 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a  led since last j
3210: 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20  -header written 
3220: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e  */.  u32 cksumIn
3230: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
3240: 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d   /* Quasi-random
3250: 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20   value added to 
3260: 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a  every checksum *
3270: 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b  /.  u32 nSubRec;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  /* Number of rec
32a0: 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ords written to 
32b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  sub-journal */. 
32c0: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
32d0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
32e0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
32f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
3300: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3310: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3320: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
3330: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
3340: 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  or database */. 
3350: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
3360: 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd;          /* 
3370: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
3380: 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  for main journal
3390: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
33a0: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
33b0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
33c0: 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75  ptor for sub-jou
33d0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  rnal */.  i64 jo
33e0: 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20  urnalOff;       
33f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
3400: 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e   write offset in
3410: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3420: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
3430: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
3440: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
3450: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
3460: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
3470: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
3480: 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a   *aSavepoint; /*
3490: 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65   Array of active
34a0: 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20   savepoints */. 
34b0: 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b   int nSavepoint;
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34d0: 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
34e0: 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74  ts in aSavepoint
34f0: 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46  [] */.  char dbF
3500: 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20  ileVers[16];    
3510: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77      /* Changes w
3520: 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65  henever database
3530: 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f   file changes */
3540: 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a  .  u32 sectorSiz
3550: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
3560: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
3570: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
3580: 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 69 6e 74 20  lback */..  int 
3590: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
35a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
35b0: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
35c0: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
35d0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76   page */.  u32 v
35e0: 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  fsFlags;        
35f0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
3600: 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e  for sqlite3_vfs.
3610: 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  xOpen() */.  int
3620: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
3630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3640: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
3650: 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
3660: 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  mxPgno;         
3670: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
3680: 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f  m allowed size o
3690: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
36a0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
36b0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
36c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
36d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
36e0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
36f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3700: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
3710: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3720: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
3730: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
3740: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
3750: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
3760: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
3770: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
3780: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
3790: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
37a0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
37b0: 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c  TEST.  int nHit,
37c0: 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20   nMiss;         
37d0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
37e0: 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a   and missing */.
37f0: 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72    int nRead, nWr
3800: 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ite;          /*
3810: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
3820: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
3830: 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a  #endif.  void (*
3840: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
3850: 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  e*); /* Call thi
3860: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
3870: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
3880: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3890: 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64  HAS_CODEC.  void
38a0: 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
38b0: 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
38c0: 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f  ); /* Routine fo
38d0: 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61  r en/decoding da
38e0: 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ta */.  void *pC
38f0: 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20  odecArg;        
3900: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
3910: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28  ument to xCodec(
3920: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  ) */.#endif.  ch
3930: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3950: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
3960: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
3970: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36 34 20  mp use */.  i64 
3980: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
3990: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
39a0: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
39b0: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
39c0: 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  es */.  PCache *
39d0: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
39e0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
39f0: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
3a00: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
3a10: 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70  _backup *pBackup
3a20: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
3a30: 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f 69  to list of ongoi
3a40: 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ng backup proces
3a50: 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ses */.};../*.**
3a60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
3a70: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
3a80: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
3a90: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
3aa0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
3ab0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
3ac0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
3ad0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
3ae0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
3af0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
3b00: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
3b10: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3b20: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
3b30: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
3b40: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
3b50: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
3b60: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
3b70: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
3b80: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
3b90: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
3ba0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
3bb0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
3bc0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
3bd0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
3be0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
3bf0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
3c00: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
3c10: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
3c20: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
3c30: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3c40: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
3c50: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
3c60: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
3c70: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
3c80: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
3c90: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
3ca0: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
3cb0: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
3cc0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
3cd0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
3ce0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
3cf0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
3d00: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3d10: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
3d20: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
3d30: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3d40: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
3d50: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
3d60: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
3d70: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
3d80: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
3d90: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
3da0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
3db0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
3dc0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
3dd0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
3de0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
3df0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
3e00: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
3e10: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
3e20: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
3e30: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
3e40: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
3e50: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
3e60: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
3e70: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
3e80: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3e90: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
3ea0: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
3eb0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3ec0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
3ed0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3ee0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
3ef0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
3f00: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
3f10: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
3f20: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
3f30: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
3f40: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
3f50: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
3f60: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
3f70: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
3f80: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
3f90: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3fa0: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3fb0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3fc0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3fd0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3fe0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3ff0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
4000: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
4010: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
4020: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
4030: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
4040: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
4050: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
4060: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
4070: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
4080: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
4090: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
40a0: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
40b0: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
40c0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
40d0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
40e0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
40f0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
4100: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
4110: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
4120: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
4130: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
4140: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
4150: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
4160: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
4170: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
4180: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
4190: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
41a0: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
41b0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
41c0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
41d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
41e0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
41f0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
4200: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
4210: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
4220: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
4230: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
4240: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
4250: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
4260: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
4270: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
4280: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
4290: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
42a0: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
42b0: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
42c0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
42d0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
42e0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
42f0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
4300: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
4310: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
4320: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
4330: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
4340: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
4350: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
4360: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
4370: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
4380: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
4390: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
43a0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
43b0: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
43c0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
43d0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
43e0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
43f0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
4400: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
4410: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
4420: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
4430: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
4440: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
4450: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
4460: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
4470: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
4480: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
4490: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
44a0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
44b0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
44c0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
44d0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 23  NO 2147483647..#
44e0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
44f0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
4500: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
4510: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
4520: 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74 61  Pager) );.*/.sta
4530: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
4540: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
4550: 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f 2a   *pPager){..  /*
4560: 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73 20   A temp-file is 
4570: 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52 5f  always in PAGER_
4580: 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41 47  EXCLUSIVE or PAG
4590: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2e  ER_SYNCED state.
45a0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
45b0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
45c0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  0 || pPager->sta
45d0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
45e0: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  IVE );..  /* The
45f0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
4600: 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73 20   flag is always 
4610: 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  set for temp-fil
4620: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
4630: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
4640: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63  ==0 || pPager->c
4650: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29  hangeCountDone )
4660: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  ;..  return 1;.}
4670: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
4680: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
4690: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
46a0: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
46b0: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
46c0: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
46d0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
46e0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
46f0: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
4700: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
4710: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
4720: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
4730: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
4740: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
4750: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
4760: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
4770: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
4780: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
4790: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
47a0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
47b0: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
47c0: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
47d0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
47e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
47f0: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
4800: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
4810: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
4820: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
4830: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
4840: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
4850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
4860: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
4870: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
4880: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
4890: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
48a0: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
48b0: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
48c0: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
48d0: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
48e0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
48f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
4900: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4910: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
4920: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
4930: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
4940: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
4950: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
4960: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
4970: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
4980: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4990: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
49a0: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
49b0: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
49c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
49d0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
49e0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
49f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4a00: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
4a10: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
4a20: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
4a30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
4a40: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
4a50: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
4a60: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4a70: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4a80: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
4a90: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
4aa0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
4ab0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
4ac0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
4ad0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
4ae0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
4af0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
4b00: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4b10: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
4b20: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
4b30: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
4b40: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
4b50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4b60: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
4b70: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
4b80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4b90: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4ba0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4bb0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
4bc0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
4bd0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
4be0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
4bf0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
4c00: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
4c10: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4c20: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4c30: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4c40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4c50: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4c60: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4c70: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4c80: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4c90: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4ca0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4cb0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
4cc0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
4cd0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
4ce0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
4cf0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
4d00: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
4d10: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
4d20: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
4d30: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
4d40: 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69   to this macro i
4d50: 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  s a file descrip
4d60: 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74 65  tor (type sqlite
4d70: 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74  3_file*)..** Ret
4d80: 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e  urn 0 if it is n
4d90: 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d  ot open, or non-
4da0: 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29  zero (but not 1)
4db0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
4dc0: 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74   This is so that
4dd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e   expressions can
4de0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a   be written as:.
4df0: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70  **.**   if( isOp
4e00: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
4e10: 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73  ){ ....**.** ins
4e20: 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20  tead of.**.**   
4e30: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d  if( pPager->jfd-
4e40: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e  >pMethods ){ ...
4e50: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70  .*/.#define isOp
4e60: 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e  en(pFd) ((pFd)->
4e70: 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a  pMethods)../*.**
4e80: 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20   If file pFd is 
4e90: 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  open, call sqlit
4ea0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20  e3OsUnlock() on 
4eb0: 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
4ec0: 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  t osUnlock(sqlit
4ed0: 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e  e3_file *pFd, in
4ee0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20  t eLock){.  if( 
4ef0: 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b 0a  !isOpen(pFd) ){.
4f00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4f10: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
4f20: 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  rn sqlite3OsUnlo
4f30: 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a  ck(pFd, eLock);.
4f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
4f50: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
4f60: 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  s whether or not
4f70: 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
4f80: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a  e optimization.*
4f90: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69  * can be used wi
4fa0: 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54  th this pager. T
4fb0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
4fc0: 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a  can be used if:.
4fd0: 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76  **.**  (a) the v
4fe0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
4ff0: 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74   OsDeviceCharact
5000: 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63  eristics() indic
5010: 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  ates that.**    
5020: 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67    a database pag
5030: 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e  e may be written
5040: 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64   atomically, and
5050: 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c  .**  (b) the val
5060: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
5070: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73  sSectorSize() is
5080: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
5090: 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ual.**      to t
50a0: 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  he page size..**
50b0: 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  .** The optimiza
50c0: 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c 77  tion is also alw
50d0: 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  ays enabled for 
50e0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
50f0: 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72 72   It is.** an err
5100: 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  or to call this 
5110: 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61 67  function if pPag
5120: 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  er is opened on 
5130: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  an in-memory.** 
5140: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
5150: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
5160: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
5170: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
5180: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
5190: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
51a0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
51b0: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
51c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
51d0: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
51e0: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
51f0: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
5200: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
5210: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5220: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
5230: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
5240: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
5250: 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
5260: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
5270: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
5280: 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ile ){.    int d
5290: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
52b0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
52c0: 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69 6e  istics */.    in
52d0: 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20  t nSector;      
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52f0: 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a  /* Sector size *
5300: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  /.    int szPage
5310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5320: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
5330: 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73  size */..    ass
5340: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
5350: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20 64  er->fd) );.    d
5360: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
5370: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
5380: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
5390: 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70 50      nSector = pP
53a0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
53b0: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
53c0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
53d0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
53e0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
53f0: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
5400: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
5410: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
5420: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
5430: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
5440: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
5450: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
5460: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
5470: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
5480: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
5490: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
54a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
54b0: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
54c0: 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65 6e  Z(pPager);.}.#en
54d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  dif../*.** If SQ
54e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
54f0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
5500: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
5510: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
5520: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
5530: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
5540: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
5550: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
5560: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
5570: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
5580: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
5590: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
55a0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
55b0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
55c0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
55d0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
55e0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
55f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
5600: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
5610: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
5620: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
5630: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
5640: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
5650: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
5660: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
5670: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
5680: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
5690: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
56a0: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
56b0: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
56c0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
56d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
56e0: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
56f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
5700: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
5710: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
5720: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
5730: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
5740: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
5750: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
5760: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
5770: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
5780: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
5790: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
57a0: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
57b0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
57c0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
57d0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
57e0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
57f0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
5800: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
5810: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
5820: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
5830: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5840: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
5850: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
5860: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
5870: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
5880: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
5890: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
58a0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
58b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
58c0: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
58d0: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
58e0: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
58f0: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
5900: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
5910: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
5920: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
5930: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
5940: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
5950: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5960: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
5970: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
5980: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
5990: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
59a0: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
59b0: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
59c0: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
59d0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  n..** This funct
59e0: 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
59f0: 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f  read a master jo
5a00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5a10: 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64  from the .** end
5a20: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
5a30: 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  , if successful,
5a40: 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20   copies it into 
5a50: 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20  memory supplied 
5a60: 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65  .** by the calle
5a70: 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  r. See comments 
5a80: 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65  above writeMaste
5a90: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74  rJournal() for t
5aa0: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65  he format.** use
5ab0: 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73  d to store a mas
5ac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5ad0: 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64   name at the end
5ae0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   of a journal fi
5af0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65  le..**.** zMaste
5b00: 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  r must point to 
5b10: 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c  a buffer of at l
5b20: 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74  east nMaster byt
5b30: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
5b40: 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  ** the caller. T
5b50: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71  his should be sq
5b60: 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68  lite3_vfs.mxPath
5b70: 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72  name+1 (to ensur
5b80: 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e  e there is.** en
5b90: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77 72  ough space to wr
5ba0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
5bb0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66  ournal name). If
5bc0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5bd0: 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  nal.** name in t
5be0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f  he journal is lo
5bf0: 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65  nger than nMaste
5c00: 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69  r bytes (includi
5c10: 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  ng a.** nul-term
5c20: 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68  inator), then th
5c30: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73  is is handled as
5c40: 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   if no master jo
5c50: 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65  urnal name.** we
5c60: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
5c70: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
5c80: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
5c90: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
5ca0: 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68 65  s present at the
5cb0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
5cc0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  nal.** file, the
5cd0: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  n it is copied i
5ce0: 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70  nto the buffer p
5cf0: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
5d00: 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74  ster. A.** nul-t
5d10: 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
5d20: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
5d30: 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69  e buffer followi
5d40: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  ng the master.**
5d50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5d60: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20  me..**.** If it 
5d70: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  is determined th
5d80: 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  at no master jou
5d90: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
5da0: 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d  s present .** zM
5db0: 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20  aster[0] is set 
5dc0: 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f  to 0 and SQLITE_
5dd0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  OK returned..**.
5de0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
5df0: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61 64  ccurs while read
5e00: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
5e10: 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51  rnal file, an SQ
5e20: 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  Lite.** error co
5e30: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
5e40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5e50: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
5e60: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
5e70: 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74  rnl, char *zMast
5e80: 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29  er, u32 nMaster)
5e90: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5eb0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
5ec0: 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20  .  u32 len;     
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ee0: 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   Length in bytes
5ef0: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
5f00: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34  al name */.  i64
5f10: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
5f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
5f30: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
5f40: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70  f journal file p
5f50: 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  Jrnl */.  u32 ck
5f60: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
5f70: 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b       /* MJ check
5f80: 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66  sum value read f
5f90: 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
5fa0: 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20   u32 u;         
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
5fc0: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
5fd0: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
5fe0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
5ff0: 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72  ];   /* A buffer
6000: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
6010: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a  ic header */.  z
6020: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
6030: 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
6040: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
6050: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
6060: 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20  l, &szJ)).   || 
6070: 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c  szJ<16.   || SQL
6080: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
6090: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
60a0: 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20  szJ-16, &len)). 
60b0: 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65    || len>=nMaste
60c0: 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  r .   || SQLITE_
60d0: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
60e0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
60f0: 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20  12, &cksum)).   
6100: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
6110: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
6120: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
6130: 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c   8, szJ-8)).   |
6140: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
6150: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6160: 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  8).   || SQLITE_
6170: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
6180: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a  3OsRead(pJrnl, z
6190: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a  Master, len, szJ
61a0: 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20  -16-len)).  ){. 
61b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
61c0: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
61d0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
61e0: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
61f0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
6200: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b   for(u=0; u<len;
6210: 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   u++){.    cksum
6220: 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a   -= zMaster[u];.
6230: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
6240: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
6250: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
6260: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
6270: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
6280: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
6290: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
62a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
62b0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
62c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
62d0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
62e0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
62f0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
6300: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
6310: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
6320: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
6330: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
6340: 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20     */.    len = 
6350: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  0;.  }.  zMaster
6360: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
6370: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
6380: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6390: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
63a0: 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 62   of the sector b
63b0: 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d  oundary at or im
63c0: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f  mediately .** fo
63d0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75  llowing the valu
63e0: 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e in pPager->jou
63f0: 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e  rnalOff, assumin
6400: 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73  g a sector .** s
6410: 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73  ize of pPager->s
6420: 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e  ectorSize bytes.
6430: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
6440: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
6450: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67  512:.**.**   Pag
6460: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20  er.journalOff   
6470: 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76 61         Return va
6480: 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  lue.**   -------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20  0.**   512      
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20   512.**   100   
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6510: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30      512.**   200
6520: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6530: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
6540: 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f  */.static i64 jo
6550: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50  urnalHdrOffset(P
6560: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6570: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
6580: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
6590: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
65a0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
65b0: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
65c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
65d0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
65e0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
65f0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
6600: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
6610: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
6620: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6630: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
6640: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
6650: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
6660: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
6670: 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a  turn offset;.}..
6680: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
6690: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
66a0: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75  pen when this fu
66b0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
66c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
66d0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
66e0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
66f0: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
6700: 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20  n written to.** 
6710: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
6720: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28  nt transaction (
6730: 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f  i.e. if Pager.jo
6740: 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a  urnalOff==0)..**
6750: 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74  .** If doTruncat
6760: 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72  e is non-zero or
6770: 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e   the Pager.journ
6780: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69  alSizeLimit vari
6790: 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  able is.** set t
67a0: 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61  o 0, then trunca
67b0: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
67c0: 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  ile to zero byte
67d0: 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72  s in size. Other
67e0: 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68  wise,.** zero th
67f0: 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65 72  e 28-byte header
6800: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
6810: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6820: 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  e. In either cas
6830: 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  e, .** if the pa
6840: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f  ger is not in no
6850: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63  -sync mode, sync
6860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a  e immediately .*
6880: 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67 20  * after writing 
6890: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74  or truncating it
68a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72  ..**.** If Pager
68b0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
68c0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  t is set to a po
68d0: 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f  sitive, non-zero
68e0: 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66   value, and.** f
68f0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75  ollowing the tru
6900: 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69  ncation or zeroi
6910: 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  ng described abo
6920: 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ve the size of t
6930: 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  he .** journal f
6940: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73 20  ile in bytes is 
6950: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
6960: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75   value, then tru
6970: 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncate the.** jou
6980: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67  rnal file to Pag
6990: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
69a0: 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a  mit bytes. The j
69b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
69c0: 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  .** not need to 
69d0: 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77  be synced follow
69e0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
69f0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  on..**.** If an 
6a00: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
6a10: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
6a20: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
6a30: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
6a40: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
6a50: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6a70: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
6a80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
6a90: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
6aa0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6ab0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
6ae0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
6af0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
6b00: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
6b10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
6b20: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
6b30: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
6b40: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
6b50: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
6b60: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
6b70: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
6b80: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
6b90: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
6ba0: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
6bb0: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
6bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
6bd0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
6be0: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
6bf0: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
6c00: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
6c10: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
6c20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6c30: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6c40: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
6c50: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
6c60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6c80: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
6c90: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
6ca0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
6cb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
6cc0: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
6cd0: 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
6ce0: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
6cf0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
6d00: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6d10: 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75   is committed bu
6d20: 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  t the write lock
6d30: 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c   .    ** is stil
6d40: 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  l held on the fi
6d50: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
6d60: 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e  a size limit con
6d70: 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20  figured for .   
6d80: 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65   ** the persiste
6d90: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  nt journal and t
6da0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6db0: 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d  currently consum
6dc0: 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73  es more.    ** s
6dd0: 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c  pace than that l
6de0: 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c  imit allows for,
6df0: 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77   truncate it now
6e00: 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  . There is no ne
6e10: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e  ed.    ** to syn
6e20: 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f  c the file follo
6e30: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
6e40: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
6e50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6e60: 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b  K && iLimit>0 ){
6e70: 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20  .      i64 sz;. 
6e80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6e90: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
6ea0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20  er->jfd, &sz);. 
6eb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6ec0: 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69  ITE_OK && sz>iLi
6ed0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  mit ){.        r
6ee0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
6ef0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
6f00: 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  d, iLimit);.    
6f10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
6f20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6f30: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6f40: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
6f50: 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  n when this rout
6f60: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  ine is called. A
6f70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64   journal.** head
6f80: 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  er (JOURNAL_HDR_
6f90: 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69  SZ bytes) is wri
6fa0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
6fb0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68  urnal file at th
6fc0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63  e.** current loc
6fd0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
6fe0: 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   format for the 
6ff0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
7000: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
7010: 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69   - 8 bytes: Magi
7020: 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f  c identifying jo
7030: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a  urnal format..**
7040: 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62   - 4 bytes: Numb
7050: 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e  er of records in
7060: 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20   journal, or -1 
7070: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  no-sync mode is 
7080: 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  on..** - 4 bytes
7090: 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  : Random number 
70a0: 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61  used for page ha
70b0: 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  sh..** - 4 bytes
70c0: 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61  : Initial databa
70d0: 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  se page count..*
70e0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63  * - 4 bytes: Sec
70f0: 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79  tor size used by
7100: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
7110: 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75  t wrote this jou
7120: 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rnal..** - 4 byt
7130: 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67  es: Database pag
7140: 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46  e size..** .** F
7150: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
7160: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
7170: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
7180: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
7190: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
71a0: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
71b0: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
71c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
71e0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
71f0: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
7200: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
7210: 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79  e;  /* Temporary
7220: 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62   space used to b
7230: 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20  uild header */. 
7240: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70   u32 nHeader = p
7250: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
7260: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7270: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
7280: 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a  o by zHeader */.
7290: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20    u32 nWrite;   
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72b0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
72c0: 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20  f header sector 
72d0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74  written */.  int
72e0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7310: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
7320: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
7330: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
7340: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
7350: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69  be open. */..  i
7360: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
7370: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
7380: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
7390: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
73a0: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
73b0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
73c0: 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
73d0: 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74  nts and any of t
73e0: 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64  hem were created
73f0: 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65   .  ** since the
7400: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75   most recent jou
7410: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20  rnal header was 
7420: 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20  written, update 
7430: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53  the .  ** PagerS
7440: 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
7450: 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a  set fields now..
7460: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b    */.  for(ii=0;
7470: 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
7480: 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
7490: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
74a0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
74b0: 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20  drOffset==0 ){. 
74c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
74d0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72  vepoint[ii].iHdr
74e0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
74f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
7500: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
7510: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
7520: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7530: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
7540: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
7550: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
7560: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7570: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7580: 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  gic));..  /* .  
7590: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
75a0: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
75b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
75c0: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
75d0: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
75e0: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
75f0: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
7600: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
7610: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
7620: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
7630: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
7640: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7650: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
7660: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
7670: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
7680: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
7690: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
76a0: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
76b0: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
76c0: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
76d0: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
76e0: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
76f0: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
7700: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
7710: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
7720: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
7730: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
7740: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
7750: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
7760: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
7770: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
7780: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
7790: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
77a0: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
77b0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
77c0: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
77d0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
77e0: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
77f0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
7800: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
7810: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
7820: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
7830: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
7840: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
7850: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
7860: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
7870: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
7880: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
7890: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
78a0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
78b0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
78c0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
78d0: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
78e0: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
78f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
7900: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
7910: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
7920: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
7930: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
7940: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
7950: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
7960: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
7970: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
7980: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
7990: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
79a0: 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
79b0: 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70  r->noSync) || (p
79c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
79d0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
79e0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
79f0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
7a00: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7a10: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
7a20: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
7a30: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
7a40: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
7a50: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7a60: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7a70: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
7a80: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
7a90: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7aa0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7ab0: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
7ac0: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
7ad0: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
7ae0: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
7af0: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
7b00: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
7b10: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
7b20: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
7b30: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7b40: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7b50: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
7b60: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7b70: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
7b80: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
7b90: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7ba0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7bb0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
7bc0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
7bd0: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
7be0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7bf0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
7c00: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
7c10: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7c20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7c30: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
7c40: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
7c50: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
7c60: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
7c70: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7c80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
7c90: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
7ca0: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
7cb0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
7cc0: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
7cd0: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
7ce0: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
7cf0: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
7d00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
7d10: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
7d20: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
7d30: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
7d40: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
7d50: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
7d60: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
7d70: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
7d80: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
7d90: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
7da0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
7db0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7dc0: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
7dd0: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
7de0: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
7df0: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
7e00: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
7e10: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
7e20: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
7e30: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
7e40: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
7e50: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
7e60: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
7e70: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
7e80: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
7e90: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
7ea0: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
7eb0: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
7ec0: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
7ed0: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
7ee0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
7ef0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
7f00: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
7f10: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
7f20: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
7f30: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
7f40: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
7f50: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
7f60: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
7f70: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
7f80: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
7f90: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
7fa0: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
7fb0: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
7fc0: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
7fd0: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
7fe0: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
7ff0: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
8000: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
8010: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
8020: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
8030: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8040: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
8050: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
8060: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
8070: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
8080: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
8090: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
80a0: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
80b0: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
80c0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
80d0: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
80e0: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
80f0: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
8100: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
8110: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
8120: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
8130: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
8140: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
8150: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
8160: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
8170: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
8180: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
8190: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
81a0: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
81b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
81c0: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
81d0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
81e0: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
81f0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
8200: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
8210: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
8220: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
8230: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
8240: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8250: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
8260: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
8270: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8280: 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  f);.    pPager->
8290: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
82a0: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
82b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
82c0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
82d0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
82e0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
82f0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
8300: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
8310: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
8320: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
8330: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
8340: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
8350: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
8360: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
8370: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
8380: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
8390: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
83a0: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
83b0: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
83c0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
83d0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
83e0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
83f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8400: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
8410: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
8420: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
8430: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
8440: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
8450: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
8460: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
8470: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
8480: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
8490: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
84a0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
84b0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
84c0: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
84d0: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
84e0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
84f0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
8500: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
8510: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8520: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
8530: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
8540: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
8550: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
8560: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
8570: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
8580: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
8590: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
85a0: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
85b0: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
85c0: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
85d0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
85e0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
85f0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
8600: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
8610: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
8620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8630: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
8640: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8660: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
8670: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8680: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8690: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
86a0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
86b0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
86c0: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
86e0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
86f0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8700: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8710: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8720: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8730: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
8740: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
8750: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8760: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8770: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8780: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8790: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
87a0: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
87b0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
87c0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
87d0: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8800: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8810: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8820: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8830: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
8840: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
8850: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8860: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8870: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8880: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8890: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
88a0: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
88b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
88c0: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
88d0: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
88e0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
88f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8900: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8910: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8920: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8930: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8940: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8950: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8960: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8970: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8980: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8990: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
89a0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
89b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
89c0: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
89d0: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
89e0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
89f0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8a00: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8a10: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8a20: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8a30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8a40: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8a50: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8a60: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8a70: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8a80: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8a90: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8aa0: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8ab0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
8ac0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8ad0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8ae0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8af0: 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66 28 20  iHdrOff);.  if( 
8b00: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
8b10: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d   rc;.  }.  if( m
8b20: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8b30: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8b40: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8b50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8b60: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
8b70: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8b80: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8b90: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8ba0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8bb0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8bc0: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8bd0: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8be0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8bf0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8c00: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8c10: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8c20: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8c30: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8c40: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8c50: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8c60: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8c70: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8c80: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8c90: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8ca0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8cb0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8cc0: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8cd0: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8ce0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8cf0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8d00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8d10: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8d20: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8d30: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8d40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8d50: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8d60: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8d80: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8d90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8da0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8db0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8dc0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8dd0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8de0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8df0: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8e00: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8e10: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8e20: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8e30: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8e40: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8e50: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8e60: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8e70: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8e80: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8e90: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8ea0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8eb0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
8ec0: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
8ed0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8ee0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8ef0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8f00: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
8f10: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
8f20: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8f30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
8f40: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
8f50: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
8f60: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
8f70: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
8f80: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
8f90: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
8fa0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
8fb0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
8fc0: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
8fd0: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
8fe0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8ff0: 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
9000: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
9010: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
9020: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
9030: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
9040: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9050: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9070: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
9080: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
9090: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
90a0: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
90b0: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
90c0: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
90d0: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
90e0: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
90f0: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
9100: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
9110: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
9120: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
9130: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
9140: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
9150: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
9160: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
9170: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
9180: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9190: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
91a0: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
91b0: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
91c0: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
91d0: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
91e0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
91f0: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
9200: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
9210: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
9220: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
9230: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
9240: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9250: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
9260: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9270: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9280: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
9290: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
92a0: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
92b0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
92c0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
92d0: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
92e0: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
92f0: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
9300: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
9310: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
9320: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
9330: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
9340: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
9350: 50 61 67 65 53 69 7a 65 31 36 29 3b 0a 20 20 20  PageSize16);.   
9360: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
9370: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9380: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9390: 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69  TE_OK || iPageSi
93a0: 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65  ze16==(u16)iPage
93b0: 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
93c0: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
93d0: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
93e0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
93f0: 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
9400: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
9410: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
9420: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
9430: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
9440: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
9450: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
9460: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
9470: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
9480: 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
9490: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
94a0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
94b0: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
94c0: 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
94d0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
94e0: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
94f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
9500: 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
9510: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
9520: 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
9530: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
9540: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
9550: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9560: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
9570: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
9580: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
9590: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
95a0: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
95b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
95c0: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
95d0: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
95e0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
95f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9600: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
9610: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
9620: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
9630: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
9640: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
9650: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
9660: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
9670: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
9680: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
9690: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
96a0: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
96b0: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
96c0: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
96d0: 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
96e0: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
96f0: 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
9700: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
9710: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
9720: 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
9730: 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
9740: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9750: 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
9760: 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
9770: 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
9780: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
9790: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
97a0: 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
97b0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
97c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
97d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
97e0: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
97f0: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
9800: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
9810: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
9820: 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
9830: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
9840: 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
9850: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
9860: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
9870: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
9880: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
9890: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
98a0: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
98b0: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
98c0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
98d0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
98e0: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
98f0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
9900: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
9910: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
9920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
9930: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
9940: 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9960: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
9970: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9980: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
99b0: 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
99c0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
99d0: 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
99f0: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
9a00: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
9a10: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
9a40: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
9a50: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   */..  if( !zMas
9a60: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
9a70: 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70  etMaster.   || p
9a80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9a90: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9aa0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9ab0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
9ac0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ad0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9ae0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9b00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9b10: 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
9b20: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9b30: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9b40: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
9b50: 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
9b60: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
9b70: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
9b80: 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
9b90: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
9ba0: 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
9bb0: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
9bc0: 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
9bd0: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
9be0: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
9bf0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
9c00: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
9c10: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
9c20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9c30: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
9c40: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
9c50: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
9c60: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
9c70: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
9c80: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
9c90: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
9ca0: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
9cb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9cc0: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
9cd0: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
9ce0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9cf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9d00: 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
9d10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9d20: 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
9d30: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
9d40: 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
9d50: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9d60: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
9d70: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
9d80: 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
9d90: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
9da0: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
9db0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
9dc0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
9dd0: 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
9de0: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
9df0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9e00: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
9e10: 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
9e20: 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
9e30: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
9e40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9e50: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
9e60: 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
9e70: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9e80: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9e90: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9ea0: 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
9eb0: 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
9ec0: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
9ed0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9ee0: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
9ef0: 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
9f00: 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
9f10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9f20: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
9f30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
9f40: 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50  Master+20);.  pP
9f50: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9f60: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
9f70: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
9f80: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
9f90: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
9fa0: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
9fb0: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
9fc0: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
9fd0: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
9fe0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
9ff0: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
a000: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
a010: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
a020: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
a030: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
a040: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
a050: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
a060: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
a070: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
a080: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
a090: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
a0a0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
a0b0: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
a0c0: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
a0d0: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
a0e0: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
a0f0: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
a100: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
a110: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
a120: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
a130: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
a140: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
a150: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
a160: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
a170: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a180: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
a190: 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
a1a0: 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
a1b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
a1c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
a1d0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
a1e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
a1f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
a200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
a220: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
a230: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
a240: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
a250: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
a260: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
a270: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
a280: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
a290: 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
a2a0: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
a2b0: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
a2c0: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
a2d0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
a2e0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a310: 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
a320: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
a330: 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
a340: 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
a350: 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
a360: 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
a370: 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
a380: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
a390: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
a3a0: 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
a3b0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
a3c0: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
a3d0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
a3e0: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
a3f0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
a400: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
a410: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a420: 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  e, discard all i
a430: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20  n-memory pages. 
a440: 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  If.** the pager 
a450: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a460: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  e, then this cal
a470: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  l is a no-op..**
a480: 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61  .** TODO: Why ca
a490: 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74  n we not reset t
a4a0: 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69  he pager while i
a4b0: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a  n error state?.*
a4c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
a4d0: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
a4e0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
a4f0: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65  SQLITE_OK==pPage
a500: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
a510: 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
a520: 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
a530: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c  Backup);.    sql
a540: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
a550: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a560: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
a570: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
a580: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
a590: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
a5a0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
a5b0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
a5c0: 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
a5d0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
a5e0: 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
a5f0: 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
a600: 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
a610: 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
a620: 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
a630: 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
a640: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
a650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
a660: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
a670: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
a680: 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
a690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
a6a0: 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
a6b0: 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
a6c0: 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
a6d0: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
a6e0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
a6f0: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
a700: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
a710: 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
a720: 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
a730: 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
a740: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
a750: 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
a760: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
a770: 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
a780: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a790: 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
a7a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
a7b0: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
a7c0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
a7d0: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
a7e0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
a7f0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
a800: 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
a810: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
a820: 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
a830: 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
a840: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
a850: 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
a860: 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
a870: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
a880: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
a890: 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
a8a0: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
a8b0: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
a8c0: 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
a8d0: 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
a8e0: 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
a8f0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
a900: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
a910: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
a920: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a930: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
a940: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
a950: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
a960: 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
a970: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
a980: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
a990: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
a9a0: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
a9b0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
a9c0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
a9d0: 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
a9e0: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
a9f0: 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
aa00: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
aa10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
aa20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
aa30: 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
aa40: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
aa50: 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
aa60: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
aa70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
aa80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
aa90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
aaa0: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
aab0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
aac0: 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69  he pager.** is i
aad0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
aae0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
aaf0: 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
ab00: 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  y in error state
ab10: 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f  , discard the co
ab20: 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68  ntents of .** th
ab30: 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65  e cache and rese
ab40: 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  t the Pager stru
ab50: 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73  cture internal s
ab60: 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69  tate. If there i
ab70: 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  s.** an open jou
ab80: 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20  rnal-file, then 
ab90: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20  the next time a 
aba0: 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f  shared-lock is o
abb0: 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68  btained.** on th
abc0: 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79  e pager file (by
abd0: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
abe0: 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20  er process), it 
abf0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74  will be.** treat
ac00: 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ed as a hot-jour
ac10: 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
ac20: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
ac30: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
ac40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
ac50: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
ac60: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
ac70: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
aca0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61   */..    /* Alwa
acb0: 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ys close the jou
acc0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
acd0: 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
ace0: 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a  base lock..    *
acf0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f  * Otherwise, ano
ad00: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
ad10: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
ad20: 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20  e=delete might. 
ad30: 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
ad40: 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75   file out from u
ad50: 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
ad60: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ad70: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
ad80: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
ad90: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
ada0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
adb0: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
adc0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72  urnal = 0;.    r
add0: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
ade0: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
adf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
ae00: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f   is unlocked, so
ae10: 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68  mebody else migh
ae20: 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65  t change it. The
ae30: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73  .    ** values s
ae40: 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64  tored in Pager.d
ae50: 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74  bSize etc. might
ae60: 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20   become invalid 
ae70: 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68  if.    ** this h
ae80: 61 70 70 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65  appens. TODO: Re
ae90: 61 6c 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 6e  ally, this doesn
aea0: 27 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  't need to be cl
aeb0: 65 61 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74  eared.    ** unt
aec0: 69 6c 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  il the change-co
aed0: 75 6e 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c  unter check fail
aee0: 73 20 69 6e 20 70 61 67 65 72 53 68 61 72 65 64  s in pagerShared
aef0: 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  Lock()..    */. 
af00: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
af10: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20  eValid = 0;..   
af20: 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70   rc = osUnlock(p
af30: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
af40: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  CK);.    if( rc 
af50: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
af60: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
af70: 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
af80: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
af90: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f   pPager))..    /
afa0: 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
afb0: 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
afc0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
afd0: 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
afe0: 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73  t be.    ** trus
aff0: 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
b000: 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
b010: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f  unlocked, the co
b020: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
b030: 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62    ** cache can b
b040: 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20  e discarded and 
b050: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73  the error code s
b060: 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20  afely cleared.. 
b070: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
b080: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
b090: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
b0a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b0b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
b0c0: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
b0d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
b0e0: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
b0f0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  r);.    }..    p
b100: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
b110: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
b120: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
b130: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
b140: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
b150: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b160: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
b170: 6e 20 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54  n IOERR, CORRUPT
b180: 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a   or FULL error.*
b190: 2a 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  * may have occur
b1a0: 72 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 61  red. The first a
b1b0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
b1c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
b1d0: 72 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  r .** structure,
b1e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20   the second the 
b1f0: 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
b200: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
b210: 62 79 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41  by a pager .** A
b220: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
b230: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b240: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
b250: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b260: 20 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e   .** to this fun
b270: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
b280: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b290: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
b2a0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
b2b0: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
b2c0: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
b2d0: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
b2e0: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
b2f0: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
b300: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
b310: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
b320: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
b330: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
b340: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
b350: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
b360: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
b370: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
b380: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
b390: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
b3a0: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
b3b0: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
b3c0: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
b3d0: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
b3e0: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
b3f0: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
b400: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
b410: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
b420: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
b430: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
b440: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
b450: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
b460: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
b470: 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
b480: 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
b490: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
b4a0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b4b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
b4c0: 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
b4d0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
b4e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b4f0: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
b500: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
b510: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
b520: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
b530: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
b540: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
b550: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
b560: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b570: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
b580: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
b590: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
b5a0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
b5b0: 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32  );.  if(.    rc2
b5c0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
b5d0: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
b5e0: 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63  _IOERR ||.    rc
b5f0: 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  2==SQLITE_CORRUP
b600: 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  T.  ){.    pPage
b610: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
b620: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
b630: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
b640: 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73 71  LOCK .     && sq
b650: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
b660: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
b670: 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a  che)==0 .    ){.
b680: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
b690: 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79  pager is already
b6a0: 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20   unlocked, call 
b6b0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e  pager_unlock() n
b6c0: 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  ow to.      ** c
b6d0: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
b6e0: 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65 20  tate and ensure 
b6f0: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 2d 63  that the pager-c
b700: 61 63 68 65 20 69 73 20 0a 20 20 20 20 20 20 2a  ache is .      *
b710: 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  * completely emp
b720: 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
b730: 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
b740: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
b750: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b760: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
b770: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
b780: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
b790: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
b7a0: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
b7b0: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
b7c0: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
b7d0: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
b7e0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b7f0: 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
b800: 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
b810: 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
b820: 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
b830: 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
b840: 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
b850: 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
b860: 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
b870: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
b880: 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
b890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
b8a0: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  nd clear the err
b8b0: 6f 72 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  or state. If thi
b8c0: 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20  s means that.** 
b8d0: 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
b8e0: 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
b8f0: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
b900: 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74  the next connect
b910: 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  ion.** to obtain
b920: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
b930: 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
b940: 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
b950: 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c  ne) will.** roll
b960: 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
b970: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
b980: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
b990: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
b9a0: 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
b9b0: 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
b9c0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
b9d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
b9e0: 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
b9f0: 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
ba00: 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
ba10: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
ba20: 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
ba30: 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
ba40: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
ba50: 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
ba60: 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
ba70: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
ba80: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
ba90: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
baa0: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
bab0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
bac0: 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73  _OK && pPager->s
bad0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
bae0: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
baf0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
bb00: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
bb10: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
bb20: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
bb30: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
bb40: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
bb50: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
bb60: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  r);.}../*.** Thi
bb70: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
bb80: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
bb90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
bba0: 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
bbb0: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
bbc0: 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
bbd0: 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
bbe0: 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
bbf0: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
bc00: 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
bc10: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
bc20: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
bc30: 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
bc40: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
bc50: 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
bc60: 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
bc70: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
bc80: 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
bc90: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
bca0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
bcb0: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  is in PAGER_SHAR
bcc0: 45 44 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f  ED or PAGER_UNLO
bcd0: 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
bce0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
bcf0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
bd00: 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20   no-op (returns 
bd10: 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a  SQLITE_OK)..**.*
bd20: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
bd30: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
bd40: 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
bd50: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
bd60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
bd70: 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
bd80: 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
bd90: 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
bda0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
bdb0: 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
bdc0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
bdd0: 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
bde0: 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
bdf0: 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
be00: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
be10: 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
be20: 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
be30: 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
be40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
be50: 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
be60: 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
be70: 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
be80: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
be90: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
bea0: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
beb0: 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
bec0: 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
bed0: 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
bee0: 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
bef0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bf00: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
bf10: 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
bf20: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
bf30: 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
bf40: 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
bf50: 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
bf60: 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
bf70: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
bf80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
bf90: 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
bfa0: 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
bfb0: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
bfc0: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
bfd0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
bfe0: 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
bff0: 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
c000: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
c010: 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
c020: 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
c030: 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
c040: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
c050: 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
c060: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
c070: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
c080: 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
c090: 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
c0a0: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
c0b0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
c0c0: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
c0d0: 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
c0e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
c0f0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
c100: 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
c110: 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
c120: 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
c130: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
c140: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c150: 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
c160: 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
c170: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
c180: 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
c190: 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
c1a0: 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
c1b0: 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
c1c0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
c1d0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c1e0: 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
c1f0: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
c200: 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
c210: 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
c220: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
c230: 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
c240: 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
c250: 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  , if running in 
c260: 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f  non-exclusive mo
c270: 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72  de, the.** pager
c280: 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
c290: 53 48 41 52 45 44 20 73 74 61 74 65 20 28 61 6e  SHARED state (an
c2a0: 64 20 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65  d downgrades the
c2b0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20   lock on the.** 
c2c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63  database file ac
c2d0: 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a  cordingly)..**.*
c2e0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
c2f0: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
c300: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
c310: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43  is in PAGER_SYNC
c320: 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20  ED state,.** it 
c330: 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45  moves to PAGER_E
c340: 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63  XCLUSIVE. No loc
c350: 6b 73 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65  ks are downgrade
c360: 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  d when running i
c370: 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d  n.** exclusive m
c380: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ode..**.** SQLIT
c390: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
c3a0: 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
c3b0: 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
c3c0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
c3d0: 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
c3e0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
c3f0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c400: 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
c410: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
c420: 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
c430: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
c440: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
c450: 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
c460: 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
c470: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c480: 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
c490: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
c4a0: 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
c4b0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
c4c0: 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
c4d0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
c4e0: 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
c4f0: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
c500: 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
c510: 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
c520: 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
c530: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
c540: 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
c550: 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
c560: 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
c570: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c580: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
c590: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
c5a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c5b0: 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20  t hasMaster){.  
c5c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c5d0: 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  OK;      /* Erro
c5e0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72  r code from jour
c5f0: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
c600: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
c610: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
c620: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f  _OK;     /* Erro
c630: 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66  r code from db f
c640: 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  ile unlock opera
c650: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70  tion */..  if( p
c660: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
c670: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
c680: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c690: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  _OK;.  }.  relea
c6a0: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
c6b0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65  pPager);..  asse
c6c0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
c6d0: 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
c6e0: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
c6f0: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
c700: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
c710: 0a 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 54  ..    /* TODO: T
c720: 68 65 72 65 27 73 20 61 20 70 72 6f 62 6c 65 6d  here's a problem
c730: 20 68 65 72 65 20 69 66 20 61 20 6a 6f 75 72 6e   here if a journ
c740: 61 6c 2d 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  al-file was open
c750: 65 64 20 69 6e 20 4d 45 4d 4f 52 59 0a 20 20 20  ed in MEMORY.   
c760: 20 2a 2a 20 6d 6f 64 65 20 61 6e 64 20 74 68 65   ** mode and the
c770: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
c780: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
c790: 20 54 52 55 4e 43 41 54 45 20 6f 72 20 50 45 52   TRUNCATE or PER
c7a0: 53 49 53 54 0a 20 20 20 20 2a 2a 20 64 75 72 69  SIST.    ** duri
c7b0: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
c7c0: 6f 6e 2e 20 54 68 69 73 20 63 6f 64 65 20 73 68  on. This code sh
c7d0: 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 20  ould be changed 
c7e0: 74 6f 20 61 73 73 75 6d 65 0a 20 20 20 20 2a 2a  to assume.    **
c7f0: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
c800: 6c 20 6d 6f 64 65 20 68 61 73 20 6e 6f 74 20 63  l mode has not c
c810: 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
c820: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
c830: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 65 64 2e  .    ** started.
c840: 20 41 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33   And the sqlite3
c850: 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
c860: 28 29 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  () function shou
c870: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 68 61  ld be.    ** cha
c880: 6e 67 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  nged to make sur
c890: 65 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  e that this is t
c8a0: 68 65 20 63 61 73 65 20 74 6f 6f 2e 0a 20 20 20  he case too..   
c8b0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   */..    /* Fina
c8c0: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
c8d0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
c8e0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c8f0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
c900: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
c910: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  ){.      int isM
c920: 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73  emoryJournal = s
c930: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
c940: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  al(pPager->jfd);
c950: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
c960: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
c970: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69  d);.      if( !i
c980: 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29  sMemoryJournal )
c990: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c9a0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
c9b0: 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
c9c0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
c9d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c9e0: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
c9f0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
ca00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
ca10: 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
ca20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
ca30: 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
ca40: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
ca50: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  TE_OK;.      }el
ca60: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
ca70: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
ca80: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
ca90: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
caa0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cab0: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
cac0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
cad0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
cae0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
caf0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
cb00: 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  .     || pPager-
cb10: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cb20: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cb30: 50 45 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20  PERSIST.    ){. 
cb40: 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f       rc = zeroJo
cb50: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
cb60: 20 68 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20   hasMaster);.   
cb70: 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
cb80: 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
cb90: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
cba0: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
cbb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
cbc0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
cbd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
cbe0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
cbf0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
cc00: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
cc10: 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20  TE || rc );.    
cc20: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
cc30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
cc40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
cc50: 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65  ITE_OK && !pPage
cc60: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
cc70: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
cc80: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
cc90: 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
cca0: 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
ccb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
ccc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
ccd0: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c  CK_PAGES.    sql
cce0: 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
ccf0: 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
cd00: 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
cd10: 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e  t_pagehash);.#en
cd20: 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  dif..    sqlite3
cd30: 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
cd40: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
cd50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
cd60: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
cd70: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
cd80: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
cd90: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70  urnal = 0;.    p
cda0: 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
cdb0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
cdc0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
cdd0: 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  de ){.    rc2 = 
cde0: 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  osUnlock(pPager-
cdf0: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
ce00: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
ce10: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
ce20: 52 45 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  RED;.    pPager-
ce30: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
ce40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
ce50: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
ce60: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
ce70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
ce80: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
ce90: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
cea0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
ceb0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
cec0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
ced0: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
cee0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a  = 0;..  /* TODO:
cef0: 20 49 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c   Is this optimal
cf00: 3f 20 57 68 79 20 69 73 20 74 68 65 20 64 62 20  ? Why is the db 
cf10: 73 69 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64  size invalidated
cf20: 20 68 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e   here .  ** when
cf30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
cf40: 6c 65 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b  le is not unlock
cf50: 65 64 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ed? */.  pPager-
cf60: 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b  >dbOrigSize = 0;
cf70: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
cf80: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
cf90: 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
cfa0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28  ->dbSize);.  if(
cfb0: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70   !MEMDB ){.    p
cfc0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
cfd0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  id = 0;.  }..  r
cfe0: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
cff0: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
d000: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
d010: 20 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e   aData must poin
d020: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
d030: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
d040: 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61  e bytes.** of da
d050: 74 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  ta. Compute and 
d060: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
d070: 6d 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20  m based ont the 
d080: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
d090: 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61  .** page of data
d0a0: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
d0b0: 20 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72   value of pPager
d0c0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a  ->cksumInit..**.
d0d0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
d0e0: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
d0f0: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
d100: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
d110: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
d120: 69 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65  ial value (pPage
d130: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e  r->cksumInit) an
d140: 64 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79  d every 200th by
d150: 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  te.** of the pag
d160: 65 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67  e data, starting
d170: 20 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65   with byte offse
d180: 74 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t (pPager->pageS
d190: 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63  ize%200)..** Eac
d1a0: 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70  h byte is interp
d1b0: 72 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69  reted as an 8-bi
d1c0: 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  t unsigned integ
d1d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69  er..**.** Changi
d1e0: 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75  ng the formula u
d1f0: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  sed to compute t
d200: 68 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73  his checksum res
d210: 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e  ults in an.** in
d220: 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e  compatible journ
d230: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  al file format..
d240: 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c  **.** If journal
d250: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
d260: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
d270: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
d280: 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73  ost likely .** s
d290: 63 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20  cenario is that 
d2a0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
d2b0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
d2c0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
d2d0: 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75  ed. .** It is mu
d2e0: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
d2f0: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
d300: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d310: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
d320: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
d330: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
d340: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
d350: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
d360: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
d370: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
d380: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
d390: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
d3a0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
d3b0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
d3c0: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
d3d0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
d3e0: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
d3f0: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
d400: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
d410: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c   /* Checksum val
d420: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
d430: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
d440: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20  ->pageSize-200; 
d450: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
d460: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68   counter */.  wh
d470: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
d480: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
d490: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
d4a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
d4b0: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  sum;.}../*.** Re
d4c0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
d4d0: 20 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65   from either the
d4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69   journal file (i
d4f0: 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29  f isMainJrnl==1)
d500: 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   or.** from the 
d510: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20  sub-journal (if 
d520: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61  isMainJrnl==0) a
d530: 6e 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74  nd playback that
d540: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61   page..** The pa
d550: 67 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66  ge begins at off
d560: 73 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74  set *pOffset int
d570: 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20  o the file. The 
d580: 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75  *pOffset.** valu
d590: 65 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74  e is increased t
d5a0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
d5b0: 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
d5c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
d5d0: 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e  ** The isMainJrn
d5e0: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  l flag is true i
d5f0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
d600: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
d610: 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65  nal and.** false
d620: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
d630: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  nt journal.  The
d640: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
d650: 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63  ournal uses.** c
d660: 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
d670: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d680: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a   does not..**.**
d690: 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
d6a0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d6b0: 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d  record read from
d6c0: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
d6d0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  al file.** is gr
d6e0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
d6f0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
d700: 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
d710: 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a  en playback is.*
d720: 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51  * skipped and SQ
d730: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
d740: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ned..**.** If pD
d750: 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  one is not NULL,
d760: 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
d770: 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68  cord of pages th
d780: 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  at have already.
d790: 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  ** been played b
d7a0: 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67  ack.  If the pag
d7b0: 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61  e at *pOffset ha
d7c0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
d7d0: 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69  layed back.** (i
d7e0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
d7f0: 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73  ing pDone bit is
d800: 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20   set) then skip 
d810: 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a  the playback..**
d820: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
d830: 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70  Done bit corresp
d840: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70  onding to the *p
d850: 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73  Offset page is s
d860: 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72  et.** prior to r
d870: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
d880: 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  If the page reco
d890: 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  rd is successful
d8a0: 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
d8b0: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d8c0: 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65  ile.** and playe
d8d0: 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c  d back, then SQL
d8e0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
d8f0: 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
d900: 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69  or occurs.** whi
d910: 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72  le reading the r
d920: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28  ecord from the (
d930: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d940: 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69  e or while writi
d950: 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  ng.** to the dat
d960: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
d970: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
d980: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
d990: 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75  If data.** is su
d9a0: 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
d9b0: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
d9c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20  ournal file but 
d9d0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a  appears to be.**
d9e0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
d9f0: 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
da00: 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e  ned. Data is con
da10: 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65  sidered corrupte
da20: 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63  d in.** two circ
da30: 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a  umstances:.** .*
da40: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
da50: 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ord page-number 
da60: 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72  is illegal (0 or
da70: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c   PAGER_MJ_PGNO),
da80: 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68   or.**   * If th
da90: 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e  e record is bein
daa0: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72  g rolled back fr
dab0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
dac0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
dad0: 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
dae0: 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20   field does not 
daf0: 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64  match the record
db00: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
db10: 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
db20: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61   two scenarios a
db30: 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69  re possible duri
db40: 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  ng a savepoint r
db50: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
db60: 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65  f this is a save
db70: 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  point rollback, 
db80: 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20  then memory may 
db90: 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d  have to be dynam
dba0: 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
dbb0: 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
dbc0: 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
dbd0: 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e   the case and an
dbe0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
dbf0: 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s,.** SQLITE_NOM
dc00: 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
dc10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
dc20: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
dc30: 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
dc40: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
dc50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
dc60: 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64  ger being played
dc70: 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
dc80: 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
dc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
dca0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
dcb0: 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
dcc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55 6e 73 79   */.  int isUnsy
dcd0: 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
dce0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
dcf0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79  eading from unsy
dd00: 6e 63 65 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  nced main journa
dd10: 6c 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  l */.  i64 *pOff
dd20: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
dd30: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
dd40: 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
dd50: 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73  back */.  int is
dd60: 53 61 76 65 70 6e 74 2c 20 20 20 20 20 20 20 20  Savepnt,        
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
dd80: 66 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20  for a savepoint 
dd90: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69  rollback */.  Bi
dda0: 74 76 65 63 20 2a 70 44 6f 6e 65 20 20 20 20 20  tvec *pDone     
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
ddc0: 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
ddd0: 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61  lready played ba
dde0: 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
ddf0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
de20: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
de30: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
de40: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
de50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
de60: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
de70: 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
de80: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dea0: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
deb0: 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
dec0: 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ecking */.  u8 *
ded0: 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  aData;          
dee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
def0: 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66  porary storage f
df00: 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  or the page */. 
df10: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a   sqlite3_file *j
df20: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fd;            /
df30: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
df40: 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  iptor for the jo
df50: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
df60: 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e   assert( (isMain
df70: 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20  Jrnl&~1)==0 );  
df80: 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e      /* isMainJrn
df90: 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  l is 0 or 1 */. 
dfa0: 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65   assert( (isSave
dfb0: 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  pnt&~1)==0 );   
dfc0: 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74      /* isSavepnt
dfd0: 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
dfe0: 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72  assert( isMainJr
dff0: 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20  nl || pDone );  
e000: 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61     /* pDone alwa
e010: 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a  ys used on sub-j
e020: 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73  ournals */.  ass
e030: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c  ert( isSavepnt |
e040: 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20  | pDone==0 );   
e050: 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75  /* pDone never u
e060: 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70  sed on non-savep
e070: 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61  oint */..  aData
e080: 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e   = (u8*)pPager->
e090: 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73  pTmpSpace;.  ass
e0a0: 65 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20  ert( aData );   
e0b0: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
e0c0: 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  orage must have 
e0d0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
e0e0: 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  ocated */..  /* 
e0f0: 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
e100: 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61  mber and page da
e110: 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ta from the jour
e120: 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e  nal or sub-journ
e130: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65  al.  ** file. Re
e140: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
e150: 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
e160: 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
e170: 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a  occurs..  */.  j
e180: 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  fd = isMainJrnl 
e190: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
e1a0: 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20  pPager->sjfd;.  
e1b0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
e1c0: 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26  jfd, *pOffset, &
e1d0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
e1e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e1f0: 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
e200: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
e210: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
e220: 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66  >pageSize, (*pOf
e230: 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20  fset)+4);.  if( 
e240: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e250: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f  return rc;.  *pO
e260: 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d  ffset += pPager-
e270: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20  >pageSize + 4 + 
e280: 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20  isMainJrnl*4;.. 
e290: 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b   /* Sanity check
e2a0: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  ing on the page.
e2b0: 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69    This is more i
e2c0: 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20  mportant that I 
e2d0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
e2e0: 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70  thought.  If a p
e2f0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
e300: 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  urs while the jo
e310: 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77  urnal is being w
e320: 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20  ritten,.  ** it 
e330: 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61  could cause inva
e340: 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77  lid data to be w
e350: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
e360: 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65  journal.  We nee
e370: 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74  d to.  ** detect
e380: 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61   this invalid da
e390: 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72  ta (with high pr
e3a0: 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69  obability) and i
e3b0: 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  gnore it..  */. 
e3c0: 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20   if( pgno==0 || 
e3d0: 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
e3e0: 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
e3f0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53 61     assert( !isSa
e400: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74  vepnt );.    ret
e410: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
e420: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
e430: 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
e440: 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
e450: 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
e460: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
e470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e480: 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
e490: 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
e4a0: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
e4b0: 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
e4c0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
e4d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
e4e0: 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
e4f0: 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
e500: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
e510: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
e520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
e530: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
e540: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
e550: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
e560: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
e570: 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  o))!=SQLITE_OK )
e580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e590: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
e5a0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
e5b0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
e5c0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
e5d0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
e5e0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e5f0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
e600: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
e610: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
e620: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
e630: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
e640: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
e650: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
e660: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
e670: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
e680: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e690: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
e6a0: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
e6b0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
e6c0: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
e6d0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
e6e0: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
e6f0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
e700: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
e710: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
e720: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
e730: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
e740: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
e750: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
e760: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
e770: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
e780: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
e790: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
e7a0: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
e7b0: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
e7c0: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
e7d0: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
e7e0: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
e7f0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
e800: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
e810: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
e820: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
e830: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
e840: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
e850: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
e860: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
e870: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
e880: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
e890: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
e8a0: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
e8b0: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
e8c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
e8d0: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
e8e0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
e8f0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
e900: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
e910: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
e920: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
e930: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
e940: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
e950: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
e960: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
e970: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
e980: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
e990: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
e9a0: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
e9b0: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
e9c0: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
e9d0: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
e9e0: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
e9f0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
ea00: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
ea10: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
ea20: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
ea30: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
ea40: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
ea50: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
ea60: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
ea70: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
ea80: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
ea90: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
eaa0: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
eab0: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
eac0: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
ead0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
eae0: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
eaf0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
eb00: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
eb10: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
eb20: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
eb30: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
eb40: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
eb50: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
eb60: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
eb70: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
eb80: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
eb90: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
eba0: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
ebb0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
ebc0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
ebd0: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
ebe0: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
ebf0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
ec00: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
ec10: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
ec20: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
ec30: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
ec40: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
ec50: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
ec60: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
ec70: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
ec80: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
ec90: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
eca0: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
ecb0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
ecc0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
ecd0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
ece0: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
ecf0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
ed00: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
ed10: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
ed20: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
ed30: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
ed40: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ed50: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ed60: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
ed70: 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41  | !MEMDB );.  PA
ed80: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
ed90: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
eda0: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
edc0: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
edd0: 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
ede0: 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
edf0: 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a  geSize, aData),.
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
ee10: 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
ee20: 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
ee30: 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
ee40: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
ee50: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
ee60: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
ee70: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
ee80: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
ee90: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73  _SYNC)).   && is
eea0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
eeb0: 0a 20 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63  .   && !isUnsync
eec0: 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
eed0: 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
eee0: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
eef0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
ef00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
ef10: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
ef20: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
ef30: 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
ef40: 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
ef50: 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
ef60: 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
ef70: 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
ef80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61   }.    sqlite3Ba
ef90: 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
efa0: 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
efb0: 2c 20 61 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  , aData);.  }els
efc0: 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
efd0: 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
efe0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
eff0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
f000: 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
f010: 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
f020: 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
f030: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
f040: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
f050: 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
f060: 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
f070: 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
f080: 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
f090: 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
f0a0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
f0b0: 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
f0c0: 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
f0d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f0e0: 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
f0f0: 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
f100: 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
f110: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
f120: 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
f130: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
f140: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
f150: 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
f160: 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
f170: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
f180: 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
f190: 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
f1a0: 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
f1b0: 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
f1c0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
f1d0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f1e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
f1f0: 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
f200: 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
f210: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
f220: 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
f230: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
f240: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
f250: 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
f260: 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
f270: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
f280: 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
f290: 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
f2a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
f2b0: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
f2c0: 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
f2d0: 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
f2e0: 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
f2f0: 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
f300: 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
f310: 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
f320: 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
f330: 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
f340: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
f350: 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
f360: 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d  );.    if( (rc =
f370: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
f380: 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
f390: 6f 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51  o, &pPg, 1))!=SQ
f3a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f3b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f3c0: 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  }.    pPg->flags
f3d0: 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
f3e0: 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
f3f0: 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
f400: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
f410: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
f420: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
f430: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
f440: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
f450: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
f460: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
f470: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
f480: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
f490: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
f4a0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
f4b0: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
f4c0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
f4d0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
f4e0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
f4f0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
f500: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
f510: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
f520: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
f530: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
f540: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
f550: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
f560: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
f570: 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
f580: 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
f590: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
f5a0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
f5b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
f5c0: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
f5d0: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
f5e0: 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d  iter(pPg);.    }
f5f0: 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
f600: 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
f610: 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
f620: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f630: 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
f640: 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
f650: 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
f660: 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
f670: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
f680: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
f690: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
f6a0: 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
f6b0: 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
f6c0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
f6d0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
f6e0: 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
f6f0: 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
f700: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
f710: 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
f720: 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
f730: 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
f740: 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
f750: 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20   the..      **. 
f760: 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
f770: 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74   one exception t
f780: 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20  o this rule. If 
f790: 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
f7a0: 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a  g rolled.      *
f7b0: 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f  * back as part o
f7c0: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f  f a savepoint (o
f7d0: 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c  r statement) rol
f7e0: 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20  lback from an . 
f7f0: 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64       ** unsynced
f800: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
f810: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
f820: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  e, then it is no
f830: 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20  t safe.      ** 
f840: 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
f850: 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20   as clean. This 
f860: 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69  is because marki
f870: 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20  ng the page as. 
f880: 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69       ** clean wi
f890: 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  ll clear the PGH
f8a0: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
f8b0: 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  g. Since the pag
f8c0: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  e is.      ** al
f8d0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
f8e0: 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72  rnal file (recor
f8f0: 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  ded in Pager.pIn
f900: 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20  Journal) and.   
f910: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
f920: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
f930: 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68  s cleared, if th
f940: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
f950: 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67  n to.      ** ag
f960: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
f970: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
f980: 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61  will be marked a
f990: 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20  s dirty but.    
f9a0: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
f9b0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69  EED_SYNC flag wi
f9c0: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49  ll not be set. I
f9d0: 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74  t could then pot
f9e0: 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a  entially.      *
f9f0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  * be written out
fa00: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
fa10: 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69  se file before i
fa20: 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ts journal file.
fa30: 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
fa40: 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61   is synced. If a
fa50: 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75   crash occurs du
fa60: 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  ring or followin
fa70: 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  g this,.      **
fa80: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
fa90: 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a  tion may ensue..
faa0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
fab0: 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
fac0: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
fad0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
fae0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
faf0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
fb00: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
fb10: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
fb20: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
fb30: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
fb40: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
fb50: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
fb60: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
fb70: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
fb80: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
fb90: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
fba0: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
fbb0: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
fbc0: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
fbd0: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
fbe0: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
fbf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
fc00: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
fc10: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
fc20: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
fc30: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
fc40: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
fc50: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
fc60: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
fc70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
fc80: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
fc90: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
fca0: 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
fcb0: 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EST)./*.** This 
fcc0: 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68  routine looks ah
fcd0: 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ead into the mai
fce0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
fcf0: 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a  nd determines.**
fd00: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
fd10: 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20  the next record 
fd20: 28 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74  (the record that
fd30: 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a   begins at file.
fd40: 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  ** offset pPager
fd50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73  ->journalOff) is
fd60: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70   a well-formed p
fd70: 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69  age record consi
fd80: 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61  sting.** of a va
fd90: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c  lid page number,
fda0: 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65   pPage->pageSize
fdb0: 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   bytes of conten
fdc0: 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62  t, followed.** b
fdd0: 79 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73  y a valid checks
fde0: 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  um..**.** The pa
fdf0: 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ger never needs 
fe00: 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20  to know this in 
fe10: 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20  order to do its 
fe20: 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72  job.   This.** r
fe30: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
fe40: 73 65 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73  sed from with as
fe50: 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
fe60: 61 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f  ase() macros..*/
fe70: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
fe80: 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
fe90: 49 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70  IsValid(Pager *p
fea0: 50 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70  Pager){.  Pgno p
feb0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  gno;           /
fec0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
fed0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  r of the page */
fee0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
fef0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ff00: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  age checksum */.
ff10: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ff20: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
ff30: 20 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20   code from read 
ff40: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
ff50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
ff60: 3b 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65  ;    /* The file
ff70: 20 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d   descriptor from
ff80: 20 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65   which we are re
ff90: 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  ading */.  u8 *a
ffa0: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
ffb0: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
ffc0: 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e page */..  /* 
ffd0: 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
ffe0: 6d 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20  mber header */. 
fff0: 20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66   fd = pPager->jf
10000 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
10010 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
10020 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67  >journalOff, &pg
10030 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
10040 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
10050 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10070 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10080 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ST*/.  if( pgno=
10090 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
100a0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
100b0 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
100c0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
100d0 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ST*/.  if( pgno>
100e0 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
100f0 53 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30  Size ){ return 0
10100 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
10110 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10120 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
10130 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  the checksum */.
10140 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
10150 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
10160 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d  urnalOff+pPager-
10170 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
10180 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
10190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
101a0 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
101b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101c0 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
101d0 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  EST*/..  /* Read
101e0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65   the data and ve
101f0 72 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75  rify the checksu
10200 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28  m */.  aData = (
10210 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
10220 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71  Space;.  rc = sq
10230 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
10240 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
10250 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
10260 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a  >journalOff+4);.
10270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10280 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  _OK ){ return 0;
10290 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
102c0 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
102d0 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
102e0 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72  !=cksum ){ retur
102f0 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
10300 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
10310 0a 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73  .  /* Reach this
10320 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74   point only if t
10330 68 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  he page is valid
10340 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
10350 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10360 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
10370 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
10380 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f  OVERAGE_TEST) */
10390 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
103a0 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
103b0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
103c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
103d0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
103e0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
103f0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
10400 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10410 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
10420 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
10430 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10440 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
10450 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
10460 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10470 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
10480 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
10490 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
104a0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
104b0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
104c0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
104d0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
104e0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
104f0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
10500 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
10510 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
10520 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
10530 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
10540 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
10550 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
10560 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
10570 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
10580 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
10590 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
105a0 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
105b0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
105c0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
105d0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
105e0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
105f0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
10600 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
10610 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
10620 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
10630 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
10640 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
10650 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
10660 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
10670 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
10680 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
10690 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
106a0 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
106b0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
106c0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
106d0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
106e0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
106f0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
10700 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
10710 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10720 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10730 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10740 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10750 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
10760 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
10770 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
10780 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
10790 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
107a0 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
107b0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
107c0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
107d0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
107e0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
107f0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
10800 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
10810 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10820 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10830 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10840 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10850 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10860 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10870 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10880 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10890 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
108a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
108b0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
108c0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
108d0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
108e0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
108f0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
10900 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10910 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10920 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10930 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10940 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10950 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10960 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10970 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10980 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10990 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
109a0 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
109b0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
109c0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
109d0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
109e0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
109f0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
10a00 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10a10 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10a20 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10a30 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10a40 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10a50 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10a60 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10a70 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10a80 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10a90 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10aa0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
10ab0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ac0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
10ad0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
10ae0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
10af0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
10b00 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10b10 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10b20 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10b30 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10b40 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10b50 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10b60 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10b70 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10b80 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ba0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10bb0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10bc0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
10bd0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
10be0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
10bf0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
10c00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10c10 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10c20 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10c30 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10c40 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10c50 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10c60 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10c70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10c80 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10c90 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10ca0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
10cb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10cc0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
10cd0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
10ce0 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
10cf0 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
10d00 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10d10 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10d20 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10d30 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10d40 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10d50 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10d60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10d70 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10d80 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10d90 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10da0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10db0 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
10dc0 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
10dd0 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
10de0 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
10df0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
10e10 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
10e20 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10e30 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10e40 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
10e50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10e60 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
10e70 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
10e80 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
10e90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ea0 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
10eb0 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
10ec0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10ed0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
10ee0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
10ef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10f00 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10f10 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
10f20 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
10f30 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
10f40 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
10f50 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
10f60 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
10f70 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
10f80 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
10f90 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
10fa0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10fb0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
10fc0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
10fd0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
10fe0 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
10ff0 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
11000 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
11010 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
11020 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
11030 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
11040 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
11050 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
11060 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
11070 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
11080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11090 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
110a0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
110b0 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
110c0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
110d0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
110e0 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
110f0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
11100 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
11110 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
11120 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
11130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11140 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
11150 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
11160 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
11170 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
11180 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
11190 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
111a0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
111b0 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74  .      int exist
111c0 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  s;.      rc = sq
111d0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
111e0 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
111f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
11200 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
11210 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11230 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11240 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
11250 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
11260 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
11270 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
11280 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
11290 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
112a0 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
112b0 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
112c0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
112d0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
112e0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
112f0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
11300 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
11310 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
11320 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
11330 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11340 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
11350 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
11360 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
11370 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
11380 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
11390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
113a0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
113b0 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
113c0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
113d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
113e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
113f0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
11400 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
11410 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
11420 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11430 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
11440 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
11450 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
11460 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
11470 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
11480 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11490 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
114a0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
114b0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
114c0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
114d0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
114e0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
114f0 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
11500 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
11510 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
11520 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
11530 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
11540 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11550 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
11560 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11570 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
11580 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
11590 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
115a0 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
115b0 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
115c0 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
115d0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
115e0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
115f0 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
11600 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
11610 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
11620 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
11630 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
11640 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
11650 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11660 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
11670 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
11680 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a  Journal) );.  }.
11690 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
116a0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
116b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
116c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
116d0 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
116e0 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
116f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11700 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
11710 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
11720 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
11730 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
11740 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
11750 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
11760 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
11770 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
11780 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
11790 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
117a0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
117b0 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
117c0 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  en, or an exclus
117d0 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a  ive lock is not.
117e0 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  ** held, this fu
117f0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
11800 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
11810 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
11820 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64  le is.** changed
11830 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
11840 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
11850 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
11860 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f  If the file.** o
11870 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
11880 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
11890 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
118a0 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
118b0 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
118c0 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
118d0 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
118e0 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
118f0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
11900 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
11910 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
11920 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
11930 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
11940 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
11950 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
11960 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
11970 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
11980 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
11990 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
119a0 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
119b0 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
119c0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
119d0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
119e0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
119f0 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
11a00 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
11a10 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
11a20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
11a30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
11a40 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
11a50 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
11a60 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
11a70 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
11a80 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
11a90 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11aa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11ab0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
11ac0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11ad0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
11ae0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11af0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11b00 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
11b10 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  IVE && isOpen(pP
11b20 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
11b30 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
11b40 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f  , newSize;.    /
11b50 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
11b60 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
11b70 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
11b80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11b90 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11ba0 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
11bb0 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
11bc0 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
11bd0 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
11be0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
11bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
11c00 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
11c10 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
11c20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
11c30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11c40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
11c50 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
11c60 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
11c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11c90 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
11ca0 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
11cb0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
11cc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11cd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
11ce0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
11cf0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
11d00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
11d10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11d20 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
11d30 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
11d40 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11d50 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
11d60 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
11d70 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
11d80 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
11d90 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
11da0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
11db0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
11dc0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
11dd0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
11de0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
11df0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
11e00 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
11e10 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
11e20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11e30 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
11e40 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
11e50 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
11e60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
11e70 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
11e80 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
11e90 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
11ea0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
11eb0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
11ec0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
11ed0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
11ee0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
11ef0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
11f00 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
11f10 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
11f20 20 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a   up to 512 if.**
11f30 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
11f40 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64   512, or rounded
11f50 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
11f60 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
11f70 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
11f80 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
11f90 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
11fa0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
11fb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11fc0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
11fd0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
11fe0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11ff0 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
12000 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
12010 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
12020 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
12030 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
12040 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
12050 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
12060 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
12070 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
12080 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
12090 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
120a0 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
120b0 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
120c0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
120d0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
120e0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
120f0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
12100 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
12110 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
12120 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12130 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
12140 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
12150 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
12160 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
12170 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
12180 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
12190 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
121a0 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
121b0 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
121c0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
121d0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
121e0 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
121f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
12200 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
12210 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
12220 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
12230 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
12240 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12250 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
12260 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
12270 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
12280 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
12290 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
122a0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
122b0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
122c0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
122d0 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
122e0 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
122f0 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
12300 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
12310 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
12320 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
12330 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
12340 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
12350 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
12360 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
12370 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
12380 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
12390 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
123a0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
123b0 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
123c0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
123d0 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
123e0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
123f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
12400 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
12410 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
12420 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
12430 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
12440 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
12450 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
12460 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
12470 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
12480 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
12490 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
124a0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
124b0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
124c0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
124d0 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
124e0 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
124f0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
12500 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12510 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
12520 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
12530 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
12540 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
12550 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
12560 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
12570 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
12580 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
12590 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
125a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
125b0 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
125c0 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
125d0 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
125e0 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
125f0 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
12600 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
12610 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
12620 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
12630 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
12640 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
12650 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
12660 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
12670 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
12680 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
12690 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
126a0 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
126b0 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
126c0 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
126d0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
126e0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
126f0 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
12700 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12710 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
12720 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
12730 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
12740 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
12750 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12760 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
12770 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
12780 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
12790 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
127a0 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
127b0 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
127c0 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
127d0 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
127e0 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
127f0 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
12800 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12810 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
12820 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
12830 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
12840 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
12850 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
12860 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
12870 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12880 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
12890 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
128a0 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
128b0 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
128c0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
128d0 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
128e0 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
128f0 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
12900 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12910 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
12920 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
12930 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
12940 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
12950 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
12960 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
12970 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
12980 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
12990 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
129a0 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
129b0 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
129c0 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
129d0 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
129e0 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
129f0 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
12a00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
12a10 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
12a20 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
12a30 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
12a40 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
12a50 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12a60 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
12a70 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
12a80 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
12a90 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
12aa0 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
12ab0 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
12ac0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
12ad0 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
12ae0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
12af0 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
12b00 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
12b10 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
12b20 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
12b30 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
12b40 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
12b50 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
12b60 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
12b70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
12b80 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
12b90 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
12ba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12bb0 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
12bc0 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
12bd0 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
12be0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
12bf0 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
12c00 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12c10 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
12c20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12c30 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
12c40 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
12c50 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
12c60 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
12c70 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
12c80 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
12c90 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
12ca0 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
12cb0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
12cc0 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
12cd0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
12ce0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
12cf0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
12d00 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
12d10 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
12d20 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
12d30 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
12d40 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
12d50 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
12d60 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
12d70 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
12d80 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
12d90 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
12da0 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
12db0 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
12dc0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
12dd0 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
12de0 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
12df0 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
12e00 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
12e10 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
12e20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
12e30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12e40 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
12e50 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
12e60 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
12e70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
12e80 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
12e90 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
12ea0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
12eb0 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
12ec0 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
12ef0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
12f00 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
12f10 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
12f20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12f30 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
12f40 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
12f50 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
12f60 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
12f70 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
12f80 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
12f90 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
12fa0 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
12fb0 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
12fc0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12ff0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
13000 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
13010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13020 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
13030 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
13040 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
13050 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
13060 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
13070 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13080 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
13090 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
130a0 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
130b0 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
130c0 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
130d0 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
130e0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
130f0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
13100 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
13110 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
13120 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
13130 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
13140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
13150 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13160 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13170 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
13180 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
13190 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
131a0 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
131b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
131c0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
131d0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
131e0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
131f0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
13200 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
13210 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
13220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13230 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
13240 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
13250 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
13260 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
13270 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
13280 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
13290 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
132a0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
132b0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
132c0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
132d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
132e0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
132f0 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
13300 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
13310 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
13320 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
13330 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
13340 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
13350 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
13360 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
13370 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13380 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
13390 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
133a0 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
133b0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
133c0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
133d0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
133e0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
133f0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
13400 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
13410 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
13420 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
13430 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
13440 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
13450 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
13460 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13470 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
13480 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
13490 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
134a0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
134b0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
134c0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
134d0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
134e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
134f0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
13500 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
13510 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
13520 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13530 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
13540 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
13550 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
13560 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
13570 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
13580 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
13590 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
135a0 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
135b0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
135c0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
135d0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
135e0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
135f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73  ){.    int isUns
13600 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
13610 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
13620 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
13630 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
13640 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
13650 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
13660 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
13670 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
13680 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
13690 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
136a0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
136b0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
136c0 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
136d0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
136e0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
136f0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
13700 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
13710 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
13730 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
13740 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
13750 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
13760 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13770 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
13780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
13790 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
137a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
137b0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
137c0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
137d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
137e0 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
137f0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
13800 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
13810 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
13820 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
13830 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
13840 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
13850 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
13860 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
13870 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
13880 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
13890 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
138a0 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
138b0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
138c0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
138d0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
138e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
138f0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
13900 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
13910 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13920 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
13930 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
13940 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
13950 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
13960 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
13970 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
13980 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
13990 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
139a0 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
139b0 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
139c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
139d0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
139e0 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
139f0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
13a00 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
13a10 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
13a20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
13a30 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
13a40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
13a50 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
13a60 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
13a70 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
13a80 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
13a90 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
13aa0 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
13ab0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
13ac0 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
13ad0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
13ae0 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
13af0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
13b00 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
13b10 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
13b20 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
13b30 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
13b40 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
13b50 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
13b60 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
13b70 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
13b80 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
13b90 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
13ba0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
13bb0 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
13bc0 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
13bd0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
13be0 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
13bf0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
13c00 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
13c10 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13c20 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
13c30 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
13c40 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
13c50 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
13c60 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
13c70 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
13c80 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
13c90 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13ca0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
13cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
13cc0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65  e..    */.    te
13cd0 73 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20  stcase( nRec==0 
13ce0 26 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20  && !isHot.      
13cf0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
13d00 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
13d10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21  _HDR_SZ(pPager)!
13d20 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
13d30 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20  Off.         && 
13d40 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
13d50 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
13d60 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13d70 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20  er))>0.         
13d80 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72  && pagerNextJour
13d90 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70  nalPageIsValid(p
13da0 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
13db0 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
13dc0 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
13dd0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13de0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
13df0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
13e00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13e10 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
13e20 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
13e30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13e40 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
13e50 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
13e60 20 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a    isUnsync = 1;.
13e70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
13e80 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
13e90 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
13ea0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
13eb0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
13ec0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
13ed0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
13ee0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
13ef0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
13f00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
13f10 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
13f20 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
13f30 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
13f40 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
13f50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
13f60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13f70 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
13f80 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
13f90 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
13fa0 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
13fb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
13fc0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
13fd0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
13fe0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
13ff0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
14000 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
14010 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
14020 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
14030 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
14040 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
14050 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
14060 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
14070 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14080 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
14090 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
140a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
140b0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
140c0 28 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79  (pPager,1,isUnsy
140d0 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  nc,&pPager->jour
140e0 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20  nalOff,0,0);.   
140f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14120 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
14130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14140 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
14150 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14160 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
14170 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
14180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
14190 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
141a0 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
141b0 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
141c0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
141d0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
141e0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
141f0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14200 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
14210 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
14220 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
14230 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
14240 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
14250 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
14260 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
14270 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
14280 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
14290 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
142a0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
142b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
142c0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
142d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
142e0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
142f0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
14300 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
14310 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
14320 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14330 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14340 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
14350 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
14360 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
14370 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
14380 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
14390 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
143a0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
143b0 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
143c0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
143d0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
143e0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
143f0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
14400 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
14410 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
14420 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
14430 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
14440 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
14450 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
14460 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
14470 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
14480 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
14490 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
144a0 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
144b0 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
144c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
144d0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
144e0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
144f0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
14500 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
14510 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
14520 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
14530 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
14540 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
14550 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
14560 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
14570 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
14580 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
14590 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
145a0 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
145b0 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
145c0 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
145d0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
145e0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
145f0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
14600 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
14610 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
14620 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
14630 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
14640 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
14650 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
14660 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
14670 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
14680 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
14690 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
146a0 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
146b0 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
146c0 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
146d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
146e0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
146f0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
14700 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
14710 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
14720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14730 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
14740 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
14750 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
14760 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
14770 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
14780 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
14790 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
147a0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
147b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
147c0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
147d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
147e0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
147f0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
14800 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
14810 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0');.    testcas
14820 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
14830 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
14840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
14850 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
14860 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
14870 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
14880 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
14890 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
148a0 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
148b0 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
148c0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
148d0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
148e0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
148f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
14900 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
14910 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
14920 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14930 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
14940 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
14950 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
14960 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
14970 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
14980 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
14990 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
149a0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
149b0 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
149c0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
149d0 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
149e0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
149f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
14a00 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
14a10 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
14a20 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
14a30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
14a40 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
14a50 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
14a60 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
14a70 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
14a80 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
14a90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14aa0 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
14ab0 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
14ac0 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
14ad0 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
14ae0 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
14af0 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
14b00 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
14b10 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
14b20 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
14b30 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
14b40 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
14b50 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
14b60 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
14b70 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
14b80 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
14b90 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
14ba0 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
14bb0 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
14bc0 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
14bd0 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
14be0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
14bf0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
14c00 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
14c10 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
14c20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
14c30 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
14c40 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
14c50 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
14c60 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
14c70 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
14c80 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
14c90 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14ca0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
14cb0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14cc0 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
14cd0 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
14ce0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14cf0 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
14d00 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
14d10 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
14d20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
14d30 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
14d40 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
14d50 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
14d60 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
14d70 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
14d80 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
14d90 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14da0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
14db0 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
14dc0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
14dd0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
14de0 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
14df0 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
14e00 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14e10 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
14e20 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
14e30 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
14e40 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
14e50 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
14e60 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
14e70 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
14e80 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
14e90 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
14ea0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
14eb0 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
14ec0 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
14ed0 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
14ee0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
14ef0 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
14f00 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
14f10 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
14f20 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
14f30 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
14f40 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
14f50 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
14f60 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
14f70 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
14f80 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
14f90 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
14fa0 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14fb0 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
14fc0 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
14fd0 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
14fe0 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
14ff0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
15000 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
15010 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
15020 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
15030 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
15040 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
15050 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
15060 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
15070 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
15080 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
15090 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
150a0 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
150b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
150c0 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
150d0 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
150e0 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
150f0 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
15100 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
15110 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
15120 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
15130 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
15140 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
15150 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
15160 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
15170 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
15180 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
15190 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
151a0 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
151b0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
151c0 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
151d0 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
151e0 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
151f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15200 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
15210 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
15220 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
15230 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
15240 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
15250 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
15260 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
15270 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15280 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
15290 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
152a0 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
152b0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
152c0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
152d0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
152e0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
152f0 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
15300 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
15310 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
15320 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
15330 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15340 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15350 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
15360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
15370 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
15380 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
15390 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
153a0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
153b0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
153c0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
153d0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
153e0 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
153f0 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
15400 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a  r->dbOrigSize;..
15410 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
15420 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
15430 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
15440 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
15450 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
15460 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
15470 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
15480 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
15490 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
154a0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
154b0 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
154c0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
154d0 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
154e0 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
154f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
15500 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
15510 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
15520 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15530 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
15540 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
15550 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
15560 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
15570 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
15580 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
15590 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
155a0 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
155b0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
155c0 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
155d0 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
155e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
155f0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
15600 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
15610 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
15620 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
15630 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
15640 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
15650 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
15660 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
15670 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
15680 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
15690 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
156a0 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
156b0 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
156c0 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
156d0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
156e0 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
156f0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
15700 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
15710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
15720 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
15730 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
15740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15750 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15760 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
15770 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15780 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15790 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c  ge(pPager, 1, 0,
157a0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
157b0 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b  lOff, 1, pDone);
157c0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
157d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
157e0 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
157f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15800 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
15810 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
15820 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
15830 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
15840 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
15850 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
15860 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
15870 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
15880 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
15890 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
158a0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
158b0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
158c0 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
158d0 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
158e0 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
158f0 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
15900 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
15910 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
15920 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
15930 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
15940 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
15950 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
15960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15970 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
15980 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
15990 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
159a0 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
159b0 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
159c0 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
159d0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
159e0 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
159f0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
15a00 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15a10 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
15a20 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
15a30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
15a40 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
15a50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
15a60 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
15a70 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
15a80 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
15a90 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
15aa0 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
15ab0 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
15ac0 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
15ad0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15ae0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
15af0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  /.    assert( !(
15b00 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20  nJRec==0.       
15b10 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
15b20 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
15b30 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d  HDR_SZ(pPager)!=
15b40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15b50 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ff.         && (
15b60 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
15b70 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
15b80 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
15b90 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26  r))>0.         &
15ba0 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  & pagerNextJourn
15bb0 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50  alPageIsValid(pP
15bc0 61 67 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20  ager)).    );.  
15bd0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
15be0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
15bf0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
15c00 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
15c10 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
15c20 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
15c30 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
15c40 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
15c50 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
15c60 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15c70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
15c80 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
15c90 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
15ca0 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
15cb0 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
15cc0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
15cd0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
15ce0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
15cf0 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  , 0, &pPager->jo
15d00 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f  urnalOff, 1, pDo
15d10 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
15d20 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15d30 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
15d40 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15d50 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
15d60 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
15d70 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
15d80 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
15d90 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
15da0 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
15db0 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
15dc0 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
15dd0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
15de0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
15df0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
15e00 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
15e10 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
15e20 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
15e30 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
15e40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
15e50 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
15e60 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
15e70 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15e80 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
15e90 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
15ea0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
15eb0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15ec0 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
15ed0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
15ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15ef0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
15f00 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
15f10 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
15f20 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
15f30 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
15f40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15f50 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15f60 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f  pPager, 0, 0, &o
15f70 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
15f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15f90 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15fa0 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
15fb0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
15fc0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
15fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15fe0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
15ff0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
16000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
16010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16020 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
16030 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
16040 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
16050 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
16060 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16070 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
16080 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
16090 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
160a0 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
160b0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
160c0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
160d0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
160e0 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
160f0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
16100 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
16110 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
16120 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
16130 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
16140 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
16150 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
16160 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
16170 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
16180 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
16190 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
161a0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
161b0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
161c0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
161d0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
161e0 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
161f0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
16200 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
16210 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
16220 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
16230 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
16240 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
16250 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16260 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
16270 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
16280 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
16290 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
162a0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
162b0 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
162c0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
162d0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
162e0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
162f0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
16300 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
16310 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
16320 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
16330 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
16340 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
16350 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
16360 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
16370 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
16380 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
16390 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
163a0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
163b0 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
163c0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
163d0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
163e0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
163f0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
16400 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
16410 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
16420 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
16430 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
16440 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
16450 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
16460 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
16470 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16480 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
16490 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
164a0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
164b0 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
164c0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
164d0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
164e0 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
164f0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
16500 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
16510 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
16520 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
16530 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16540 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
16550 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
16560 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
16570 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
16580 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
16590 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
165a0 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
165b0 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
165c0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
165d0 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
165e0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
165f0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
16600 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
16610 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
16620 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
16630 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
16640 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
16650 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
16660 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
16670 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
16680 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
16690 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
166a0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
166b0 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
166c0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
166d0 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
166e0 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
166f0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
16700 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
16710 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
16720 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
16730 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
16740 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
16750 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
16760 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
16770 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
16780 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
16790 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
167a0 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
167b0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
167c0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
167d0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
167e0 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
167f0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
16800 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
16810 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
16820 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
16830 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
16840 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
16850 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
16860 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
16870 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
16880 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
16890 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
168a0 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
168b0 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
168c0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
168d0 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
168e0 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
168f0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
16900 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
16910 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
16920 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
16930 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
16940 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
16950 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
16960 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
16970 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16990 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
169a0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
169b0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
169c0 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
169d0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
169e0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
169f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16a00 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
16a10 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
16a20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
16a30 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
16a40 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
16a50 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
16a60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
16a70 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
16a80 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
16a90 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
16aa0 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
16ab0 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
16ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16ad0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16ae0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16af0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
16b00 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
16b10 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
16b20 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
16b30 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
16b40 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
16b50 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
16b60 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16b70 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
16b80 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16b90 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
16ba0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16bb0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
16bc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
16bd0 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
16be0 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
16bf0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
16c00 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
16c10 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
16c20 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
16c30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
16c40 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
16c50 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
16c60 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
16c70 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
16c80 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
16c90 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
16ca0 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
16cb0 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
16cc0 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
16cd0 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
16ce0 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
16cf0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
16d00 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
16d10 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
16d20 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
16d30 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
16d40 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
16d50 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
16d60 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
16d70 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
16d80 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
16d90 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
16da0 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
16db0 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
16dc0 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
16dd0 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
16de0 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
16df0 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e10 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
16e20 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
16e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e60 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
16e70 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
16e80 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
16e90 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
16ea0 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
16eb0 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
16ec0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
16ed0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
16ee0 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
16ef0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
16f00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
16f10 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
16f20 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
16f30 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
16f40 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
16f50 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
16f60 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
16f70 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
16f80 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
16f90 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
16fa0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
16fb0 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
16fc0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
16fd0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
16fe0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
16ff0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
17020 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
17030 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
17040 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
17050 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
17060 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
17070 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
17080 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
170a0 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
170b0 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
170c0 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
170d0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
170e0 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
170f0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
17100 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
17110 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
17120 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
17130 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
17140 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 66 20   this pager. If 
17150 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
17160 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
17170 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
17180 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
17190 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
171a0 6d 6f 64 69 66 69 65 64 20 28 72 65 73 74 6f 72  modified (restor
171b0 65 64 29 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  ed).** as part o
171c0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
171d0 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
171e0 6c 62 61 63 6b 2e 20 54 68 65 20 63 61 6c 6c 62  lback. The callb
171f0 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a 20 68 69  ack gives .** hi
17200 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 20  gher-level code 
17210 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
17220 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
17230 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 0a  TRA section to .
17240 2a 2a 20 61 67 72 65 65 20 77 69 74 68 20 74 68  ** agree with th
17250 65 20 72 65 73 74 6f 72 65 64 20 70 61 67 65 20  e restored page 
17260 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
17270 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
17280 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
17290 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
172a0 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a  nit)(DbPage*)){.
172b0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
172c0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
172d0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
172e0 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
172f0 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
17300 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
17310 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
17320 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
17330 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
17340 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
17350 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
17360 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
17370 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
17380 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
17390 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
173a0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
173b0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
173c0 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
173d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
173e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 6f 72  QLITE_CORRUPT or
173f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a   SQLITE_FULL)..*
17400 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
17410 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
17420 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
17430 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20  :.**.**   * the 
17440 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 28 76  new page size (v
17450 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69  alue of *pPageSi
17460 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28 61 20  ze) is valid (a 
17470 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66  power .**     of
17480 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32   two between 512
17490 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f   and SQLITE_MAX_
174a0 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75  PAGE_SIZE, inclu
174b0 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  sive), and.**.**
174c0 20 20 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e     * there are n
174d0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
174e0 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61  ge references, a
174f0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
17500 20 64 61 74 61 62 61 73 65 20 69 73 20 65 69 74   database is eit
17510 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  her not an in-me
17520 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 6f 72  mory database or
17530 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e   it is.**     an
17540 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
17550 61 73 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  ase that current
17560 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a  ly consists of z
17570 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a  ero pages..**.**
17580 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
17590 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65  object page size
175a0 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67   is set to *pPag
175b0 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eSize..**.** If 
175c0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
175d0 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74   changed, then t
175e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65  his function use
175f0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  s sqlite3PagerMa
17600 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62  lloc() .** to ob
17610 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72  tain a new Pager
17620 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65  .pTmpSpace buffe
17630 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63  r. If this alloc
17640 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a  ation attempt .*
17650 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f  * fails, SQLITE_
17660 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
17670 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  d and the page s
17680 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68  ize remains unch
17690 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c  anged. .** In al
176a0 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53  l other cases, S
176b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
176c0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
176d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
176e0 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74  not changed, eit
176f0 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20  her because one 
17700 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65  of the enumerate
17710 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20  d.** conditions 
17720 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75  above is not tru
17730 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 61 73  e, the pager was
17740 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   in error state 
17750 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e  when this.** fun
17760 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
17770 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  , or because the
17780 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
17790 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65  on attempt faile
177a0 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61  d, .** then *pPa
177b0 67 65 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  geSize is set to
177c0 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e   the old, retain
177d0 65 64 20 70 61 67 65 20 73 69 7a 65 20 62 65 66  ed page size bef
177e0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
177f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17800 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
17810 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36  ger *pPager, u16
17820 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20   *pPageSize){.  
17830 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
17840 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
17850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17860 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a  .    u16 pageSiz
17870 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
17880 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
17890 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
178a0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
178b0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
178c0 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
178d0 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
178e0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
178f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
17900 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
17910 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
17920 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
17930 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
17940 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
17950 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
17960 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
17970 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
17980 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
17990 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
179a0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
179b0 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
179c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
179d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
179e0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
179f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
17a00 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
17a10 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
17a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
17a30 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
17a40 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20  TmpSpace);.     
17a50 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
17a60 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
17a70 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
17a80 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50  heSetPageSize(pP
17a90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
17aa0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17ab0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61  }.    }.    *pPa
17ac0 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 50  geSize = (u16)pP
17ad0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
17ae0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
17b00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17b10 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
17b20 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
17b30 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
17b40 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
17b50 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
17b60 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
17b70 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
17b80 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
17b90 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
17ba0 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
17bb0 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
17bc0 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
17bd0 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
17be0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
17bf0 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
17c00 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
17c10 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
17c20 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
17c30 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
17c40 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
17c50 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
17c60 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
17c70 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
17c80 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17c90 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
17ca0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
17cb0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
17cc0 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
17cd0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
17ce0 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
17cf0 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
17d00 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
17d10 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
17d20 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
17d30 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
17d40 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
17d50 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
17d60 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
17d70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17d80 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
17d90 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
17da0 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
17db0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
17dc0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
17dd0 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
17de0 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
17df0 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
17e00 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
17e10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
17e20 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
17e30 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
17e40 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
17e50 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  er, 0);.  return
17e60 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
17e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
17e80 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
17e90 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
17ea0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
17eb0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
17ec0 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
17ed0 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
17ee0 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
17ef0 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
17f00 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
17f10 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
17f20 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
17f30 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
17f40 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
17f50 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
17f60 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
17f70 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
17f80 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
17f90 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
17fa0 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
17fb0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
17fc0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
17fd0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
17fe0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
17ff0 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
18000 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
18010 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
18020 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
18030 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
18040 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
18050 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
18060 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
18070 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
18080 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
18090 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
180a0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
180b0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
180c0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
180d0 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
180e0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
180f0 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
18100 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
18110 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
18120 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
18130 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
18140 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
18150 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
18160 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
18170 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
18180 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  to. .**.** If th
18190 65 20 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e  e pager was open
181a0 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e  ed on a transien
181b0 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d  t file (zFilenam
181c0 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70  e==""), or.** op
181d0 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c  ened on a file l
181e0 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73  ess than N bytes
181f0 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75   in size, the ou
18200 74 70 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a  tput buffer is.*
18210 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c  * zeroed and SQL
18220 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
18230 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66   The rationale f
18240 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
18250 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
18260 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
18270 64 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  d database heade
18280 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72  rs, and a new tr
18290 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65  ansient or.** ze
182a0 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62 61 73  ro sized databas
182b0 65 20 68 61 73 20 61 20 68 65 61 64 65 72 20 74  e has a header t
182c0 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  han consists ent
182d0 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e  irely of zeroes.
182e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f  .**.** If any IO
182f0 20 65 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f   error apart fro
18300 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  m SQLITE_IOERR_S
18310 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63  HORT_READ is enc
18320 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65  ountered,.** the
18330 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
18340 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
18350 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f  aller and the co
18360 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
18370 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 75   output buffer u
18380 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  ndefined..*/.int
18390 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
183a0 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
183b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
183c0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
183d0 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
183e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
183f0 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
18400 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , N);.  assert( 
18410 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18420 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  d) || pPager->te
18430 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20  mpFile );.  if( 
18440 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18450 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
18460 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
18470 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
18480 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
18490 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
184a0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
184b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
184c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
184d0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
184e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
184f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18500 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18510 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
18520 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18530 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
18540 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
18550 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72   .** with pPager
18560 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  . Normally, this
18570 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61   is calculated a
18580 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65  s (<db file size
18590 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a  >/<page-size>)..
185a0 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  ** However, if t
185b0 68 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65  he file is betwe
185c0 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73  en 1 and <page-s
185d0 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69  ize> bytes in si
185e0 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  ze, then .** thi
185f0 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  s is considered 
18600 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a  a 1 page file..*
18610 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
18620 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74  r is in error st
18630 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
18640 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
18650 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72  , then the.** er
18660 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
18670 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18680 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66   and *pnPage lef
18690 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c  t unchanged. Or,
186a0 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20  .** if the file 
186b0 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65  system has to be
186c0 20 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65   queried for the
186d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
186e0 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65  e and.** the que
186f0 72 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72  ry attempt retur
18700 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20  ns an IO error, 
18710 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
18720 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  e is returned.**
18730 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
18740 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a  left unchanged..
18750 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
18760 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
18770 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  s successful, th
18780 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
18790 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
187a0 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74  *pnPage is set t
187b0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
187c0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
187d0 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
187e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
187f0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
18800 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b  r, int *pnPage){
18810 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20  .  Pgno nPage;  
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18830 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
18840 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a  via *pnPage */..
18850 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
18860 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  r is already in 
18870 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
18880 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
18890 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28  r code. */.  if(
188a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
188b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
188c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
188d0 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d    }..  /* Determ
188e0 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
188f0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66  f pages in the f
18900 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69 73 20  ile. Store this 
18910 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69  in nPage. */.  i
18920 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
18930 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50  eValid ){.    nP
18940 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  age = pPager->db
18950 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
18960 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
18970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
18980 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  ror returned by 
18990 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
189a0 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
189b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
189c0 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ile size in byte
189d0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  s returned by Os
189e0 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20  FileSize() */.. 
189f0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
18a00 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
18a10 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
18a20 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f  e );.    if( isO
18a30 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18a40 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  && (0 != (rc = s
18a50 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
18a60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
18a70 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  )) ){.      page
18a80 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
18a90 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
18aa0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18ab0 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
18ac0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
18ad0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 31  .      nPage = 1
18ae0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18af0 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
18b00 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  )(n / pPager->pa
18b10 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
18b20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
18b30 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
18b40 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
18b50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
18b60 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ge;.      pPager
18b70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e  ->dbFileSize = n
18b80 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
18b90 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
18ba0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
18bb0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
18bc0 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ent number of pa
18bd0 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
18be0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
18bf0 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67  the .  ** config
18c00 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67  ured maximum pag
18c10 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65  er number, incre
18c20 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20  ase the allowed 
18c30 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68  limit so.  ** th
18c40 61 74 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20  at the file can 
18c50 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  be read..  */.  
18c60 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72  if( nPage>pPager
18c70 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
18c80 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
18c90 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20   (Pgno)nPage;.  
18ca0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
18cb0 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
18cc0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18cd0 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e  E_OK */.  if( pn
18ce0 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50  Page ){.    *pnP
18cf0 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d  age = nPage;.  }
18d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18d10 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
18d20 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
18d30 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
18d40 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
18d50 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
18d60 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
18d70 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
18d80 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
18d90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
18da0 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
18db0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
18dc0 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
18dd0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
18de0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
18df0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
18e00 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
18e10 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
18e20 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
18e30 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
18e40 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
18e50 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
18e60 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
18e70 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
18e80 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
18e90 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
18ea0 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
18eb0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
18ec0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18ed0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
18ee0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
18ef0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
18f00 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
18f10 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
18f20 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
18f30 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
18f40 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
18f50 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
18f60 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
18f70 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
18f80 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
18f90 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
18fa0 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
18fb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
18fe0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
18ff0 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
19000 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
19010 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
19020 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
19030 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
19040 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
19050 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
19060 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
19070 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
19080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
19090 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
190a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
190b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
190c0 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
190d0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
190e0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
190f0 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
19100 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19110 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
19120 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
19130 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20  eValid==0 );..  
19140 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
19150 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
19160 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
19170 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
19180 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
19190 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f  y held, or one o
191a0 66 20 74 68 65 20 74 72 61 6e 73 69 73 74 69 6f  f the transistio
191b0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
191c0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
191d0 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
191e0 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
191f0 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
19200 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
19210 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
19220 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
19230 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
19240 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  tate>=locktype).
19250 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
19260 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
19270 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79  UNLOCK && lockty
19280 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  pe==PAGER_SHARED
19290 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
192a0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
192b0 52 5f 52 45 53 45 52 56 45 44 20 26 26 20 6c 6f  R_RESERVED && lo
192c0 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 45 58  cktype==PAGER_EX
192d0 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20  CLUSIVE).  );.. 
192e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
192f0 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
19300 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19310 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
19320 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
19330 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
19340 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
19350 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
19360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
19370 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75  Y && pPager->xBu
19380 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
19390 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
193a0 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  g) );.    if( rc
193b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
193c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
193d0 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  te = (u8)locktyp
193e0 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  e;.      IOTRACE
193f0 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22  (("LOCK %p %d\n"
19400 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  , pPager, lockty
19410 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pe)).    }.  }. 
19420 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19430 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
19440 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
19450 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
19460 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
19470 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
19480 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
19490 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
194a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
194b0 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
194c0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
194d0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
194e0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
194f0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
19500 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
19510 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
19520 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
19530 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
19540 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19550 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
19560 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
19570 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
19580 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19590 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
195a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
195b0 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
195c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
195d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
195e0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
195f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
19600 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nPage;.}../*.**
19610 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
19620 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
19630 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
19640 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
19650 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
19660 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
19670 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
19680 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19690 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
196a0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
196b0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
196c0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
196d0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
196e0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
196f0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
19700 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
19710 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
19720 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
19730 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
19740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
19750 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
19760 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
19770 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
19780 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19790 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
197a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
197b0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
197c0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
197d0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
197e0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
197f0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
19800 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
19810 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
19820 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
19830 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
19840 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19850 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
19860 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
19870 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
19880 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19890 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
198a0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
198b0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
198c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
198d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
198e0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
198f0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
19900 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
19910 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45  Pager);.  if( ME
19920 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72  MDB ){.    pager
19930 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
19940 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19950 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e   Set Pager.journ
19960 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20  alHdr to -1 for 
19970 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74  the benefit of t
19980 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
19990 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  k() .    ** call
199a0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61   which may be ma
199b0 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  de from within p
199c0 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
199d0 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20  lback(). If it. 
199e0 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c     ** is not -1,
199f0 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63   then the unsync
19a00 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e  ed portion of an
19a10 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
19a20 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65  le may.    ** be
19a30 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74   played back int
19a40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19a50 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  If a power failu
19a60 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  re occurs while.
19a70 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68      ** this is h
19a80 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61  appening, the da
19a90 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d  tabase may becom
19aa0 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a  e corrupt..    *
19ab0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  /.    pPager->jo
19ac0 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20  urnalHdr = -1;. 
19ad0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
19ae0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
19af0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19b00 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
19b10 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
19b20 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
19b30 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
19b40 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
19b50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
19b60 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
19b70 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
19b80 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
19b90 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
19ba0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ;.  sqlite3PageF
19bb0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
19bc0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
19bd0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
19be0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
19bf0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
19c00 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
19c10 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
19c20 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
19c30 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
19c40 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
19c50 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
19c60 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
19c70 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
19c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19c90 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
19ca0 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
19cb0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
19cc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19cd0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
19ce0 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
19cf0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
19d00 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
19d10 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
19d20 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
19d30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
19d40 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
19d50 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
19d60 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
19d70 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
19d80 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
19d90 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
19da0 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
19db0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
19dc0 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
19dd0 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
19de0 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
19df0 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
19e00 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
19e10 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
19e20 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
19e30 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
19e40 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
19e50 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
19e60 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
19e70 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
19e80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
19e90 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
19ea0 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
19eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
19ec0 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f  is a.** no-op. O
19ed0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
19ee0 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
19ef0 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
19f00 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64  rnal-mode.** and
19f10 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
19f20 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
19f30 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  he the file-syst
19f40 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
19f50 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
19f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
19f70 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
19f80 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
19f90 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
19fa0 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
19fb0 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
19fc0 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
19fd0 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
19fe0 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
19ff0 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
1a000 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
1a010 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
1a020 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
1a030 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
1a040 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
1a050 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
1a060 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
1a070 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
1a080 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
1a090 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
1a0a0 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
1a0b0 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
1a0c0 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
1a0d0 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
1a0e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a0f0 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
1a100 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
1a110 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
1a120 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
1a130 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
1a140 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
1a150 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
1a160 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
1a170 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
1a180 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
1a190 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
1a1a0 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
1a1b0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
1a1c0 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
1a1d0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
1a1e0 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
1a1f0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
1a200 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
1a210 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
1a220 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
1a230 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
1a240 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
1a250 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
1a260 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
1a270 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68  .**   }.**.** Th
1a280 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1a290 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62   flag is never b
1a2a0 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72  e set for tempor
1a2b0 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e  ary files, or an
1a2c0 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74  y.** file operat
1a2d0 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1a2e0 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e  ode (Pager.noSyn
1a2f0 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72  c set to non-zer
1a300 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  o)..**.** If suc
1a310 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
1a320 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
1a330 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1a340 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
1a350 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
1a360 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
1a370 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a380 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
1a390 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
1a3a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1a3b0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1a3c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1a3d0 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1a3e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1a3f0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
1a400 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
1a410 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1a420 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
1a430 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1a440 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  le );.    if( pP
1a450 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1a460 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
1a470 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
1a480 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20       int rc;    
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1a4b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
1a4c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
1a4d0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
1a4e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1a4f0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a500 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1a510 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1a520 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
1a530 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1a540 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
1a550 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
1a560 72 69 61 62 6c 65 20 69 4e 52 65 63 4f 66 66 73  riable iNRecOffs
1a570 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1a580 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
1a590 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20  ournal file.    
1a5a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 52      ** of the nR
1a5b0 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ec field of the 
1a5c0 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72  most recently wr
1a5d0 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65  itten journal he
1a5e0 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ader..        **
1a5f0 20 54 68 69 73 20 66 69 65 6c 64 20 77 69 6c 6c   This field will
1a600 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 6c 6c   be updated foll
1a610 6f 77 69 6e 67 20 74 68 65 20 78 53 79 6e 63 28  owing the xSync(
1a620 29 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20 20 20  ) operation.    
1a630 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f      ** on the jo
1a640 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
1a650 20 20 20 20 20 20 20 69 36 34 20 69 4e 52 65 63         i64 iNRec
1a660 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
1a670 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
1a680 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1a690 69 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ic);..        /*
1a6a0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
1a6b0 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
1a6c0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
1a6d0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
1a6e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
1a6f0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
1a700 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
1a710 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
1a720 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
1a730 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
1a740 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1a750 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
1a760 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
1a770 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
1a780 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
1a790 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
1a7a0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
1a7b0 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
1a7c0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
1a7d0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
1a7e0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1a7f0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
1a800 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
1a810 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
1a820 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63  nections transac
1a830 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
1a840 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
1a850 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
1a860 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
1a870 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
1a880 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
1a890 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
1a8a0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
1a8b0 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
1a8c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
1a8d0 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
1a8e0 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
1a8f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
1a900 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
1a910 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
1a920 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
1a930 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
1a940 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
1a950 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
1a960 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
1a970 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
1a980 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
1a990 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
1a9a0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
1a9b0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
1a9c0 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
1a9d0 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
1a9e0 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
1a9f0 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
1aa00 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
1aa10 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
1aa20 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
1aa30 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
1aa40 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
1aa50 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
1aa60 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
1aa70 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
1aa80 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
1aa90 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
1aaa0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
1aab0 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
1aac0 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
1aad0 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
1aae0 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
1aaf0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1ab00 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
1ab10 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
1ab20 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
1ab30 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
1ab40 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
1ab50 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
1ab60 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
1ab70 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
1ab80 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
1ab90 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
1aba0 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
1abb0 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
1abc0 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
1abd0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
1abe0 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
1abf0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
1ac00 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
1ac10 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1ac20 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1ac30 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1ac40 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b     u8 aMagic[8];
1ac50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ac60 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1ac70 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
1ac80 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
1ac90 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
1aca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1acb0 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
1acc0 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
1acd0 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
1ace0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1acf0 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
1ad00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ad10 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1ad20 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
1ad30 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
1ad40 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1ad50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1ad60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1ad70 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1ad80 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1ad90 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ada0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1adb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
1adc0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1add0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1ade0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
1adf0 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
1ae00 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
1ae10 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
1ae20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
1ae30 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
1ae40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
1ae50 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
1ae60 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
1ae70 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
1ae80 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
1ae90 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
1aea0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
1aeb0 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
1aec0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
1aed0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1aee0 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
1aef0 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
1af00 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
1af10 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
1af20 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
1af30 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
1af40 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1af50 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
1af60 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
1af70 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
1af80 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
1af90 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
1afa0 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
1afb0 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
1afc0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
1afd0 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
1afe0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
1aff0 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
1b000 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
1b010 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1b020 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
1b030 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
1b040 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1b050 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
1b060 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1b070 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1b080 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1b090 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1b0a0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b0b0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1b0c0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
1b0d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1b0e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1b0f0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1b100 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
1b110 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b120 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b140 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
1b150 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
1b160 50 61 67 65 72 2c 20 69 4e 52 65 63 4f 66 66 73  Pager, iNRecOffs
1b170 65 74 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20  et, 4));.       
1b180 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1b190 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
1b1a0 4e 52 65 63 4f 66 66 73 65 74 2c 20 70 50 61 67  NRecOffset, pPag
1b1b0 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
1b1c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b1d0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b1e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b1f0 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
1b200 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1b210 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
1b220 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1b230 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1b240 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b250 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
1b260 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
1b270 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1b280 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b290 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1b2a0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
1b2b0 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
1b2c0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
1b2d0 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
1b2e0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
1b2f0 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
1b300 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
1b310 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b320 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1b330 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1b340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1b350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
1b360 20 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c   just successful
1b370 6c 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50  ly synced. Set P
1b380 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20  ager.needSync . 
1b390 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e     ** to zero an
1b3a0 64 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  d clear the PGHD
1b3b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1b3c0 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a   on all pagess..
1b3d0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
1b3e0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1b3f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
1b400 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
1b410 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
1b420 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
1b430 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b440 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1b450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b460 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
1b470 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
1b480 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
1b490 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
1b4a0 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
1b4b0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
1b4c0 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
1b4d0 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
1b4e0 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
1b4f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1b500 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
1b510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b520 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
1b530 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
1b540 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
1b550 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
1b560 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
1b570 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
1b580 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
1b590 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
1b5a0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
1b5b0 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
1b5c0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
1b5d0 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
1b5e0 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
1b5f0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1b600 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
1b610 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
1b620 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
1b630 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
1b640 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
1b650 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
1b660 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1b670 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
1b680 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1b690 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1b6a0 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
1b6b0 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
1b6c0 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
1b6d0 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
1b6e0 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
1b6f0 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
1b700 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
1b710 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
1b720 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
1b730 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
1b740 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
1b750 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
1b760 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
1b770 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
1b780 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
1b790 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
1b7a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b7b0 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
1b7c0 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
1b7d0 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
1b7e0 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
1b7f0 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
1b800 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
1b810 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
1b820 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
1b830 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
1b840 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
1b850 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
1b860 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
1b870 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
1b880 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
1b890 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
1b8a0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1b8b0 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
1b8c0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
1b8d0 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
1b8e0 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
1b8f0 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
1b900 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
1b910 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
1b920 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1b930 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
1b940 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
1b950 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
1b960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b970 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
1b980 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
1b990 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
1b9a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1b9b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
1b9c0 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
1b9d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1b9e0 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
1b9f0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
1ba00 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
1ba10 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
1ba20 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
1ba30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ba40 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1ba50 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
1ba60 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1ba70 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1ba80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1ba90 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1baa0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1bad0 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 69  de */..  if( pLi
1bae0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  st==0 ) return S
1baf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
1bb00 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67  er = pList->pPag
1bb10 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  er;..  /* At thi
1bb20 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61  s point there ma
1bb30 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45  y be either a RE
1bb40 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
1bb50 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  IVE lock on the.
1bb60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
1bb70 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  le. If there is 
1bb80 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55  already an EXCLU
1bb90 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66  SIVE lock, the f
1bba0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61  ollowing.  ** ca
1bbb0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  ll is a no-op.. 
1bbc0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
1bbd0 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
1bbe0 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
1bbf0 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
1bc00 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
1bc10 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
1bc20 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
1bc30 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
1bc40 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
1bc50 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
1bc60 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
1bc70 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1bc80 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
1bc90 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
1bca0 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
1bcb0 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
1bcc0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
1bcd0 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
1bce0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
1bcf0 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
1bd00 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
1bd10 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
1bd20 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
1bd30 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
1bd40 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
1bd50 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
1bd60 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
1bd70 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
1bd80 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
1bd90 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
1bda0 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
1bdb0 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
1bdc0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
1bdd0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1bde0 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
1bdf0 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
1be00 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
1be10 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1be20 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
1be30 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
1be40 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
1be50 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
1be60 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
1be70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1be80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1be90 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1bea0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1beb0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1bec0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1bed0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  ;..  /* If the f
1bee0 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d 66 69  ile is a temp-fi
1bef0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
1bf00 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
1bf10 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a   it now. It.  **
1bf20 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1bf30 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20 6f 74   for rc to be ot
1bf40 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1bf50 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61 6e 63  OK if this branc
1bf60 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c  h.  ** is taken,
1bf70 20 61 73 20 70 61 67 65 72 5f 77 61 69 74 5f 6f   as pager_wait_o
1bf80 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  n_lock() is a no
1bf90 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c  -op for temp-fil
1bfa0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
1bfb0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
1bfc0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
1bfd0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1bfe0 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  le && rc==SQLITE
1bff0 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  _OK );.    rc = 
1c000 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
1c010 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
1c020 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
1c030 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  gs);.  }..  whil
1c040 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1c050 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
1c060 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69   Pgno pgno = pLi
1c070 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f  st->pgno;..    /
1c080 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
1c090 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
1c0a0 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
1c0b0 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
1c0c0 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
1c0d0 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
1c0e0 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
1c0f0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1c100 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c  Image() was call
1c110 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
1c120 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
1c130 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
1c140 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
1c150 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
1c160 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
1c170 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
1c180 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1c190 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20  ** Also, do not 
1c1a0 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61  write out any pa
1c1b0 67 65 20 74 68 61 74 20 68 61 73 20 74 68 65 20  ge that has the 
1c1c0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
1c1d0 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74   flag.    ** set
1c1e0 20 28 73 65 74 20 62 79 20 73 71 6c 69 74 65 33   (set by sqlite3
1c1f0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29  PagerDontWrite()
1c200 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
1c210 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
1c220 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
1c230 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
1c240 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
1c250 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
1c260 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1c270 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1c280 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  e;         /* Of
1c290 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  fset to write */
1c2a0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
1c2b0 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  ta = CODEC2(pPag
1c2c0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61  er, pList->pData
1c2d0 2c 20 70 67 6e 6f 2c 20 36 29 3b 20 2f 2a 20 44  , pgno, 6); /* D
1c2e0 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  ata to write */.
1c2f0 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
1c300 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
1c310 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
1c320 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1c330 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
1c340 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
1c350 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
1c360 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
1c370 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
1c380 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
1c390 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
1c3a0 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
1c3b0 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
1c3c0 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
1c3d0 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
1c3e0 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
1c3f0 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
1c400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c410 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
1c420 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
1c430 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1c440 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1c450 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1c460 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1c470 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
1c480 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1c490 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
1c4a0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
1c4b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1c4c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
1c4d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
1c4e0 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
1c4f0 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74  ..      /* Updat
1c500 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a  e any backup obj
1c510 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65  ects copying the
1c520 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69   contents of thi
1c530 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20  s pager. */.    
1c540 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
1c550 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
1c560 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
1c570 20 2a 29 70 44 61 74 61 29 3b 0a 0a 20 20 20 20   *)pData);..    
1c580 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1c590 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1c5a0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5c0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c5d0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1c5e0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1c5f0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1c600 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1c610 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1c620 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1c630 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1c640 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1c650 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1c660 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1c670 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c680 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c690 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1c6a0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1c6b0 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1c6c0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1c6d0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1c6e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1c6f0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1c700 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1c710 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1c720 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1c730 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1c740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1c750 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1c760 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1c770 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1c780 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1c790 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1c7a0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1c7b0 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1c7c0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1c7d0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1c7e0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1c7f0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1c800 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1c810 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1c820 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1c830 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1c840 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1c850 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1c860 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1c870 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1c880 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1c890 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c8a0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1c8b0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1c8c0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1c8d0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1c8e0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1c8f0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1c900 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1c910 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1c920 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1c930 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1c940 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1c950 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1c960 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1c970 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1c980 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1c990 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1c9a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1c9b0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c9c0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1c9d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1c9e0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1c9f0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1ca00 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1ca10 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1ca20 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1ca30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1ca40 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43  char *pData2 = C
1ca50 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1ca60 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1ca70 37 29 3b 0a 20 20 0a 20 20 20 20 50 41 47 45 52  7);.  .    PAGER
1ca80 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
1ca90 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1caa0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1cab0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
1cac0 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28  ;.  .    assert(
1cad0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
1cae0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
1caf0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
1cb00 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ize );.    rc = 
1cb10 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1cb20 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
1cb30 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1cb40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cb50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1cb60 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1cb70 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
1cb80 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1cb90 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
1cba0 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  4);.    }.  }.  
1cbb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cbc0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
1cbd0 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20  >nSubRec++;.    
1cbe0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cbf0 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a  nSavepoint>0 );.
1cc00 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61      rc = addToSa
1cc10 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
1cc20 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1cc30 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cc40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cc50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1cc60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1cc70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1cc80 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63  lled by the pcac
1cc90 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74  he layer when it
1cca0 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d   has reached som
1ccb0 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79  e.** soft memory
1ccc0 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73   limit. The firs
1ccd0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
1cce0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
1ccf0 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61  er object.** (ca
1cd00 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20  st as a void*). 
1cd10 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 77  The pager is alw
1cd20 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27 20  ays 'purgeable' 
1cd30 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  (not an in-memor
1cd40 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20  y.** database). 
1cd50 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
1cd60 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65 6e  ent is a referen
1cd70 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68 61  ce to a page tha
1cd80 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74  t is .** current
1cd90 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61 73  ly dirty but has
1cda0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
1cdb0 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20  references. The 
1cdc0 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79  page.** is alway
1cdd0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1cde0 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  h the Pager obje
1cdf0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
1ce00 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
1ce10 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ent..**.** The j
1ce20 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ob of this funct
1ce30 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70  ion is to make p
1ce40 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74  Pg clean by writ
1ce50 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ing its contents
1ce60 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64  .** out to the d
1ce70 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66  atabase file, if
1ce80 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20   possible. This 
1ce90 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63  may involve sync
1cea0 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ing the.** journ
1ceb0 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  al file. .**.** 
1cec0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
1ced0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1cee0 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65  Clean() is calle
1cef0 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e  d on the page an
1cf00 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
1cf10 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
1cf20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1cf30 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d  hile trying to m
1cf40 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ake the.** page 
1cf50 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72  clean, the IO er
1cf60 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1cf70 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  rned. If the pag
1cf80 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d  e cannot be.** m
1cf90 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f  ade clean for so
1cfa0 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c  me other reason,
1cfb0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1cfc0 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
1cfd0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
1cfe0 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50 63  ned by sqlite3Pc
1cff0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
1d000 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a  is not called..*
1d010 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1d020 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70  erStress(void *p
1d030 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
1d040 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1d050 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69   (Pager *)p;.  i
1d060 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d070 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  K;..  assert( pP
1d080 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
1d090 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
1d0a0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d0b0 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54  DIRTY );..  /* T
1d0c0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
1d0d0 67 20 69 73 20 73 65 74 20 62 79 20 74 68 65 20  g is set by the 
1d0e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1d0f0 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  e() function whi
1d100 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f  le it.  ** is jo
1d110 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20  urnalling a set 
1d120 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64  of two or more d
1d130 61 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68  atabase pages th
1d140 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  at are stored.  
1d150 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64  ** on the same d
1d160 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63  isk sector. Sync
1d170 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
1d180 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77  is not allowed w
1d190 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69  hile.  ** this i
1d1a0 73 20 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69  s happening as i
1d1b0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
1d1c0 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20  hat all members 
1d1d0 6f 66 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  of such a.  ** s
1d1e0 65 74 20 6f 66 20 70 61 67 65 73 20 61 72 65 20  et of pages are 
1d1f0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74  synced to disk t
1d200 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20  ogether. So, if 
1d210 74 68 65 20 70 61 67 65 20 74 68 69 73 20 66 75  the page this fu
1d220 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74  nction.  ** is t
1d230 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c  rying to make cl
1d240 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65  ean will require
1d250 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20   a journal sync 
1d260 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  and the doNotSyn
1d270 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73  c.  ** flag is s
1d280 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  et, return witho
1d290 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
1d2a0 67 2e 20 54 68 65 20 70 63 61 63 68 65 20 6c 61  g. The pcache la
1d2b0 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75  yer will.  ** ju
1d2c0 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68  st have to go ah
1d2d0 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ead and allocate
1d2e0 20 61 20 6e 65 77 20 70 61 67 65 20 62 75 66 66   a new page buff
1d2f0 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20  er instead of.  
1d300 2a 2a 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a  ** reusing pPg..
1d310 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61    **.  ** Simila
1d320 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61 67 65  rly, if the page
1d330 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
1d340 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
1d350 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20  state, do not.  
1d360 2a 2a 20 74 72 79 20 74 6f 20 77 72 69 74 65 20  ** try to write 
1d370 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d380 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a  pPg to disk..  *
1d390 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1d3a0 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67  errCode || (pPag
1d3b0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26  er->doNotSync &&
1d3c0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1d3d0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a  R_NEED_SYNC) ){.
1d3e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d3f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
1d400 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
1d410 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
1d420 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  d. */.  if( pPg-
1d430 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1d440 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63  D_SYNC ){.    rc
1d450 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
1d460 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1d470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d480 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1d490 63 20 26 26 20 0a 20 20 20 20 20 20 21 28 70 50  c && .      !(pP
1d4a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1d4b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
1d4c0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a  MODE_MEMORY) &&.
1d4d0 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f        !(sqlite3O
1d4e0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1d4f0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1d500 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
1d510 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20  SAFE_APPEND).   
1d520 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1d530 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
1d540 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1d550 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1d560 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1d570 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
1d580 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
1d590 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
1d5a0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1d5b0 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  of.  ** the data
1d5c0 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d  base image, it m
1d5d0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72  ay need to be wr
1d5e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
1d5f0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54  -journal..  ** T
1d600 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
1d610 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  he call to pager
1d620 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1d630 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  ) below will not
1d640 0a 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77  .  ** actually w
1d650 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
1d660 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
1d670 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  se..  **.  ** Co
1d680 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1d690 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
1d6a0 20 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20   events:.  **.  
1d6b0 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a  **   BEGIN;.  **
1d6c0 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
1d6d0 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c  ge X>.  **     <
1d6e0 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20  modify page X>. 
1d6f0 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
1d700 54 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20  T sp;.  **      
1d710 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
1d720 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
1d730 73 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61  s>.  **       pa
1d740 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
1d750 29 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  ).  **     ROLLB
1d760 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a  ACK TO sp;.  **.
1d770 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
1d780 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
1d790 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
1d7a0 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
1d7b0 65 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f  e written.  ** o
1d7c0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
1d7d0 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
1d7e0 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
1d7f0 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
1d800 6e 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  n,.  ** followin
1d810 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  g the "ROLLBACK 
1d820 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74  TO sp" statement
1d830 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58  , reading page X
1d840 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20   will read.  ** 
1d850 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
1d860 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
1d870 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  s will be the co
1d880 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20  py of page X as 
1d890 69 74 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  it.  ** was when
1d8a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d8b0 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
1d8c0 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
1d8d0 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a  VEPOINT sp".  **
1d8e0 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
1d8f0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c   **.  ** The sol
1d900 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74  ution is to writ
1d910 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  e the current da
1d920 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e  ta for page X in
1d930 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62  to the .  ** sub
1d940 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
1d950 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
1d960 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
1d970 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
1d980 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
1d990 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
1d9a0 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
1d9b0 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
1d9c0 69 73 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65  is .  ** execute
1d9d0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1d9e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d9f0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1da00 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52  >dbSize && subjR
1da10 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
1da20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62   ){.    rc = sub
1da30 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
1da40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
1da50 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1da60 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74  f the page out t
1da70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1da80 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  ile. */.  if( rc
1da90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1daa0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
1dab0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   0;.    rc = pag
1dac0 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1dad0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  t(pPg);.  }..  /
1dae0 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
1daf0 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
1db00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db10 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
1db20 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
1db30 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1db40 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1db50 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
1db60 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1db70 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
1db80 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1db90 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1dba0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
1dbb0 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
1dbc0 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
1dbd0 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
1dbe0 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
1dbf0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
1dc00 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
1dc10 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
1dc20 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
1dc30 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1dc40 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
1dc50 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1dc60 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1dc70 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
1dc80 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
1dc90 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
1dca0 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
1dcb0 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
1dcc0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1dcd0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
1dce0 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
1dcf0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
1dd00 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
1dd10 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
1dd20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1dd30 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
1dd40 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
1dd50 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
1dd60 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
1dd70 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
1dd80 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
1dd90 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1dda0 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
1ddb0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
1ddc0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
1ddd0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1dde0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
1ddf0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
1de00 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
1de10 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
1de20 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
1de30 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
1de40 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
1de50 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
1de60 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
1de70 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
1de80 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1de90 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
1dea0 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
1deb0 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
1dec0 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
1ded0 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
1dee0 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
1def0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
1df00 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
1df10 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
1df20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
1df30 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
1df40 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
1df50 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
1df60 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
1df70 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
1df80 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
1df90 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
1dfa0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
1dfb0 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
1dfc0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
1dfd0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
1dfe0 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
1dff0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
1e000 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
1e010 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
1e020 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
1e030 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
1e040 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
1e050 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
1e060 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
1e070 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
1e080 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
1e090 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
1e0a0 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
1e0b0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
1e0c0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
1e0d0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
1e0e0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
1e0f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e100 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
1e110 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
1e120 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
1e130 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
1e140 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
1e150 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
1e160 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
1e170 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
1e180 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1e190 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
1e1a0 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
1e1b0 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
1e1c0 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
1e1d0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
1e1e0 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
1e1f0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
1e200 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
1e210 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1e220 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1e230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
1e240 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
1e250 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
1e260 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
1e270 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
1e280 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
1e290 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1e2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e2b0 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
1e2c0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
1e2d0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2f0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
1e300 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
1e310 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
1e320 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
1e330 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e340 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
1e350 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
1e360 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
1e370 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e380 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
1e390 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
1e3a0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
1e3b0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e3c0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
1e3d0 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
1e3e0 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
1e3f0 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
1e400 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e410 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
1e420 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1e430 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
1e440 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
1e450 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
1e460 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
1e470 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
1e480 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
1e490 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
1e4a0 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
1e4b0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
1e4c0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
1e4d0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
1e4e0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
1e4f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
1e500 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
1e510 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e520 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
1e530 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
1e540 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
1e550 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
1e560 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
1e570 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
1e580 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
1e590 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
1e5a0 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
1e5b0 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
1e5c0 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
1e5d0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
1e5e0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
1e5f0 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
1e600 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
1e610 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
1e620 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
1e630 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
1e640 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1e650 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
1e660 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
1e670 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
1e680 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
1e690 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
1e6a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
1e6b0 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
1e6c0 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
1e6d0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
1e6e0 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
1e6f0 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
1e700 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
1e710 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
1e720 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
1e730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
1e740 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
1e750 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
1e760 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
1e770 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
1e780 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
1e790 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
1e7a0 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
1e7b0 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
1e7c0 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
1e7d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
1e7e0 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
1e7f0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
1e800 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1e810 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
1e820 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
1e830 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
1e840 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
1e850 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1e860 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
1e870 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
1e880 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1e890 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
1e8a0 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
1e8b0 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
1e8c0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1e8d0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
1e8e0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
1e8f0 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
1e900 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
1e910 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
1e920 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
1e930 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
1e940 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
1e950 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
1e960 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
1e970 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
1e980 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
1e990 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
1e9a0 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
1e9b0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
1e9c0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
1e9d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
1e9e0 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
1e9f0 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
1ea00 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
1ea10 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
1ea20 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
1ea30 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
1ea40 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
1ea50 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
1ea60 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
1ea70 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
1ea80 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
1ea90 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
1eaa0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1eab0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1eac0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ead0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
1eae0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
1eaf0 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
1eb00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
1eb10 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
1eb20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
1eb30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1eb40 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
1eb50 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
1eb60 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
1eb70 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
1eb80 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
1eb90 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
1eba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
1ebb0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
1ebc0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
1ebd0 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
1ebe0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
1ebf0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1ec00 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
1ec10 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
1ec20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
1ec30 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
1ec40 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
1ec50 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
1ec60 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
1ec70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
1ec80 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
1ec90 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
1eca0 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
1ecb0 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
1ecc0 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
1ecd0 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
1ece0 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
1ecf0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
1ed00 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
1ed10 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
1ed20 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
1ed30 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
1ed40 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
1ed50 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
1ed60 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
1ed70 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
1ed80 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
1ed90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
1eda0 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
1edb0 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  EN;.    }.    if
1edc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1edd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ede0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1edf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1ee00 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
1ee10 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
1ee20 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72  ry for the Pager
1ee30 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63   structure, PCac
1ee40 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20  he object, the. 
1ee50 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64   ** three file d
1ee60 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20  escriptors, the 
1ee70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
1ee80 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  me and the journ
1ee90 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61  al .  ** file na
1eea0 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69  me. The layout i
1eeb0 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66  n memory is as f
1eec0 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ollows:.  **.  *
1eed0 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65  *     Pager obje
1eee0 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1eef0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61        (sizeof(Pa
1ef00 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a  ger) bytes).  **
1ef10 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65       PCache obje
1ef20 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ct              
1ef30 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61       (sqlite3Pca
1ef40 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29  cheSize() bytes)
1ef50 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1ef60 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  se file handle  
1ef70 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d            (pVfs-
1ef80 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29  >szOsFile bytes)
1ef90 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f  .  **     Sub-jo
1efa0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1efb0 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  e         (journ
1efc0 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
1efd0 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20  ).  **     Main 
1efe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1eff0 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72  dle        (jour
1f000 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
1f010 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
1f020 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20  base file name  
1f030 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
1f040 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a  thname+1 bytes).
1f050 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c    **     Journal
1f060 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1f070 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
1f080 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20  ame+8+1 bytes). 
1f090 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38   */.  pPtr = (u8
1f0a0 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
1f0b0 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38  Zero(.    ROUND8
1f0c0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1f0d0 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65  ) +      /* Page
1f0e0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
1f0f0 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65     ROUND8(pcache
1f100 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20  Size) +         
1f110 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65    /* PCache obje
1f120 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38  ct */.    ROUND8
1f130 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29  (pVfs->szOsFile)
1f140 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
1f150 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a  main db file */.
1f160 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1f170 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20  ize * 2 +       
1f180 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
1f190 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
1f1a0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1f1b0 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
1f1c0 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
1f1d0 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  */.    nPathname
1f1e0 20 2b 20 38 20 2b 20 31 20 20 20 20 20 20 20 20   + 8 + 1        
1f1f0 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
1f200 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65  l */.  );.  asse
1f210 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1f220 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
1f230 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
1f240 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
1f250 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
1f260 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f270 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1f280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f290 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
1f2a0 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
1f2b0 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
1f2c0 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
1f2d0 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
1f2e0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f2f0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1f300 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
1f310 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
1f320 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f330 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
1f340 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
1f350 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
1f360 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f370 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
1f380 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
1f390 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
1f3a0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
1f3b0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f3c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f3d0 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
1f3e0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
1f3f0 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
1f400 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1f410 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
1f420 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
1f430 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
1f440 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
1f450 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
1f460 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
1f470 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
1f480 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50  thname ){.    pP
1f490 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
1f4a0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
1f4b0 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
1f4c0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
1f4d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f4e0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f4f0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f500 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
1f510 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
1f520 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
1f530 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1f540 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
1f550 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
1f560 20 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   8);.    sqlite3
1f570 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1f580 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1f590 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
1f5a0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
1f5b0 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
1f5c0 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
1f5d0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1f5e0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
1f5f0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
1f600 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
1f610 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
1f620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f630 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
1f640 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
1f650 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1f660 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
1f670 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f680 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
1f690 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
1f6a0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1f6b0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1f6c0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
1f6d0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1f6e0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1f6f0 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
1f700 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
1f710 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
1f720 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1f730 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
1f740 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
1f750 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1f760 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
1f770 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
1f780 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
1f790 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
1f7a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1f7b0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
1f7c0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
1f7d0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1f7e0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1f7f0 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
1f800 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
1f810 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
1f820 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
1f830 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
1f840 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f850 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
1f860 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
1f870 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1f880 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f890 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1f8a0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
1f8b0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f8c0 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
1f8d0 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
1f8e0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
1f8f0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1f900 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
1f910 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f920 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
1f930 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1f940 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
1f950 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f960 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
1f970 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
1f980 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
1f990 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1f9a0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1f9b0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1f9c0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1f9d0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
1f9e0 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
1f9f0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1fa00 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1fa10 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1fa20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1fa30 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1fa40 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1fa50 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
1fa60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1fa70 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fa80 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
1fa90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1faa0 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
1fab0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1fac0 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
1fad0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
1fae0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
1faf0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1fb00 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
1fb10 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
1fb20 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
1fb30 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
1fb40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
1fb50 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
1fb60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fb70 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
1fb80 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
1fb90 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
1fba0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1fbb0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
1fbc0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
1fbd0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
1fbe0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
1fbf0 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
1fc00 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
1fc10 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
1fc20 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
1fc30 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
1fc40 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
1fc50 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
1fc60 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
1fc70 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
1fc80 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
1fc90 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
1fca0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
1fcb0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
1fcc0 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
1fcd0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
1fce0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
1fcf0 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
1fd00 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
1fd10 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
1fd20 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
1fd30 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
1fd40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1fd50 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1fd60 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  IVE;.  }..  /* T
1fd70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
1fd80 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
1fd90 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
1fda0 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
1fdb0 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
1fdc0 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
1fdd0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
1fde0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
1fdf0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
1fe00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fe10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1fe20 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
1fe30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fe40 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1fe50 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
1fe60 44 66 6c 74 29 3b 0a 20 20 20 20 74 65 73 74 63  Dflt);.    testc
1fe70 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1fe80 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
1fe90 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1fea0 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
1feb0 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
1fec0 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
1fed0 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
1fee0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
1fef0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1ff00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1ff20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1ff30 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
1ff40 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1ff50 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
1ff60 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
1ff70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ff80 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
1ff90 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
1ffa0 6a 65 63 74 2e 20 2a 2f 0a 20 20 6e 45 78 74 72  ject. */.  nExtr
1ffb0 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
1ffc0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  a);.  sqlite3Pca
1ffd0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
1ffe0 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
1fff0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
20000 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
20010 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
20020 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
20030 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20040 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
20050 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
20060 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
20070 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
20080 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
20090 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
200a0 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
200b0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
200c0 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
200d0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
200e0 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
200f0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
20100 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
20110 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
20120 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
20130 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
20140 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20150 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
20160 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
20170 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
20180 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
20190 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f  = (u8)memDb;.  /
201a0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
201b0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
201c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
201d0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
201e0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
201f0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
20200 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
20210 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
20220 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
20230 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
20240 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
20250 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
20260 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
20270 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
20280 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20  GER_UNLOCK) );. 
20290 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
202a0 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
202b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
202c0 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
202d0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
202e0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
202f0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
20300 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
20310 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
20320 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
20330 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
20340 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
20350 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
20360 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
20370 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
20380 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
20390 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
203a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
203b0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
203c0 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
203d0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
203e0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
203f0 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
20400 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
20410 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
20420 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
20430 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
20440 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20  Journal) ?1:0;. 
20450 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
20460 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  c = pPager->noSy
20470 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65  nc ?0:1;.  pPage
20480 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
20490 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
204a0 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
204b0 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
204c0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
204d0 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
204e0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
204f0 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
20500 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
20510 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
20520 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
20530 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
20540 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
20550 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
20560 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20570 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
20580 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
20590 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
205a0 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
205b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
205c0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
205d0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
205e0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
205f0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
20600 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20610 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
20620 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  rg = 0; */.  /* 
20630 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
20640 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
20650 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
20660 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
20670 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
20680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20690 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
206a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
206b0 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
206c0 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
206d0 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
206e0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
206f0 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
20700 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
20710 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
20720 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
20730 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
20740 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
20750 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
20760 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
20770 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
20780 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
20790 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
207a0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
207b0 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
207c0 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
207d0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
207e0 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
207f0 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
20800 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
20810 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
20820 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
20830 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
20840 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20850 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
20860 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
20870 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
20880 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
20890 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
208a0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
208b0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
208c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
208d0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
208e0 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
208f0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
20900 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20910 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
20920 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
20930 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
20940 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
20950 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
20960 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
20970 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
20980 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
20990 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
209a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
209b0 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
209c0 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
209d0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
209e0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
209f0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
20a00 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
20a10 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
20a20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
20a30 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
20a40 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
20a50 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
20a60 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
20a70 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
20a80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20a90 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
20aa0 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
20ab0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
20ac0 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
20ad0 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
20ae0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
20af0 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
20b00 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
20b10 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
20b20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
20b30 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
20b40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
20b50 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
20b60 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
20b70 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
20b80 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
20b90 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
20ba0 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
20bb0 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
20bc0 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
20bd0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
20be0 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
20bf0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
20c00 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
20c10 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
20c20 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
20c30 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
20c40 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
20c50 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
20c60 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
20c70 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
20c80 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
20c90 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
20ca0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
20cb0 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
20cc0 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
20cd0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
20ce0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
20cf0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
20d00 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
20d10 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
20d20 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
20d30 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
20d40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
20d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20d60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
20d70 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20 20 20  int exists;     
20d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d90 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
20da0 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
20db0 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
20dc0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
20dd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20de0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
20df0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
20e00 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
20e10 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
20e20 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
20e30 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
20e40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20e50 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
20e60 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20e70 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20e80 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
20e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20ea0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
20eb0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
20ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ed0 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
20ee0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
20ef0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
20f00 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
20f10 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
20f20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
20f30 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
20f40 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
20f50 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
20f60 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
20f70 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
20f80 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
20f90 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
20fa0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
20fb0 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
20fc0 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
20fd0 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
20fe0 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
20ff0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
21000 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
21010 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
21020 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
21030 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
21040 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
21050 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
21060 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
21070 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
21080 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
21090 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
210a0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
210b0 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
210c0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
210d0 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
210e0 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
210f0 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
21100 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
21110 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
21120 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
21130 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
21140 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21150 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
21160 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
21170 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
21180 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21190 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
211a0 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
211b0 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
211c0 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
211d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
211e0 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
211f0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
21200 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
21210 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
21220 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73    Delete the obs
21230 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
21240 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a  le under.      *
21250 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * a RESERVED loc
21260 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20  k to avoid race 
21270 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
21280 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e  o avoid violatin
21290 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30  g.      ** [H330
212a0 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  20]..      */.  
212b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
212c0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
212d0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
212e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
212f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21300 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
21310 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21320 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
21330 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
21340 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
21350 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
21360 52 56 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  RVED.           
21370 20 20 20 20 20 20 7c 7c 20 20 73 71 6c 69 74 65        ||  sqlite
21380 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
21390 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
213a0 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
213b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
213c0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
213d0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
213e0 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
213f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
21400 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
21410 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
21420 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
21430 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
21440 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
21450 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21460 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
21470 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
21480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
21490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
214a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
214b0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
214c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
214d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
214e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
214f0 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
21500 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
21510 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
21520 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
21530 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
21540 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
21550 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
21560 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
21570 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
21580 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
21590 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
215a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
215b0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
215c0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
215d0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
215e0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
215f0 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
21600 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
21610 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
21620 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21630 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
21640 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
21650 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
21660 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
21670 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21680 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
21690 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
216a0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
216b0 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
216c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
216d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
216e0 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
216f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21700 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
21710 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
21720 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
21730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
21750 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
21760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
21770 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21780 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21790 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
217a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
217b0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
217c0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
217d0 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
217e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
217f0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
21800 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21810 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
21820 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
21830 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
21840 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
21850 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
21860 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
21870 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
21880 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
21890 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
218a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
218b0 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
218c0 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
218d0 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
218e0 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
218f0 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
21900 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
21910 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
21920 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
21930 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
21940 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
21950 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
21960 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
21970 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
21980 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
21990 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
219a0 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
219b0 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
219c0 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
219d0 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
219e0 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
219f0 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
21a00 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
21a10 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
21a20 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
21a30 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
21a40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21a50 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
21a60 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
21a70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21a80 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
21a90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21aa0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21ac0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
21ad0 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
21ae0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
21af0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
21b00 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
21b10 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
21b20 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
21b30 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
21b40 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
21b50 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
21b60 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21b70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
21b80 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
21b90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
21ba0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
21bb0 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
21bc0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
21bd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21be0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
21bf0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
21c00 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
21c10 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
21c20 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
21c30 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
21c40 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21c50 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21c60 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
21c70 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
21c80 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21c90 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
21ca0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
21cb0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
21cc0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
21cd0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
21ce0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
21cf0 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
21d00 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
21d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21d20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
21d30 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20  i64 iOffset;    
21d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d50 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66  Byte offset of f
21d60 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
21d70 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21d80 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21d90 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
21da0 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21  EMDB );..  if( !
21db0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
21dc0 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
21dd0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
21de0 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  le );.    memset
21df0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
21e00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21e10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
21e20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
21e30 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
21e40 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
21e50 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
21e60 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
21e70 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
21e80 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
21e90 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29  geSize, iOffset)
21ea0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
21eb0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
21ec0 45 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  EAD ){.    rc = 
21ed0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21ee0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
21ef0 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
21f00 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
21f10 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
21f20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
21f30 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
21f40 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
21f50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
21f60 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45  rs));.  }.  CODE
21f70 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
21f80 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 29 3b  pData, pgno, 3);
21f90 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
21fa0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
21fb0 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
21fc0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
21fd0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
21fe0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
21ff0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
22000 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
22010 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
22020 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
22030 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22040 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
22050 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
22060 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
22070 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22080 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
22090 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
220a0 68 65 6e 65 76 65 72 20 74 68 65 20 75 70 70 65  henever the uppe
220b0 72 20 6c 61 79 65 72 20 72 65 71 75 65 73 74 73  r layer requests
220c0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70   a database.** p
220d0 61 67 65 20 69 73 20 72 65 71 75 65 73 74 65 64  age is requested
220e0 2c 20 62 65 66 6f 72 65 20 74 68 65 20 63 61 63  , before the cac
220f0 68 65 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  he is checked fo
22100 72 20 61 20 73 75 69 74 61 62 6c 65 20 70 61 67  r a suitable pag
22110 65 0a 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74 61  e.** or any data
22120 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
22130 65 20 64 61 74 61 62 61 73 65 2e 20 49 74 20 70  e database. It p
22140 65 72 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c  erforms the foll
22150 6f 77 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e  owing.** two fun
22160 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ctions:.**.**   
22170 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
22180 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
22190 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61  PAGER_UNLOCK sta
221a0 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64  te (no lock held
221b0 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
221c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
221d0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
221e0 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69  is made to obtai
221f0 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52  n a.**      SHAR
22200 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
22210 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d  atabase file. Im
22220 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
22230 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20  obtaining.**    
22240 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63    the SHARED loc
22250 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  k, the file-syst
22260 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f  em is checked fo
22270 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  r a hot-journal,
22280 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20 69  .**      which i
22290 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66  s played back if
222a0 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77   present. Follow
222b0 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72  ing any hot-jour
222c0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c  nal .**      rol
222d0 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65  lback, the conte
222e0 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68 65  nts of the cache
222f0 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20 62   are validated b
22300 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20  y checking.**   
22310 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63     the 'change-c
22320 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66  ounter' field of
22330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22340 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a  le header and.**
22350 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64 20        discarded 
22360 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e  if they are foun
22370 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e  d to be invalid.
22380 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74  .**.**   2) If t
22390 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
223a0 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
223b0 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65  -mode, and there
223c0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a   are currently.*
223d0 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61  *      no outsta
223e0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
223f0 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61   to any pages, a
22400 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  nd is in the err
22410 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20  or state,.**    
22420 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70    then an attemp
22430 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65  t is made to cle
22440 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
22450 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e 67  te by discarding
22460 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e  .**      the con
22470 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
22480 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c  e cache and roll
22490 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65  ing back any ope
224a0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
224b0 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66    file..**.** If
224c0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64   the operation d
224d0 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29 20  escribed by (2) 
224e0 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74  above is not att
224f0 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74  empted, and if t
22500 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69  he.** pager is i
22510 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
22520 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
22530 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69  TE_FULL when thi
22540 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  s is called,.** 
22550 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
22560 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
22570 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65  turned. It is pe
22580 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64 20  rmitted to read 
22590 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
225a0 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46  when in SQLITE_F
225b0 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e  ULL error state.
225c0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
225d0 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  , if everything 
225e0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
225f0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
22600 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49  rned. If an.** I
22610 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
22620 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
22630 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
22640 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
22650 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72  urnal.** file or
22660 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
22670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
22680 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
22690 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
226a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
226b0 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
226c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
226d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
22700 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  /.  int isErrorR
22710 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  eset = 0;       
22720 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
22730 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f  f recovering fro
22740 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f  m error state */
22750 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64  ..  /* If this d
22760 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
22770 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  d for exclusive 
22780 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f  access, has no o
22790 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
227a0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
227b0 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72   and is in an er
227c0 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 69 73 20  ror-state, this 
227d0 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63  is a chance to c
227e0 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72  lear.  ** the er
227f0 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65  ror. Discard the
22800 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
22810 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
22820 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20   treat any.  ** 
22830 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
22840 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e as a hot-journ
22850 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  al..  */.  if( !
22860 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
22870 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
22880 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
22890 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
228a0 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
228b0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
228c0 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  de .  ){.    if(
228d0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
228e0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 73  jfd) ){.      is
228f0 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
22900 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
22910 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
22920 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
22930 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
22940 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
22950 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20   pager is still 
22960 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
22970 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65  e, do not procee
22980 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20  d. The error .  
22990 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65  ** state will be
229a0 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65   cleared at some
229b0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
229c0 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61  ture when all pa
229d0 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  ge .  ** referen
229e0 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20  ces are dropped 
229f0 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61  and the cache ca
22a00 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  n be discarded..
22a10 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
22a20 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
22a30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
22a40 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
22a50 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
22a60 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
22a70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
22a80 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
22a90 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74   || isErrorReset
22aa0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
22ab0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
22ac0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
22ad0 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f  .    int isHotJo
22ae0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61  urnal = 0;.    a
22af0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
22b00 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
22b10 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
22b20 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
22b30 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  he)==0 );.    if
22b40 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
22b50 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  dlock ){.      r
22b60 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
22b70 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
22b80 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
22b90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22ba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22bb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22bc0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
22bd0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  OCK );.        r
22be0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
22bf0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
22c00 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22c10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
22c20 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
22c30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
22c40 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
22c50 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
22c60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22c70 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
22c80 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  LOCK );..    /* 
22c90 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
22ca0 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
22cb0 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
22cc0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
22cd0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
22ce0 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
22cf0 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
22d00 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
22d10 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
22d20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52     if( !isErrorR
22d30 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63  eset ){.      rc
22d40 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
22d50 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a  (pPager, &isHotJ
22d60 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
22d70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22d80 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
22d90 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
22da0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
22db0 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69  sErrorReset || i
22dc0 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sHotJournal ){. 
22dd0 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
22de0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
22df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22e00 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
22e10 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
22e20 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
22e30 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
22e40 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
22e50 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
22e60 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
22e70 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
22e80 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
22e90 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
22ea0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
22eb0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
22ec0 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
22ed0 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
22ee0 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
22ef0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
22f00 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
22f10 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
22f20 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
22f30 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a  ing the .      *
22f40 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61  * hot-journal ba
22f50 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
22f60 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
22f70 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
22f80 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
22f90 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
22fa0 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  any.      ** oth
22fb0 65 72 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d  er process attem
22fc0 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  pting to access 
22fd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22fe0 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20  e will get to . 
22ff0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69       ** this poi
23000 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
23010 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69  nd fail to obtai
23020 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53  n its own EXCLUS
23030 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20  IVE lock .      
23040 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
23050 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a  se file..      *
23060 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
23070 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53  er->state<EXCLUS
23080 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
23090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
230a0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
230b0 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
230c0 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
230d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
230e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
230f0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
23100 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
23110 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
23120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23130 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
23140 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
23150 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20  E;.      }. .   
23160 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
23170 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
23180 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68  write access. Th
23190 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e  is is because in
231a0 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75   .      ** exclu
231b0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
231c0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
231d0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
231e0 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
231f0 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
23200 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
23210 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
23220 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
23230 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  he.      ** OsTr
23240 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
23250 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
23260 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
23270 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
23280 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
23290 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
232a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
232b0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
232c0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
232d0 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20  int res;.       
232e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
232f0 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65  ccess(pVfs,pPage
23300 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49  r->zJournal,SQLI
23310 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
23320 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20  ,&res);.        
23330 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23340 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
23350 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
23360 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d        int fout =
23370 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23380 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
23390 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
233a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
233b0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
233c0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
233d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
233e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
233f0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
23400 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
23410 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
23420 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
23430 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
23440 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
23450 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  K || isOpen(pPag
23460 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
23470 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23480 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75  SQLITE_OK && fou
23490 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
234a0 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  ADONLY ){.      
234b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
234c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
234d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
234e0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
234f0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
23500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23520 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f      /* If the jo
23530 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65  urnal does not e
23540 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  xist, that means
23550 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
23560 65 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ess.            
23570 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  ** has already r
23580 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f  olled it back */
23590 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
235a0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
235b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
235c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
235d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
235e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
235f0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
23600 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
23610 4f 44 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65  ODO: Why are the
23620 73 65 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f  se cleared here?
23630 20 49 73 20 69 74 20 6e 65 63 65 73 73 61 72 79   Is it necessary
23640 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  ? */.      pPage
23650 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
23660 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
23670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
23680 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
23690 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
236a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
236b0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
236c0 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
236d0 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
236e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
236f0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
23700 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
23710 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
23720 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
23730 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
23740 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
23750 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
23760 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
23770 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
23780 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
23790 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
237a0 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  nt cache..      
237b0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
237c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
237d0 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ger, 1);.      i
237e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
237f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23800 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
23810 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
23820 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
23830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
23840 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74  ert( (pPager->st
23850 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
23860 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D).           ||
23870 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   (pPager->exclus
23880 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65  iveMode && pPage
23890 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53  r->state>PAGER_S
238a0 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a  HARED).      );.
238b0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
238c0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 7c  Pager->pBackup |
238d0 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  | sqlite3PcacheP
238e0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
238f0 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
23900 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
23910 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
23920 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
23930 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
23940 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
23950 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
23960 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
23970 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
23980 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
23990 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
239a0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
239b0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
239c0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
239d0 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
239e0 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
239f0 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
23a00 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
23a10 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
23a20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
23a30 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
23a40 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
23a50 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
23a60 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
23a70 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
23a80 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
23a90 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
23aa0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
23ab0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
23ac0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
23ad0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
23ae0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
23af0 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
23b00 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
23b10 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
23b20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
23b30 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
23b40 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
23b50 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
23b60 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
23b70 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
23b80 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
23b90 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
23ba0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
23bb0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
23bc0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
23bd0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
23be0 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
23bf0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
23c00 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
23c10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
23c20 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
23c30 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
23c40 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
23c50 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
23c60 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
23c70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
23c80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
23c90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
23ca0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
23cb0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
23cc0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
23cd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23ce0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
23cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
23d00 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
23d10 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
23d20 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
23d30 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
23d40 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
23d50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
23d60 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
23d70 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
23d80 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
23d90 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
23da0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23db0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23dc0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
23dd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23df0 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
23e00 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
23e10 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
23e20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
23e30 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
23e40 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
23e50 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
23e60 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
23e70 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
23e80 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
23e90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
23ea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
23eb0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
23ec0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
23ed0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
23ee0 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
23ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23f00 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
23f10 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  _unlock() is a n
23f20 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69  o-op for exclusi
23f30 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d  ve mode and in-m
23f40 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
23f50 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   */.    pager_un
23f60 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
23f70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23f80 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
23f90 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
23fa0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
23fb0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
23fc0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
23fd0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
23fe0 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
23ff0 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
24000 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
24010 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
24020 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
24030 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
24040 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
24050 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
24060 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
24070 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
24080 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
24090 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
240a0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
240b0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
240c0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
240d0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 28 73  Pager){.  if( (s
240e0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
240f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
24100 61 63 68 65 29 3d 3d 30 29 0a 20 20 20 26 26 20  ache)==0).   && 
24110 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  (!pPager->exclus
24120 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
24130 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29  r->journalOff>0)
24140 20 0a 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72   .  ){.    pager
24150 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63  UnlockAndRollbac
24160 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  k(pPager);.  }.}
24170 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70  ../*.** Drop a p
24180 61 67 65 20 66 72 6f 6d 20 74 68 65 20 63 61 63  age from the cac
24190 68 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  he using sqlite3
241a0 50 63 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a  PcacheDrop()..**
241b0 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d 65 61 6e  .** If this mean
241c0 73 20 74 68 65 72 65 20 61 72 65 20 6e 6f 77 20  s there are now 
241d0 6e 6f 20 70 61 67 65 73 20 77 69 74 68 20 72 65  no pages with re
241e0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 6d  ferences to them
241f0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  , a rollback.** 
24200 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
24210 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
24220 61 73 65 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a  ase is removed..
24230 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
24240 61 67 65 72 44 72 6f 70 50 61 67 65 28 44 62 50  agerDropPage(DbP
24250 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
24260 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
24270 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69  ->pPager;.  sqli
24280 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
24290 67 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63  g);.  pagerUnloc
242a0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
242b0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  );.}../*.** Acqu
242c0 69 72 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ire a reference 
242d0 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70  to page number p
242e0 67 6e 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61  gno in pager pPa
242f0 67 65 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72  ger (a page.** r
24300 65 66 65 72 65 6e 63 65 20 68 61 73 20 74 79 70  eference has typ
24310 65 20 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74  e DbPage*). If t
24320 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 66  he requested ref
24330 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75  erence is .** su
24340 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69  ccessfully obtai
24350 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65  ned, it is copie
24360 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64  d to *ppPage and
24370 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24380 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ned..**.** This 
24390 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 70  function calls p
243a0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
243b0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41   to obtain a SHA
243c0 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a 2a 2a 20 74  RED lock on.** t
243d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
243e0 20 69 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   if such a lock 
243f0 6f 72 20 67 72 65 61 74 65 72 20 69 73 20 6e 6f  or greater is no
24400 74 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  t already held..
24410 2a 2a 20 54 68 69 73 20 6d 61 79 20 63 61 75 73  ** This may caus
24420 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  e hot-journal ro
24430 6c 6c 62 61 63 6b 20 6f 72 20 61 20 63 61 63 68  llback or a cach
24440 65 20 70 75 72 67 65 2e 20 53 65 65 20 63 6f 6d  e purge. See com
24450 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f 76 65 20 66  ments.** above f
24460 75 6e 63 74 69 6f 6e 20 70 61 67 65 72 53 68 61  unction pagerSha
24470 72 65 64 4c 6f 63 6b 28 29 20 66 6f 72 20 64 65  redLock() for de
24480 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tails..**.** If 
24490 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
244a0 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ge is already in
244b0 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20 69   the cache, it i
244c0 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
244d0 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65 77  Otherwise, a new
244e0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20   page object is 
244f0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70 6f  allocated and po
24500 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61 74  pulated with dat
24510 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20 74  a.** read from t
24520 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24530 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 2c  . In some cases,
24540 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75   the pcache modu
24550 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73 65  le may.** choose
24560 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65   not to allocate
24570 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65   a new page obje
24580 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73 65  ct and may reuse
24590 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a 20   an existing.** 
245a0 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20 6f  object with no o
245b0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
245c0 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ences..**.** The
245d0 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
245e0 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
245f0 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
24600 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74 68  ized to zeros th
24610 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d 65  e .** first time
24620 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
24630 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 49  d into memory. I
24640 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75 65  f the page reque
24650 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72 65  sted is .** alre
24660 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65  ady in the cache
24670 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
24680 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
24690 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a 2a  hen the extra.**
246a0 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61 73   data is left as
246b0 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68 65   it was when the
246c0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61 73   page object was
246d0 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a   last used..**.*
246e0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
246f0 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c 6c  e image is small
24700 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
24710 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69 66  ested page or if
24720 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20   a .** non-zero 
24730 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20  value is passed 
24740 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  as the noContent
24750 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20 74   parameter and t
24760 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
24770 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
24780 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20 74  eady stored in t
24790 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20 6e  he cache, then n
247a0 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69 73  o .** actual dis
247b0 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20 49  k read occurs. I
247c0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
247d0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
247e0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73 20  the .** page is 
247f0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
24800 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a  ll zeros. .**.**
24810 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73   If noContent is
24820 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
24830 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
24840 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f  are about the co
24850 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65  ntents.** of the
24860 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75   page. This occu
24870 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72 61  rs in two sepera
24880 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  te scenarios:.**
24890 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72 65  .**   a) When re
248a0 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69 73  ading a free-lis
248b0 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  t leaf page from
248c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 61   the database, a
248d0 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68  nd.**.**   b) Wh
248e0 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69  en a savepoint i
248f0 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
24900 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64 20  ack and we need 
24910 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20  to load.**      
24920 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f 20  a new page into 
24930 74 68 65 20 63 61 63 68 65 20 74 6f 20 70 6f 70  the cache to pop
24940 75 6c 61 74 65 20 77 69 74 68 20 74 68 65 20 64  ulate with the d
24950 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20  ata read.**     
24960 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f   from the savepo
24970 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  int journal..**.
24980 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
24990 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
249a0 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
249b0 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
249c0 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72 65  d of.** being re
249d0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
249e0 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
249f0 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
24a00 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
24a10 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
24a20 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
24a30 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
24a40 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
24a50 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
24a60 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
24a70 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
24a80 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
24a90 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
24aa0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
24ab0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
24ac0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
24ad0 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
24ae0 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
24af0 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
24b00 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
24b10 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
24b20 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
24b30 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
24b40 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
24b50 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
24b60 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
24b70 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
24b80 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
24b90 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
24ba0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
24bb0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
24bc0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
24bd0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
24be0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
24bf0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
24c00 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
24c10 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
24c20 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
24c30 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
24c40 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
24c50 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
24c60 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
24c70 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
24c80 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
24c90 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
24ca0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
24cb0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
24cc0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
24cd0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
24ce0 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
24cf0 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
24d00 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
24d10 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
24d20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
24d30 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
24d40 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
24d50 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
24d60 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
24d70 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
24d80 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
24d90 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
24da0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
24db0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
24dc0 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
24dd0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
24de0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
24df0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
24e00 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
24e10 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
24e20 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
24e30 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
24e40 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
24e50 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
24e60 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
24e70 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
24e80 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
24e90 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
24ea0 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
24eb0 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
24ec0 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  /.){.  PgHdr *pP
24ed0 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  g = 0;.  int rc;
24ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ..  assert( asse
24ef0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
24f00 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
24f10 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
24f20 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
24f30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
24f40 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
24f50 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24f60 29 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  )>0 .       || p
24f70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f  gno==1.  );..  /
24f80 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
24f90 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
24fa0 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
24fb0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
24fc0 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
24fd0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
24fe0 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
24ff0 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
25000 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
25010 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
25020 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
25030 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
25040 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25050 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
25060 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  KPT;.  }..  /* M
25070 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
25080 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69   not hit any cri
25090 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20  tical errors..  
250a0 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50  */ .  assert( pP
250b0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70  ager!=0 );.  *pp
250c0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Page = 0;..  /* 
250d0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
250e0 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
250f0 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
25100 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
25110 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
25120 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
25130 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
25140 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
25150 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
25160 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
25170 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
25180 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
25190 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
251a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
251b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
251c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
251d0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
251e0 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  K );..  rc = sql
251f0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
25200 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
25210 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b   pgno, 1, &pPg);
25220 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
25240 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
25250 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
25260 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
25270 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
25280 50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50  Pager || pPg->pP
25290 61 67 65 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  ager==0 );.  if(
252a0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
252b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
252c0 67 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72  ger cache has cr
252d0 65 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65  eated a new page
252e0 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65  . Its content ne
252f0 65 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62  eds to .    ** b
25300 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
25310 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d     */.    int nM
25320 61 78 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  ax;.    PAGER_IN
25330 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
25340 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
25350 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
25360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25370 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
25380 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20 20 20  ger, &nMax);.   
25390 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
253a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
253b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
253c0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
253d0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
253e0 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67  if( nMax<(int)pg
253f0 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 6e  no || MEMDB || n
25400 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
25410 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
25420 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
25430 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
25440 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
25450 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25460 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_FULL;.      }
25470 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e  .      if( noCon
25480 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tent ){.        
25490 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65  /* Failure to se
254a0 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68  t the bits in th
254b0 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d  e InJournal bit-
254c0 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67  vectors is benig
254d0 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74  n..        ** It
254e0 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
254f0 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
25500 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
25510 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20  o journal a .   
25520 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61       ** page tha
25530 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
25540 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e  to be journaled.
25550 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20    Nevertheless, 
25560 62 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20  be sure .       
25570 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20   ** to test the 
25580 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
25590 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
255a0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
255b0 20 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a   set .        **
255c0 20 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20   a bit in a bit 
255d0 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20  vector..        
255e0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
255f0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
25600 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69  loc();.        i
25610 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  f( pgno<=pPager-
25620 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
25630 20 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c           TESTONL
25640 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
25650 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
25660 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
25670 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gno);.          
25680 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
25690 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
256a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
256b0 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
256c0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
256d0 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
256e0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
256f0 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
25700 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
25710 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
25720 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
25730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25740 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
25750 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
25760 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
25770 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41 43    }.      IOTRAC
25780 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
25790 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
257a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
257b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
257c0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
257d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  );.      rc = re
257e0 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
257f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
25800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25810 20 20 70 61 67 65 72 44 72 6f 70 50 61 67 65 28    pagerDropPage(
25820 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
25830 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
25840 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
25850 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
25860 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
25870 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
25880 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
25890 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
258a0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
258b0 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
258c0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
258d0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
258e0 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 7d 0a 0a  er->nHit);.  }..
258f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
25900 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25910 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
25920 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
25930 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
25940 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
25950 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
25960 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
25970 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
25980 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
25990 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
259a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
259b0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c  not in cache. Al
259c0 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20  so, return 0 if 
259d0 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73  the .** pager is
259e0 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
259f0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
25a00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25a10 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  led,.** or if th
25a20 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
25a30 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
25a40 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
25a50 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
25a60 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
25a70 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
25a80 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
25a90 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
25aa0 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
25ab0 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
25ac0 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
25ad0 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
25ae0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
25af0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
25b00 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
25b10 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
25b20 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
25b30 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
25b40 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
25b50 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
25b60 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
25b70 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
25b80 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
25b90 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
25ba0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
25bb0 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
25bc0 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
25bd0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
25be0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
25bf0 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 67   );..  if( (pPag
25c00 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
25c10 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28  _UNLOCK).   && (
25c20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
25c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
25c40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
25c50 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b  QLITE_FULL).  ){
25c60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
25c70 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
25c80 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
25c90 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  , &pPg);.  }..  
25ca0 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
25cb0 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
25cc0 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
25cd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
25ce0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
25cf0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
25d00 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
25d10 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
25d20 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
25d30 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
25d40 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
25d50 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
25d60 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
25d70 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
25d80 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
25d90 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
25da0 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
25db0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25dc0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
25dd0 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
25de0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
25df0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
25e00 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
25e10 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
25e20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
25e30 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
25e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
25e50 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
25e60 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  le has already b
25e70 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75  een opened, ensu
25e80 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73  re that the.** s
25e90 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
25ea0 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20  is open too. If 
25eb0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
25ec0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a   is not open,.**
25ed0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25ee0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
25ef0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
25f00 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
25f10 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
25f20 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a  ing to plan. .**
25f30 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   An SQLITE_IOERR
25f40 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
25f50 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
25f60 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
25f70 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61 69  ite3OsOpen() fai
25f80 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
25f90 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
25fa0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
25fb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25fc0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73 4f  TE_OK;.  if( isO
25fd0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25fe0 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
25ff0 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
26000 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
26010 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
26020 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
26030 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
26040 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
26050 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
26060 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
26070 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  ->sjfd);.    }el
26080 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
26090 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
260a0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
260b0 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
260c0 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
260d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
260e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
260f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26100 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
26110 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
26120 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
26130 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
26140 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
26150 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
26160 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
26170 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
26180 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
26190 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
261a0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
261b0 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
261c0 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
261d0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
261e0 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
261f0 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
26200 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
26210 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
26220 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
26230 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
26240 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
26250 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
26260 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
26270 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
26280 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
26290 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
262a0 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
262b0 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
262c0 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
262d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
262e0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
262f0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
26300 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
26310 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
26320 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
26330 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
26340 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
26350 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
26360 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
26370 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
26380 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
26390 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
263a0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
263b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
263c0 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
263d0 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
263e0 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
263f0 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
26400 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
26410 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
26420 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
26430 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
26440 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
26450 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
26460 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
26470 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
26480 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
26490 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
264a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
264b0 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
264c0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
264d0 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
264e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
264f0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
26500 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26540 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
26550 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
26560 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
26570 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
26580 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
26590 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
265a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
265b0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
265c0 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
265d0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
265e0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
265f0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
26600 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
26610 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
26620 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
26630 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
26640 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  n is a no-op. */
26650 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
26660 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
26670 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
26680 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
26690 54 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61 6c  TODO: Is it real
266a0 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 67  ly possible to g
266b0 65 74 20 68 65 72 65 20 77 69 74 68 20 64 62 53  et here with dbS
266c0 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20  izeValid==0? If 
266d0 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61  not,.  ** the ca
266e0 6c 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65 63  ll to PagerPagec
266f0 6f 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72 65  ount() can be re
26700 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65  moved..  */.  te
26710 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
26720 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
26730 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
26740 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
26750 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d  , 0);..  pPager-
26760 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
26770 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
26780 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
26790 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
267a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
267b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
267c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
267d0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
267e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
267f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
26800 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21  open. */.  if( !
26810 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26820 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
26830 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
26840 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
26850 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
26860 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
26870 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
26880 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
26890 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
268a0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
268c0 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
268d0 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
268e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
268f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
26900 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
26910 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70  EATE|.        (p
26920 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
26930 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ? .          (SQ
26940 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
26950 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
26960 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
26970 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ):.          (SQ
26980 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
26990 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
269a0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
269b0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
269c0 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20  RITE.      rc = 
269d0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
269e0 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56  en(.          pV
269f0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
26a00 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
26a10 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
26a20 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
26a30 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  .      );.#else.
26a40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26a50 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
26a60 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
26a70 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
26a80 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
26a90 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26ab0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
26ac0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a  ->jfd) );.  }...
26ad0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
26ae0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
26af0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
26b00 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
26b10 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a   .  ** the sub-j
26b20 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
26b30 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
26b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26b50 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68  .    /* TODO: Ch
26b60 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
26b70 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
26b80 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
26b90 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
26ba0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
26bb0 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
26bc0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
26bd0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
26be0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
26bf0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
26c00 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
26c10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
26c20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74  .    pPager->set
26c30 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
26c40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
26c50 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  dr = 0;.    rc =
26c60 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
26c70 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
26c80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26c90 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  K && pPager->nSa
26ca0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72  vepoint ){.    r
26cb0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
26cc0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
26cd0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
26ce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
26cf0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
26d00 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
26d10 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
26d20 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
26d30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26d40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
26d50 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
26d60 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
26d70 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
26d80 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
26d90 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
26da0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
26db0 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
26dc0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
26dd0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
26de0 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
26df0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
26e00 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
26e10 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
26e20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
26e30 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
26e40 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
26e50 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
26e60 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
26e70 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
26e80 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
26e90 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
26ea0 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
26eb0 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
26ec0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
26ed0 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
26ee0 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  y or in-memory f
26ef0 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75  ile and, the jou
26f00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a  rnal file is .**
26f10 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61   opened if it ha
26f20 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61  s not been alrea
26f30 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72  dy. For a tempor
26f40 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70  ary file, the op
26f50 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  ening .** of the
26f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26f70 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
26f80 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
26f90 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77  al need to .** w
26fa0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
26fb0 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68  nal. TODO: Why h
26fc0 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  andle temporary 
26fd0 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c  files differentl
26fe0 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y?.**.** If the 
26ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27000 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74  opened (or if it
27010 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
27020 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75  ), then a.** jou
27030 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77  rnal-header is w
27040 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
27050 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a  art of it..**.**
27060 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
27070 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
27080 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
27090 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
270a0 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
270b0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
270c0 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
270d0 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
270e0 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
270f0 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
27100 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
27110 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
27120 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
27130 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
27140 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
27150 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
27160 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
27170 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
27180 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
27190 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
271a0 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
271b0 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
271c0 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
271d0 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
271e0 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
271f0 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
27200 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
27210 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
27220 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
27230 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
27240 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
27250 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
27260 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
27270 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
27280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27290 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
272a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
272b0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
272c0 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
272d0 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
272e0 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28 20  InMemory;.  if( 
272f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
27300 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
27310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27320 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
27330 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27340 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67 65  !MEMDB && !pPage
27350 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
27360 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
27370 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
27380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27390 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
273a0 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
273b0 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
273c0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
273d0 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
273e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
273f0 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79 2d  The.    ** busy-
27400 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
27410 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
27420 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
27430 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
27440 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
27450 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
27460 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
27470 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
27480 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
27490 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
274a0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
274b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
274c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
274d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
274e0 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
274f0 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
27500 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
27510 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
27520 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
27530 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
27540 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
27550 49 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  If the required 
27560 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63 63 65  locks were succe
27570 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
27580 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , open the journ
27590 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  al.    ** file a
275a0 6e 64 20 77 72 69 74 65 20 74 68 65 20 66 69 72  nd write the fir
275b0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
275c0 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  r to it..    */.
275d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
275e0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
275f0 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  >useJournal.    
27600 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
27610 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
27620 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
27630 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
27640 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
27650 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
27660 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
27670 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27680 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
27690 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
276a0 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
276b0 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  ens when the pag
276c0 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73  er was in exclus
276d0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
276e0 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20  the last.    ** 
276f0 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20  time a (read or 
27700 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
27710 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
27720 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20  lly concluded.  
27730 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e    ** by this con
27740 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  nection. Instead
27750 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   of deleting the
27760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
27770 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70   was .    ** kep
27780 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65  t open and eithe
27790 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20  r was truncated 
277a0 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74  to 0 bytes or it
277b0 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20  s header was.   
277c0 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20   ** overwritten 
277d0 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
277e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
277f0 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
27800 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
27810 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
27820 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
27830 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
27840 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
27850 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
27860 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
27870 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
27880 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
27890 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
278a0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73  pPager)));.  ass
278b0 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
278c0 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
278d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
278e0 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
278f0 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  OK );.  return r
27900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
27910 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70   a single data p
27920 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
27930 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72  . The page is wr
27940 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a  itten into the .
27950 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ** main journal 
27960 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61  or sub-journal a
27970 73 20 72 65 71 75 69 72 65 64 2e 20 49 66 20 74  s required. If t
27980 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
27990 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f  en into.** one o
279a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20  f the journals, 
279b0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
279c0 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e 20  g bit is set in 
279d0 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49  the .** Pager.pI
279e0 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20  nJournal bitvec 
279f0 61 6e 64 20 74 68 65 20 50 61 67 65 72 53 61 76  and the PagerSav
27a00 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
27a10 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f  int bitvecs.** o
27a20 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70  f any open savep
27a30 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72  oints as appropr
27a40 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
27a50 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
27a60 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
27a70 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67  oid *pData = pPg
27a80 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72  ->pData;.  Pager
27a90 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
27aa0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
27ab0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
27ac0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
27ad0 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
27ae0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
27af0 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
27b00 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
27b10 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
27b20 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
27b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27b40 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
27b50 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
27b60 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
27b70 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
27b80 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
27b90 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
27ba0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
27bb0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
27bc0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
27bd0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
27be0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
27bf0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
27c00 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
27c10 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
27c20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
27c30 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69  g) && !subjRequi
27c40 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
27c50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
27c60 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65  dified = 1;.  }e
27c70 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
27c80 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
27c90 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
27ca0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
27cb0 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
27cc0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
27cd0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
27ce0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
27cf0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
27d00 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
27d10 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
27d20 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
27d30 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
27d40 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
27d50 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
27d60 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
27d70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
27d80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
27d90 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
27da0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
27db0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
27dc0 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72  Pager, 0, pPager
27dd0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b  ->subjInMemory);
27de0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
27df0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27e00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
27e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27e20 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
27e30 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
27e40 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
27e50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
27e60 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
27e70 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50  .          && pP
27e80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27e90 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27ea0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
27eb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
27ec0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
27ed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
27ee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
27ef0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
27f00 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
27f10 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20  fied = 1;.  .   
27f20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
27f30 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
27f40 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
27f50 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
27f60 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
27f70 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
27f80 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
27f90 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
27fa0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
27fb0 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
27fc0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
27fd0 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
27fe0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
27ff0 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
28000 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
28010 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
28020 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
28030 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  ( pPg->pgno<=pPa
28040 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
28050 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  ){.        u32 c
28060 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68  ksum;.        ch
28070 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20  ar *pData2;..   
28080 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c       /* We shoul
28090 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f  d never write to
280a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
280b0 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a  e the page that.
280c0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
280d0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
280e0 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
280f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
28100 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a  rifies.        *
28110 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
28120 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
28130 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d  ert( pPg->pgno!=
28140 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
28150 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20  ager) );.       
28160 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
28170 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
28180 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
28190 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70         cksum = p
281a0 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
281b0 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b  r, (u8*)pData2);
281c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
281d0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
281e0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
281f0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e  ournalOff, pPg->
28200 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
28210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28220 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
28230 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
28240 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
28250 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
28260 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28290 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a  ournalOff + 4);.
282a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
282b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
282c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
282d0 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +4;.        }.  
282e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
282f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28300 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
28310 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
28320 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
28330 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20  alOff, cksum);. 
28340 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
28350 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
28360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28370 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
28380 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
28390 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
283a0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
283b0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
283c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
283d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
283e0 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f  ;.        PAGER_
283f0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
28400 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
28410 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
28420 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE(("JOURNAL %
28430 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
28440 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29  nc=%d hash(%08x)
28450 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28460 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
28470 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  ), pPg->pgno, . 
28480 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
28490 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
284a0 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20  EED_SYNC)?1:0), 
284b0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
284c0 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  Pg)));..        
284d0 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f  /* Even if an IO
284e0 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72   or diskfull err
284f0 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  or occurred whil
28500 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68  e journalling th
28510 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
28520 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
28530 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65  bove, set the ne
28540 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72  ed-sync flag for
28550 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20   the page..     
28560 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
28570 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
28580 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
28590 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20  back, the logic 
285a0 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c  in.        ** pl
285b0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
285c0 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61  ) will think tha
285d0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
285e0 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a   to be restored.
285f0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68          ** in th
28600 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
28610 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72   And if an IO er
28620 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
28630 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20   doing so,.     
28640 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75     ** then corru
28650 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77  ption may follow
28660 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28670 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
28680 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
28690 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
286a0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
286b0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70  YNC;.          p
286c0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
286d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 1;.        }..
286e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
286f0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
28700 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
28710 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
28720 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  e .        ** tr
28730 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
28740 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
28750 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
28760 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28770 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28790 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
287a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
287b0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
287c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
287d0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
287e0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
287f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
28800 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
28810 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
28820 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
28830 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
28840 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
28850 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
28860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
28870 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
28880 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
28890 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
288a0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
288b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
288c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
288d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
288e0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
288f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
28900 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28910 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
28920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28930 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
28940 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
28950 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
28960 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
28970 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
28980 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
28990 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
289a0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
289b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
289c0 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
289d0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
289e0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
28a00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
28a10 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
28a20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
28a30 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28a40 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
28a50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28a60 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
28a70 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
28a80 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
28a90 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
28aa0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
28ab0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
28ac0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
28ad0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
28ae0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
28af0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
28b00 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
28b10 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
28b20 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
28b30 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
28b40 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
28b50 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
28b60 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
28b70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75     */.    if( su
28b80 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
28b90 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
28ba0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
28bb0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
28bc0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
28bd0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
28be0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
28bf0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28c00 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
28c10 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
28c20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
28c30 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
28c40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
28c50 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a   pPg->pgno;.  }.
28c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
28c70 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
28c80 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
28c90 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  ble. This routin
28ca0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
28cb0 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69   before .** maki
28cc0 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ng changes to a 
28cd0 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72  page. The caller
28ce0 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20   must check the 
28cf0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a  return value .**
28d00 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
28d10 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  n and be careful
28d20 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61   not to change a
28d30 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c  ny page data unl
28d40 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ess .** this rou
28d50 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
28d60 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
28d70 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
28d80 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
28d90 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69  on and pager_wri
28da0 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  te() is that thi
28db0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
28dc0 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74 68  so deals with th
28dd0 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77  e special case w
28de0 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70  here 2 or more p
28df0 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61  ages.** fit on a
28e00 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
28e10 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
28e20 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e  e all co-residen
28e30 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20  t pages.** must 
28e40 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
28e50 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
28e60 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74   file before ret
28e70 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
28e80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
28e90 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  , SQLITE_NOMEM o
28ea0 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  r an IO error co
28eb0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  de is returned.*
28ec0 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  * as appropriate
28ed0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
28ee0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
28ef0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
28f00 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65  (DbPage *pDbPage
28f10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
28f20 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64  LITE_OK;..  PgHd
28f30 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
28f40 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
28f50 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
28f60 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72  .  Pgno nPagePer
28f70 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72  Sector = (pPager
28f80 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61  ->sectorSize/pPa
28f90 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
28fa0 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72 53  .  if( nPagePerS
28fb0 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50  ector>1 ){.    P
28fc0 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
28fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
28fe0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
28ff0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  s in database fi
29000 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70  le */.    Pgno p
29010 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  g1;             
29020 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67      /* First pag
29030 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
29040 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
29050 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  n. */.    int nP
29060 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
29070 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29080 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20   pages starting 
29090 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61  at pg1 to journa
290a0 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  l */.    int ii;
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
290d0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  er */.    int ne
290e0 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20  edSync = 0;     
290f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
29100 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48 44  ny page has PGHD
29110 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a  R_NEED_SYNC */..
29120 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
29130 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
29140 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
29150 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
29160 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
29170 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
29180 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
29190 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
291a0 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
291b0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
291c0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
291d0 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
291e0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
291f0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
29200 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
29210 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
29220 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
29230 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
29240 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
29250 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
29260 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
29270 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
29280 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
29290 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
292a0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
292b0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
292c0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
292d0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
292e0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
292f0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
29300 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
29310 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74   + 1;..    sqlit
29320 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
29330 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29  (pPager, (int *)
29340 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20  &nPageCount);.  
29350 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
29360 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
29370 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
29380 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
29390 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
293a0 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
293b0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
293c0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
293d0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
293e0 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
293f0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
29400 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
29410 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
29420 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
29430 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
29440 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
29450 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
29460 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
29470 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
29480 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
29490 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
294a0 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
294b0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
294c0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
294d0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
294e0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
294f0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
29500 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
29510 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
29520 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
29530 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
29540 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29550 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
29560 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
29570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
29590 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
295a0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
295b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
295c0 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
295d0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
295e0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64              need
295f0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
29600 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
29610 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
29620 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
29630 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
29640 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
29650 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
29660 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
29670 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61    }else if( (pPa
29680 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ge = pager_looku
29690 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d  p(pPager, pg))!=
296a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
296b0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
296c0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
296d0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53  .          needS
296e0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
296f0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
29700 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
29710 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
29720 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
29730 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
29740 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  C flag is set fo
29750 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
29760 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
29770 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
29780 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
29790 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
297a0 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
297b0 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
297c0 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
297d0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
297e0 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
297f0 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
29800 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
29810 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
29820 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
29830 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
29840 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
29850 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
29860 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
29870 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
29880 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53  */.    if( needS
29890 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
298a0 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70  ert( !MEMDB && p
298b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
298c0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   );.      for(ii
298d0 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
298e0 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b  needSync; ii++){
298f0 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
29900 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
29910 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
29920 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
29930 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ( pPage ){.     
29940 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67       pPage->flag
29950 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
29960 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
29970 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
29980 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
29990 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
299a0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
299b0 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
299c0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
299d0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
299e0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
299f0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
29a00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29a10 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
29a20 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
29a30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29a40 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
29a50 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
29a60 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
29a70 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
29a80 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
29a90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29aa0 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
29ab0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
29ac0 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
29ad0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
29ae0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
29af0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
29b00 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
29b10 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
29b20 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
29b30 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67  return pPg->flag
29b40 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d  s&PGHDR_DIRTY;.}
29b50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
29b60 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
29b70 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
29b80 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
29b90 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
29ba0 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
29bb0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
29bc0 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74  ge pPg back to t
29bd0 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
29be0 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
29bf0 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
29c00 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69  d as dirty.  Thi
29c10 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
29c20 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20  xample, when.** 
29c30 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
29c40 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61  n added as a lea
29c50 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  f of the freelis
29c60 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20  t and so its.** 
29c70 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65  content no longe
29c80 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  r matters..**.**
29c90 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
29ca0 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
29cb0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
29cc0 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
29cd0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
29ce0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
29cf0 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20  used. The pager 
29d00 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
29d10 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
29d20 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
29d30 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
29d40 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
29d50 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
29d60 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
29d70 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
29d80 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a  eed of large .**
29d90 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f   DELETE operatio
29da0 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
29db0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
29dc0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
29dd0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
29de0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
29df0 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
29e00 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
29e10 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
29e20 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47  nt==0 ){.    PAG
29e30 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57  ERTRACE(("DONT_W
29e40 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20  RITE page %d of 
29e50 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
29e60 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
29e70 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  )));.    IOTRACE
29e80 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
29e90 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
29ea0 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e  pgno)).    pPg->
29eb0 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
29ec0 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
29ed0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
29ee0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
29ef0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
29f00 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
29f10 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
29f20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
29f30 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
29f40 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
29f50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
29f60 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d  file .** change-
29f70 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20  counter, stored 
29f80 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d  as a 4-byte big-
29f90 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73  endian integer s
29fa0 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62  tarting at .** b
29fb0 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66  yte offset 24 of
29fc0 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
29fd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73  .**.** If the is
29fe0 44 69 72 65 63 74 20 66 6c 61 67 20 69 73 20 7a  Direct flag is z
29ff0 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ero, then this i
2a000 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  s done by callin
2a010 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  g .** sqlite3Pag
2a020 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67  erWrite() on pag
2a030 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e 1, then modify
2a040 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
2a050 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
2a060 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61  data. In this ca
2a070 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  se the file will
2a080 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65 6e   be updated when
2a090 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
2a0a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2a0b0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
2a0c0 54 68 65 20 69 73 44 69 72 65 63 74 20 66 6c 61  The isDirect fla
2a0d0 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f  g may only be no
2a0e0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69  n-zero if the li
2a0f0 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
2a100 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53  ed.** with the S
2a110 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2a120 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20  MIC_WRITE macro 
2a130 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73  defined. In this
2a140 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44   case,.** if isD
2a150 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72  irect is non-zer
2a160 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  o, then the data
2a170 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64  base file is upd
2a180 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a  ated directly.**
2a190 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75   by writing an u
2a1a0 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  pdated version o
2a1b0 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61  f page 1 using a
2a1c0 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a   call to the .**
2a1d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2a1e0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ) function..*/.s
2a1f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
2a200 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2a210 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
2a220 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f  , int isDirectMo
2a230 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  de){.  int rc = 
2a240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
2a250 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69   Declare and ini
2a260 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74  tialize constant
2a270 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65   integer 'isDire
2a280 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  ct'. If the.  **
2a290 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2a2a0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
2a2b0 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
2a2c0 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65  ild, then isDire
2a2d0 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69  ct.  ** is initi
2a2e0 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61  alized to the va
2a2f0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
2a300 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70  e isDirectMode p
2a310 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f  arameter.  ** to
2a320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
2a330 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73  Otherwise, it is
2a340 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a   always set to z
2a350 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ero..  **.  ** T
2a360 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2a370 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  if the atomic-wr
2a380 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
2a390 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61   is not.  ** ena
2a3a0 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20  bled at compile 
2a3b0 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c  time, the compil
2a3c0 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20  er can omit the 
2a3d0 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69  tests of.  ** 'i
2a3e0 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20  sDirect' below, 
2a3f0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2a400 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e  lock enclosed in
2a410 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69   the.  ** "if( i
2a420 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69  sDirect )" condi
2a430 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  tion..  */.#ifnd
2a440 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2a450 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2a460 63 6f 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65  const int isDire
2a470 63 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ct = 0;.  assert
2a480 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d  ( isDirectMode==
2a490 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
2a4a0 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63 74  RAMETER(isDirect
2a4b0 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63  Mode);.#else.  c
2a4c0 6f 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65 63  onst int isDirec
2a4d0 74 20 3d 20 69 73 44 69 72 65 63 74 4d 6f 64 65  t = isDirectMode
2a4e0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
2a4f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2a500 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
2a510 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  D );.  if( !pPag
2a520 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2a530 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64  one && pPager->d
2a540 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50  bSize>0 ){.    P
2a550 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20  gHdr *pPgHdr;   
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a570 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  Reference to pag
2a580 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63  e 1 */.    u32 c
2a590 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20  hange_counter;  
2a5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
2a5b0 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61  ial value of cha
2a5c0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
2a5d0 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74  d */..    assert
2a5e0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
2a5f0 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ile && isOpen(pP
2a600 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20  ager->fd) );..  
2a610 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
2a620 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
2a630 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
2a640 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a650 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
2a660 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61   &pPgHdr);.    a
2a670 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30  ssert( pPgHdr==0
2a680 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
2a690 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
2a6a0 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74  page one was fet
2a6b0 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ched successfull
2a6c0 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  y, and this func
2a6d0 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20  tion is not.    
2a6e0 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  ** operating in 
2a6f0 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b  direct-mode, mak
2a700 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62 6c  e page 1 writabl
2a710 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2a720 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a730 26 26 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a  && !isDirect ){.
2a740 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a750 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
2a760 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hdr);.    }..   
2a770 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2a780 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2a790 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
2a7a0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
2a7b0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
2a7c0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
2a7d0 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2a7e0 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
2a7f0 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72  byte((u8*)pPager
2a800 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20  ->dbFileVers);. 
2a810 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
2a820 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74  ter++;.      put
2a830 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
2a840 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34  PgHdr->pData)+24
2a850 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
2a860 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2a870 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63  running in direc
2a880 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68  t mode, write th
2a890 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61  e contents of pa
2a8a0 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65  ge 1 to the file
2a8b0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
2a8c0 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20  sDirect ){.     
2a8d0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
2a8e0 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44  Buf = pPgHdr->pD
2a8f0 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ata;.        ass
2a900 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46  ert( pPager->dbF
2a910 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20  ileSize>0 );.   
2a920 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2a930 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
2a940 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  >fd, zBuf, pPage
2a950 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b  r->pageSize, 0);
2a960 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2a970 2f 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  /* If everything
2a980 20 77 6f 72 6b 65 64 2c 20 73 65 74 20 74 68 65   worked, set the
2a990 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2a9a0 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 20 20   flag. */.      
2a9b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a9c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
2a9d0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2a9e0 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
2a9f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2aa00 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65  Release the page
2aa10 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
2aa20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2aa30 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
2aa40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2aa50 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
2aa60 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64   pager file to d
2aa70 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e  isk. This is a n
2aa80 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  o-op for in-memo
2aa90 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70  ry files.** or p
2aaa0 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61  ages with the Pa
2aab0 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20  ger.noSync flag 
2aac0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  set..**.** If su
2aad0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c  ccessful, or cal
2aae0 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66  led on a pager f
2aaf0 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61  or which it is a
2ab00 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20   no-op, this.** 
2ab10 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2ab20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65   SQLITE_OK. Othe
2ab30 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72  rwise, an IO err
2ab40 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2ab50 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
2ab60 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67  te3PagerSync(Pag
2ab70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2ab80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aba0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2abb0 64 65 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  de */.  if( MEMD
2abc0 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B || pPager->noS
2abd0 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
2abe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2abf0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
2ac00 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2ac10 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
2ac20 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a  ync_flags);.  }.
2ac30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2ac40 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
2ac50 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
2ac60 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
2ac70 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
2ac80 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
2ac90 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
2aca0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
2acb0 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
2acc0 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
2acd0 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
2ace0 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
2acf0 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
2ad00 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
2ad10 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
2ad20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
2ad30 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
2ad40 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
2ad50 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
2ad60 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  res that:.**.** 
2ad70 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65    * The database
2ad80 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
2ad90 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c  nter is updated,
2ada0 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72  .**   * the jour
2adb0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75  nal is synced (u
2adc0 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63  nless the atomic
2add0 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2ade0 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a  ion is used),.**
2adf0 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70     * all dirty p
2ae00 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
2ae10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2ae20 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74   file, .**   * t
2ae30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ae40 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69   is truncated (i
2ae50 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64  f required), and
2ae60 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61  .**   * the data
2ae70 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
2ae80 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c  . .**.** The onl
2ae90 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d  y thing that rem
2aea0 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
2aeb0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
2aec0 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a  s to finalize .*
2aed0 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63  * (delete, trunc
2aee0 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
2aef0 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74  first part of) t
2af00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2af10 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  (or .** delete t
2af20 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2af30 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
2af40 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
2af50 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
2af60 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
2af70 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
2af80 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
2af90 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
2afa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
2afb0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
2afc0 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
2afd0 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
2afe0 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74   - noSync - is t
2aff0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61  rue, then the da
2b000 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
2b010 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e  lf.** is not syn
2b020 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ced. The caller 
2b030 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65  must call sqlite
2b040 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72  3PagerSync() dir
2b050 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63  ectly to.** sync
2b060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2b070 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  le before callin
2b080 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  g CommitPhaseTwo
2b090 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  () to delete the
2b0a0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2b0b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
2b0c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2b0d0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
2b0e0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
2b0f0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
2b100 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2b110 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
2b120 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20  har *zMaster,   
2b130 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e           /* If n
2b140 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73  ot NULL, the mas
2b150 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
2b160 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63   */.  int noSync
2b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b180 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2b190 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20   omit the xSync 
2b1a0 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a  on the db file *
2b1b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
2b1c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2b1d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2b1e0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
2b1f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
2b200 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
2b210 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2b220 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2b230 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43  (("DATABASE SYNC
2b240 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65  : File=%s zMaste
2b250 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22  r=%s nSize=%d\n"
2b260 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
2b270 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
2b280 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ter, pPager->dbS
2b290 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ize));..  /* If 
2b2a0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
2b2b0 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
2b2c0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
2b2d0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
2b2e0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
2b2f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2b300 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
2b310 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
2b320 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
2b330 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2b340 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  ){.    sqlite3Ba
2b350 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
2b360 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
2b370 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
2b380 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
2b390 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d  YNCED && pPager-
2b3a0 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a  >dbModified ){..
2b3b0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
2b3c0 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74  wing block updat
2b3d0 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
2b3e0 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68  unter. Exactly h
2b3f0 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ow it.    ** doe
2b400 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f  s this depends o
2b410 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
2b420 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
2b430 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
2b440 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c      ** was enabl
2b450 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2b460 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20  me, and if this 
2b470 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74  transaction meet
2b480 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75  s the .    ** ru
2b490 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20 74  ntime criteria t
2b4a0 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61 74  o use the operat
2b4b0 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ion: .    **.   
2b4c0 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c   **    * The fil
2b4d0 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
2b4e0 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
2b4f0 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
2b500 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
2b510 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
2b520 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a  size, and .    *
2b530 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d  *    * This comm
2b540 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
2b550 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
2b560 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
2b570 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63      **    * Exac
2b580 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
2b590 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
2b5a0 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
2b5b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
2b5c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2b5d0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2b5e0 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20  was not enabled 
2b5f0 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
2b600 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
2b610 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2b620 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63  gecounter() func
2b630 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2b640 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
2b650 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  nge.    ** count
2b660 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
2b670 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
2b680 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
2b690 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
2b6a0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c    ** is not appl
2b6b0 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74  icable to this t
2b6c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c  ransaction, call
2b6d0 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43   sqlite3JournalC
2b6e0 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74  reate().    ** t
2b6f0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
2b700 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
2b710 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63   actually been c
2b720 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c  reated, then cal
2b730 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69  l.    ** pager_i
2b740 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2b750 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2b760 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2b770 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20   in indirect.   
2b780 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a   ** mode. .    *
2b790 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69  *.    ** Otherwi
2b7a0 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d  se, if the optim
2b7b0 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20  ization is both 
2b7c0 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c  enabled and appl
2b7d0 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74  icable,.    ** t
2b7e0 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69  hen call pager_i
2b7f0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2b800 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74 68  r() to update th
2b810 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2b820 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65  .    ** in 'dire
2b830 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
2b840 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
2b850 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
2b860 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65  er be.    ** cre
2b870 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72  ated for this tr
2b880 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a  ansaction..    *
2b890 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2b8a0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2b8b0 49 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70  ITE.    PgHdr *p
2b8c0 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
2b8d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2b8e0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
2b8f0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2b900 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2b910 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  F );.    if( !zM
2b920 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28  aster && isOpen(
2b930 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
2b940 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2b950 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75  urnalOff==jrnlBu
2b960 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
2b970 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
2b980 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72  ->dbSize>=pPager
2b990 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20  ->dbFileSize.   
2b9a0 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20    && (0==(pPg = 
2b9b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2b9c0 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2b9d0 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70  PCache)) || 0==p
2b9e0 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20  Pg->pDirty).    
2b9f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ){.      /* Upda
2ba00 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20 63  te the db file c
2ba10 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69  hange counter vi
2ba20 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72 69  a the direct-wri
2ba30 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a  te method. The .
2ba40 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
2ba50 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64  ng call will mod
2ba60 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ify the in-memor
2ba70 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
2ba80 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20 20   of page 1 .    
2ba90 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20    ** to include 
2baa0 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61 6e  the updated chan
2bab0 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74  ge counter and t
2bac0 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31  hen write page 1
2bad0 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63   .      ** direc
2bae0 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
2baf0 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73  ase file. Becaus
2bb00 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  e of the atomic-
2bb10 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20  write .      ** 
2bb20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20  property of the 
2bb30 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d  host file-system
2bb40 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a  , this is safe..
2bb50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2bb60 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2bb70 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2bb80 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  ger, 1);.    }el
2bb90 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
2bba0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2bbb0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
2bbc0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2bbd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2bbe0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2bbf0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2bc00 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
2bc10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c       }.    }.#el
2bc20 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  se.    rc = page
2bc30 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2bc40 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b  nter(pPager, 0);
2bc50 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2bc60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2bc70 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2bc80 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2bc90 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
2bca0 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
2bcb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
2bcc0 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
2bcd0 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69  pages.    ** bei
2bce0 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
2bcf0 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
2bd00 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
2bd10 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
2bd20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20    ** file. This 
2bd30 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
2bd40 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
2bd50 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
2bd60 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e  ** Before readin
2bd70 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74 68  g the pages with
2bd80 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61   page numbers la
2bd90 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20  rger than the . 
2bda0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61     ** current va
2bdb0 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53  lue of Pager.dbS
2bdc0 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20  ize, set dbSize 
2bdd0 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
2bde0 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74  e.    ** that it
2bdf0 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61   took at the sta
2be00 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
2be10 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65  ction. Otherwise
2be20 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c  , the.    ** cal
2be30 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2be40 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a  erGet() return z
2be50 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74  eroed pages inst
2be60 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72  ead of .    ** r
2be70 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  eading data from
2be80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2be90 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  le..    */.#ifnd
2bea0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2beb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2bec0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
2bed0 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  <pPager->dbOrigS
2bee0 69 7a 65 0a 20 20 20 20 20 26 26 20 70 50 61 67  ize.     && pPag
2bef0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
2bf00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2bf10 44 45 5f 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20  DE_OFF .    ){. 
2bf20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20       Pgno i;    
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf50 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
2bf60 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ble */.      con
2bf70 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20  st Pgno iSkip = 
2bf80 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2bf90 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e  ager); /* Pendin
2bfa0 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20  g lock page */. 
2bfb0 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
2bfc0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
2bfd0 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f  >dbSize;       /
2bfe0 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67 65  * Database image
2bff0 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20   size */ .      
2c000 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
2c010 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
2c020 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  ize;.      for( 
2c030 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70  i=dbSize+1; i<=p
2c040 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c050 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
2c060 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42 69    if( !sqlite3Bi
2c070 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
2c080 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20  >pInJournal, i) 
2c090 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20  && i!=iSkip ){. 
2c0a0 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a           PgHdr *
2c0b0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
2c0c0 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f     /* Page to jo
2c0d0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20  urnal */.       
2c0e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2c0f0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2c100 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
2c110 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c120 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2c130 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2c140 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
2c150 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2c160 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  rWrite(pPage);. 
2c170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c180 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
2c190 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c1a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2c1b0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2c1c0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2c1d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a       }.      } .
2c1e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2c1f0 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20  Size = dbSize;. 
2c200 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2c210 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
2c220 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
2c230 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
2c240 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61  al file. If a ma
2c250 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75  ster .    ** jou
2c260 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
2c270 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2c280 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
2c290 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20  ournal file, .  
2c2a0 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74    ** or if zMast
2c2b0 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d  er is NULL (no m
2c2c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20  aster journal), 
2c2d0 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69  then this call i
2c2e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
2c2f0 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  /.    rc = write
2c300 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
2c310 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
2c320 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c330 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2c340 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2c350 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
2c360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c370 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63  e. If the atomic
2c380 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61  -update optimiza
2c390 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  tion is being.  
2c3a0 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20    ** used, this 
2c3b0 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72  call will not cr
2c3c0 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eate the journal
2c3d0 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d   file or perform
2c3e0 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c   any.    ** real
2c3f0 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   IO..    */.    
2c400 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
2c410 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
2c420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2c430 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2c440 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20  ase_one_exit;.. 
2c450 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
2c460 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
2c470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c480 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61  . */.    rc = pa
2c490 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
2c4a0 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  st(sqlite3Pcache
2c4b0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
2c4c0 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20  ->pPCache));.   
2c4d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c4e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2c4f0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49  rt( rc!=SQLITE_I
2c500 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a  OERR_BLOCKED );.
2c510 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69        goto commi
2c520 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2c540 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
2c550 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
2c560 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  e);..    /* If t
2c570 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
2c580 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20  is not the same 
2c590 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74 61  size as the data
2c5a0 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20  base image,.    
2c5b0 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65  ** then use page
2c5c0 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72  r_truncate to gr
2c5d0 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65  ow or shrink the
2c5e0 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
2c5f0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
2c600 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65  r->dbSize!=pPage
2c610 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
2c620 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77  .      Pgno nNew
2c630 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2c640 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53  e - (pPager->dbS
2c650 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  ize==PAGER_MJ_PG
2c660 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  NO(pPager));.   
2c670 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c680 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2c690 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20  EXCLUSIVE );.   
2c6a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
2c6b0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
2c6c0 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20  New);.      if( 
2c6d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c6e0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2c6f0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
2c700 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c  }..    /* Finall
2c710 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  y, sync the data
2c720 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
2c730 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
2c740 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63  oSync && !noSync
2c750 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2c760 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
2c770 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
2c780 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
2c790 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
2c7a0 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
2c7b0 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
2c7c0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2c7d0 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
2c7e0 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e  .commit_phase_on
2c7f0 65 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63  e_exit:.  if( rc
2c800 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ==SQLITE_IOERR_B
2c810 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a  LOCKED ){.    /*
2c820 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2c830 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20  gecounter() may 
2c840 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69  attempt to obtai
2c850 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20  n an exclusive. 
2c860 20 20 20 2a 2a 20 6c 6f 63 6b 20 74 6f 20 73 70     ** lock to sp
2c870 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e  ill the cache an
2c880 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42  d return IOERR_B
2c890 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63  LOCKED. But sinc
2c8a0 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  e .    ** there 
2c8b0 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65  is no chance the
2c8c0 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73   cache is incons
2c8d0 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20  istent, it is.  
2c8e0 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 72    ** better to r
2c8f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2c900 59 2e 0a 20 20 20 20 2a 2a 2f 0a 20 20 20 20 72  Y..    **/.    r
2c910 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
2c920 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c930 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ;.}.../*.** When
2c940 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2c950 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61  s called, the da
2c960 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
2c970 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a  been completely.
2c980 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72 65  ** updated to re
2c990 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67 65  flect the change
2c9a0 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63 75  s made by the cu
2c9b0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2c9c0 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20  n and.** synced 
2c9d0 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75  to disk. The jou
2c9e0 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20  rnal file still 
2c9f0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69  exists in the fi
2ca00 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68  le-system .** th
2ca10 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66  ough, and if a f
2ca20 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74  ailure occurs at
2ca30 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
2ca40 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a  ill eventually.*
2ca50 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20 68  * be used as a h
2ca60 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  ot-journal and t
2ca70 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
2ca80 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61  action rolled ba
2ca90 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
2caa0 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65  unction finalize
2cab0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
2cac0 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64 65  le, either by de
2cad0 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e  leting, .** trun
2cae0 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61  cating or partia
2caf0 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20  lly zeroing it, 
2cb00 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f  so that it canno
2cb10 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f  t be used .** fo
2cb20 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  r hot-journal ro
2cb30 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69  llback. Once thi
2cb40 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72  s is done the tr
2cb50 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20  ansaction is.** 
2cb60 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d  irrevocably comm
2cb70 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  itted..**.** If 
2cb80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2cb90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2cba0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
2cbb0 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d  d the pager.** m
2cbc0 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72  oves into the er
2cbd0 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ror state. Other
2cbe0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
2cbf0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2cc00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2cc10 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
2cc20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2cc30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2cc40 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2cc50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2cc60 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f  code */..  /* Do
2cc70 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 69 66 20   not proceed if 
2cc80 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72  the pager is alr
2cc90 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
2cca0 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66  r state. */.  if
2ccb0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
2ccc0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2ccd0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2cce0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
2ccf0 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2cd00 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66  not be called if
2cd10 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
2cd20 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20  t in at least.  
2cd30 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
2cd40 44 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64  D state. And ind
2cd50 65 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72  eed SQLite never
2cd60 20 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20   does this. But 
2cd70 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20  it is.  ** nice 
2cd80 74 6f 20 68 61 76 65 20 74 68 69 73 20 64 65 66  to have this def
2cd90 65 6e 73 69 76 65 20 62 6c 6f 63 6b 20 68 65 72  ensive block her
2cda0 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20  e anyway..  */. 
2cdb0 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
2cdc0 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
2cdd0 45 53 45 52 56 45 44 29 20 29 7b 0a 20 20 20 20  ESERVED) ){.    
2cde0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2cdf0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ROR;.  }..  /* A
2ce00 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
2ce10 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2ce20 77 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  was not actually
2ce30 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67   modified during
2ce40 0a 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73  .  ** this trans
2ce50 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65  action, the page
2ce60 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
2ce70 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61  exclusive-mode a
2ce80 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67  nd is.  ** using
2ce90 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72   persistent jour
2cea0 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20  nals, then this 
2ceb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
2cec0 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  -op..  **.  ** T
2ced0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2cee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
2cef0 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20  rently contains 
2cf00 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  a single journal
2cf10 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69   .  ** header wi
2cf20 74 68 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  th the nRec fiel
2cf30 64 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73  d set to 0. If s
2cf40 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73  uch a journal is
2cf50 20 75 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20   used as.  ** a 
2cf60 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69  hot-journal duri
2cf70 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ng hot-journal r
2cf80 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67  ollback, 0 chang
2cf90 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a  es will be made.
2cfa0 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
2cfb0 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68  base file. So th
2cfc0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
2cfd0 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e  o zero the journ
2cfe0 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e  al .  ** header.
2cff0 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72   Since the pager
2d000 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
2d010 20 6d 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20   mode, there is 
2d020 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20  no need.  ** to 
2d030 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65  drop any locks e
2d040 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ither..  */.  if
2d050 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69  ( pPager->dbModi
2d060 66 69 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65  fied==0 && pPage
2d070 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2d080 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e   .   && pPager->
2d090 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2d0a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
2d0b0 45 52 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20  ERSIST.  ){.    
2d0c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2d0d0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
2d0e0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
2d0f0 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r) );.    return
2d100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2d110 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
2d120 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
2d130 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2d140 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d150 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
2d160 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SYNCED || MEMDB 
2d170 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f  || !pPager->dbMo
2d180 64 69 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d  dified );.  rc =
2d190 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2d1a0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
2d1b0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
2d1c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  );.  return page
2d1d0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2d1e0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  rc);.}../*.** Ro
2d1f0 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
2d200 65 73 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  es. The database
2d210 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
2d220 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
2d230 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d240 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74  ction performs t
2d250 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20  wo tasks:.**.** 
2d260 20 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61    1) It rolls ba
2d270 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ck the journal f
2d280 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61  ile, restoring a
2d290 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
2d2a0 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e   and .**      in
2d2b0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
2d2c0 67 65 73 20 74 6f 20 74 68 65 20 73 74 61 74 65  ges to the state
2d2d0 20 74 68 65 79 20 77 65 72 65 20 69 6e 20 77 68   they were in wh
2d2e0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
2d2f0 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f  on.**      was o
2d300 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20  pened, and.**   
2d310 32 29 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20  2) It finalizes 
2d320 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d330 2c 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  , so that it is 
2d340 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74  not used for hot
2d350 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
2d360 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69  k at any point i
2d370 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a  n the future..**
2d380 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74  .** subject to t
2d390 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61  he following qua
2d3a0 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a  lifications:.**.
2d3b0 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ** * If the jour
2d3c0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
2d3d0 79 65 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68  yet open when th
2d3e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2d3f0 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e  alled,.**   then
2d400 20 6f 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72   only (2) is per
2d410 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20  formed. In this 
2d420 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
2d430 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2d440 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e     to roll back.
2d450 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61  .**.** * If in a
2d460 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
2d470 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
2d480 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20  FULL, then task 
2d490 28 31 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72  (1) is .**   per
2d4a0 66 6f 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65  formed. If succe
2d4b0 73 73 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e  ssful, task (2).
2d4c0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
2d4d0 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20  he outcome.**   
2d4e0 6f 66 20 65 69 74 68 65 72 2c 20 74 68 65 20 65  of either, the e
2d4f0 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
2d500 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2d510 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a  d to the caller.
2d520 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65  **   (i.e. eithe
2d530 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
2d540 72 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  r SQLITE_CORRUPT
2d550 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68  )..**.** * If th
2d560 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41  e pager is in PA
2d570 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61  GER_RESERVED sta
2d580 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  te, then attempt
2d590 20 28 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a   (1). Whether.**
2d5a0 20 20 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73     or not (1) is
2d5b0 20 73 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73   succussful, als
2d5c0 6f 20 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49  o attempt (2). I
2d5d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
2d5e0 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45  turn.**   SQLITE
2d5f0 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  _OK. Otherwise, 
2d600 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
2d610 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  state and return
2d620 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20   the first .**  
2d630 20 65 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f   error code enco
2d640 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  untered. .**.** 
2d650 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74    In this case t
2d660 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
2d670 65 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  e that the datab
2d680 61 73 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ase was written 
2d690 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20  to. .**   So is 
2d6a0 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65  safe to finalize
2d6b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d6c0 65 20 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c  e even if the pl
2d6d0 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70  ayback .**   (op
2d6e0 65 72 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65  eration 1) faile
2d6f0 64 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20 70  d. However the p
2d700 61 67 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20  ager must enter 
2d710 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a  the error state.
2d720 2a 2a 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74  **   as the cont
2d730 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d  ents of the in-m
2d740 65 6d 6f 72 79 20 63 61 63 68 65 20 61 72 65 20  emory cache are 
2d750 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a  now suspect..**.
2d760 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ** * Finally, if
2d770 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
2d780 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
2d790 61 74 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c  attempt (1). Onl
2d7a0 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28  y.**   attempt (
2d7b0 32 29 20 69 66 20 28 31 29 20 69 73 20 73 75 63  2) if (1) is suc
2d7c0 63 65 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20  cessful. Return 
2d7d0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
2d7e0 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74  cessful,.**   ot
2d7f0 68 65 72 77 69 73 65 20 65 6e 74 65 72 20 74 68  herwise enter th
2d800 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e  e error state an
2d810 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
2d820 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65  or code from the
2d830 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f   .**   failing o
2d840 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
2d850 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74    In this case t
2d860 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d870 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 77   may have been w
2d880 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66  ritten to. So if
2d890 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61   the.**   playba
2d8a0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64  ck operation did
2d8b0 20 6e 6f 74 20 73 75 63 63 65 65 64 20 69 74 20   not succeed it 
2d8c0 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66  would not be saf
2d8d0 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a  e to finalize.**
2d8e0 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
2d8f0 69 6c 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f  ile. It needs to
2d900 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
2d910 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74  file-system so t
2d920 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74  hat.**   some ot
2d930 68 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20  her process can 
2d940 75 73 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72  use it to restor
2d950 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
2d960 74 61 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f  tate (by.**   ho
2d970 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2d980 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ck)..*/.int sqli
2d990 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
2d9a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2d9b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d9c0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2d9d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2d9e0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45  n code */.  PAGE
2d9f0 52 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43  RTRACE(("ROLLBAC
2da00 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
2da10 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66  (pPager)));.  if
2da20 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  ( !pPager->dbMod
2da30 69 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e  ified || !isOpen
2da40 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
2da50 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2da60 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
2da70 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2da80 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65  setMaster);.  }e
2da90 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
2daa0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
2dab0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
2dac0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
2dad0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2dae0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
2daf0 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
2db00 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
2db10 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
2db20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
2db30 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
2db40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
2db50 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
2db60 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e  RVED ){.      in
2db70 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20  t rc2;.      rc 
2db80 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
2db90 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2dba0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
2dbb0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
2dbc0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
2dbd0 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  etMaster);.     
2dbe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2dbf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2dc00 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a   = rc2;.      }.
2dc10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dc20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
2dc30 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
2dc40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2dc50 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
2dc60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
2dc70 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  lid = 0;.    }..
2dc80 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
2dc90 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
2dca0 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20   a ROLLBACK, we 
2dcb0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72  can no longer tr
2dcc0 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20 20  ust the pager.  
2dcd0 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
2dce0 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
2dcf0 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
2dd00 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
2dd10 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69  or .    ** persi
2dd20 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  stent..    */.  
2dd30 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
2dd40 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
2dd50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2dd60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2dd70 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
2dd80 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
2dd90 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
2dda0 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
2ddb0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2ddc0 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
2ddd0 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20  writable..*/.u8 
2dde0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
2ddf0 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50  adonly(Pager *pP
2de00 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2de10 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
2de20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2de30 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2de40 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2de50 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  e pager..*/.int 
2de60 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
2de70 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
2de80 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
2de90 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
2dea0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
2deb0 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  che);.}../*.** R
2dec0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
2ded0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
2dee0 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
2def0 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  page..*/.int sql
2df00 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
2df10 63 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50  count(DbPage *pP
2df20 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  age){.  return s
2df30 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2df40 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b  Refcount(pPage);
2df50 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
2df60 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69  E_TEST./*.** Thi
2df70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2df80 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
2df90 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
2dfa0 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
2dfb0 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65 72  PagerStats(Pager
2dfc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61   *pPager){.  sta
2dfd0 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20  tic int a[11];. 
2dfe0 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50   a[0] = sqlite3P
2dff0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
2e000 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e010 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33    a[1] = sqlite3
2e020 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
2e030 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2e040 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74  ;.  a[2] = sqlit
2e050 65 33 50 63 61 63 68 65 47 65 74 43 61 63 68 65  e3PcacheGetCache
2e060 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
2e070 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20  ache);.  a[3] = 
2e080 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
2e090 6c 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67  lid ? (int) pPag
2e0a0 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b  er->dbSize : -1;
2e0b0 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
2e0c0 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
2e0d0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2e0e0 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  e;.  a[6] = pPag
2e0f0 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
2e100 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
2e110 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f  ;.  a[8] = 0;  /
2e120 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61  * Used to be pPa
2e130 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20  ger->nOvfl */.  
2e140 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[9] = pPager->n
2e150 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20  Read;.  a[10] = 
2e160 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a  pPager->nWrite;.
2e170 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65    return a;.}.#e
2e180 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
2e190 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73 20  rn true if this 
2e1a0 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2e1b0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
2e1c0 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64  lite3PagerIsMemd
2e1d0 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  b(Pager *pPager)
2e1e0 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42  {.  return MEMDB
2e1f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2e200 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
2e210 61 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f  at least nSavepo
2e220 69 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f  int savepoints o
2e230 70 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72  pen. If there ar
2e240 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c  e.** currently l
2e250 65 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f  ess than nSavepo
2e260 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  ints open, then 
2e270 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  open one or more
2e280 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74   savepoints.** t
2e290 6f 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69  o make up the di
2e2a0 66 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65  fference. If the
2e2b0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
2e2c0 6f 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79  oints is already
2e2d0 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61  .** equal to nSa
2e2e0 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  vepoint, then th
2e2f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2e300 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
2e310 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
2e320 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49  tion fails, SQLI
2e330 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
2e340 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
2e350 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69  r .** occurs whi
2e360 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73  le opening the s
2e370 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ub-journal file,
2e380 20 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f   then an IO erro
2e390 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74  r code is.** ret
2e3a0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
2e3b0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
2e3c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2e3d0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61  OpenSavepoint(Pa
2e3e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2e3f0 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   nSavepoint){.  
2e400 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2e410 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2e420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2e430 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2e440 74 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61  t nCurrent = pPa
2e450 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
2e460 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2e470 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76  nt number of sav
2e480 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66  epoints */..  if
2e490 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75  ( nSavepoint>nCu
2e4a0 72 72 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d  rrent && pPager-
2e4b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >useJournal ){. 
2e4c0 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20     int ii;      
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2e4f0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2e500 2a 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  */.    PagerSave
2e510 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20  point *aNew;    
2e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e530 2a 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76  * New Pager.aSav
2e540 65 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a  epoint array */.
2e550 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
2e560 68 65 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76  here is no activ
2e570 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  e journal or the
2e580 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
2e590 6f 70 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20  open or .    ** 
2e5a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
2e5b0 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20  lways stored in 
2e5c0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73  memory */.    as
2e5d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
2e5e0 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69  avepoint==0 || i
2e5f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2e600 66 64 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  fd) ||.         
2e610 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2e620 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2e630 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2e640 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77   );..    /* Grow
2e650 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
2e660 70 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e  point array usin
2e670 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74  g realloc(). Ret
2e680 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2e690 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61  .    ** if the a
2e6a0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e  llocation fails.
2e6b0 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f   Otherwise, zero
2e6c0 20 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e   the new portion
2e6d0 20 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20   in case a .    
2e6e0 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  ** malloc failur
2e6f0 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70  e occurs while p
2e700 6f 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20  opulating it in 
2e710 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f  the for(...) loo
2e720 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a  p below..    */.
2e730 20 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65      aNew = (Page
2e740 72 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c  rSavepoint *)sql
2e750 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20  ite3Realloc(.   
2e760 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
2e770 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28  vepoint, sizeof(
2e780 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a  PagerSavepoint)*
2e790 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29  nSavepoint.    )
2e7a0 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77 20  ;.    if( !aNew 
2e7b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e7c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2e7d0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26    }.    memset(&
2e7e0 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20  aNew[nCurrent], 
2e7f0 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e  0, (nSavepoint-n
2e800 43 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f  Current) * sizeo
2e810 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f(PagerSavepoint
2e820 29 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ));.    pPager->
2e830 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65  aSavepoint = aNe
2e840 77 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  w;.    pPager->n
2e850 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76  Savepoint = nSav
2e860 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20  epoint;..    /* 
2e870 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61 67  Populate the Pag
2e880 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75  erSavepoint stru
2e890 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f  ctures just allo
2e8a0 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f  cated. */.    fo
2e8b0 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69  r(ii=nCurrent; i
2e8c0 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  i<nSavepoint; ii
2e8d0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2e8e0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
2e8f0 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20  eValid );.      
2e900 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d  aNew[ii].nOrig =
2e910 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
2e920 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
2e930 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
2e940 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2e950 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  lOff>0 ){.      
2e960 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73    aNew[ii].iOffs
2e970 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  et = pPager->jou
2e980 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d  rnalOff;.      }
2e990 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e  else{.        aN
2e9a0 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
2e9b0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
2e9c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
2e9d0 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
2e9e0 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65 72  iSubRec = pPager
2e9f0 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20  ->nSubRec;.     
2ea00 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76   aNew[ii].pInSav
2ea10 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33  epoint = sqlite3
2ea20 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
2ea30 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
2ea40 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69      if( !aNew[ii
2ea50 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29  ].pInSavepoint )
2ea60 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2ea70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2ea80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2ea90 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75    /* Open the su
2eaa0 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  b-journal, if it
2eab0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
2eac0 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72  opened. */.    r
2ead0 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
2eae0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
2eaf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2eb00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2eb10 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2eb20 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
2eb30 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61  lease (commit) a
2eb40 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54   savepoint..** T
2eb50 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20  he savepoint to 
2eb60 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
2eb70 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  ack need not be 
2eb80 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
2eb90 79 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 61  y .** created sa
2eba0 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50  vepoint..**.** P
2ebb0 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61  arameter op is a
2ebc0 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41 56  lways either SAV
2ebd0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2ebe0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
2ebf0 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69  EASE..** If it i
2ec00 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
2ec10 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73  ASE, then releas
2ec20 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68  e and destroy th
2ec30 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  e savepoint with
2ec40 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70  .** index iSavep
2ec50 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53  oint. If it is S
2ec60 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2ec70 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b  K, then rollback
2ec80 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20   all changes.** 
2ec90 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 72  that have occurr
2eca0 65 64 20 73 69 6e 63 65 20 74 68 65 20 73 70 65  ed since the spe
2ecb0 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74  cified savepoint
2ecc0 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a   was created..**
2ecd0 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
2ece0 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  t to rollback or
2ecf0 20 72 65 6c 65 61 73 65 20 69 73 20 69 64 65 6e   release is iden
2ed00 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
2ed10 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69  ter .** iSavepoi
2ed20 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  nt. A value of 0
2ed30 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72 61 74   means to operat
2ed40 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f  e on the outermo
2ed50 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  st savepoint.** 
2ed60 28 74 68 65 20 66 69 72 73 74 20 63 72 65 61 74  (the first creat
2ed70 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  ed). A value of 
2ed80 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
2ed90 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65 72 61  t-1) means opera
2eda0 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73  te.** on the mos
2edb0 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
2edc0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ed savepoint. If
2edd0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
2ede0 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28  reater than.** (
2edf0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
2ee00 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66  -1), then this f
2ee10 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2ee20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  op..**.** If a n
2ee30 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 69 73  egative value is
2ee40 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
2ee50 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74  function, then t
2ee60 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2ee70 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2ee80 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
2ee90 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20 63  s different to c
2eea0 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
2eeb0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
2eec0 29 20 62 65 63 61 75 73 65 20 74 68 69 73 20 66  ) because this f
2eed0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2eee0 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68   terminate.** th
2eef0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
2ef00 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
2ef10 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72 65  base, it just re
2ef20 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20 63  stores the .** c
2ef30 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
2ef40 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
2ef50 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a  riginal state. .
2ef60 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73  **.** In any cas
2ef70 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  e, all savepoint
2ef80 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  s with an index 
2ef90 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 53 61  greater than iSa
2efa0 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20  vepoint .** are 
2efb0 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20 74 68  destroyed. If th
2efc0 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
2efd0 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53  operation (op==S
2efe0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2eff0 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65 70  ),.** then savep
2f000 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20  oint iSavepoint 
2f010 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 65  is also destroye
2f020 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
2f030 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2f040 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  n SQLITE_NOMEM i
2f050 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
2f060 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
2f070 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
2f080 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ode if an IO err
2f090 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2f0a0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a  rolling back a .
2f0b0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ** savepoint. If
2f0c0 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63 75 72   no errors occur
2f0d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2f0e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74  eturned..*/ .int
2f0f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
2f100 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
2f110 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  ager, int op, in
2f120 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
2f130 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2f140 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2f150 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2f160 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
2f170 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2f180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 61  );.  assert( iSa
2f190 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70  vepoint>=0 || op
2f1a0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2f1b0 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69  BACK );..  if( i
2f1c0 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72  Savepoint<pPager
2f1d0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->nSavepoint ){.
2f1e0 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
2f1f0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2f200 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2f210 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20     int nNew;    
2f220 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f230 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 61 76  of remaining sav
2f240 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20 74 68  epoints after th
2f250 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f  is op. */..    /
2f260 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2f270 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73   many savepoints
2f280 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61   will still be a
2f290 63 74 69 76 65 20 61 66 74 65 72 20 74 68 69 73  ctive after this
2f2a0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
2f2b0 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20 76 61  n. Store this va
2f2c0 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65  lue in nNew. The
2f2d0 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63 65 73  n free resources
2f2e0 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20   associated .   
2f2f0 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73 61 76   ** with any sav
2f300 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61 72 65  epoints that are
2f310 20 64 65 73 74 72 6f 79 65 64 20 62 79 20 74 68   destroyed by th
2f320 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
2f330 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20    */.    nNew = 
2f340 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70  iSavepoint + (op
2f350 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2f360 42 41 43 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69  BACK);.    for(i
2f370 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65  i=nNew; ii<pPage
2f380 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
2f390 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
2f3a0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
2f3b0 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
2f3c0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
2f3d0 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
2f3e0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2f3f0 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20  int = nNew;..   
2f400 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2f410 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
2f420 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68  ion, playback th
2f430 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
2f440 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66  point..    ** If
2f450 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d   this is a temp-
2f460 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73  file, it is poss
2f470 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ible that the jo
2f480 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20  urnal file has. 
2f490 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65     ** not yet be
2f4a0 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  en opened. In th
2f4b0 69 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61  is case there ha
2f4c0 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
2f4d0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  es to.    ** the
2f4e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2f4f0 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  so the playback 
2f500 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65  operation can be
2f510 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
2f520 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
2f530 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2f540 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2f550 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2f560 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
2f570 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e  pSavepoint = (nN
2f580 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72  ew==0)?0:&pPager
2f590 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65  ->aSavepoint[nNe
2f5a0 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  w-1];.      rc =
2f5b0 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
2f5c0 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20  vepoint(pPager, 
2f5d0 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  pSavepoint);.   
2f5e0 20 20 20 61 73 73 65 72 74 28 72 63 21 3d 53 51     assert(rc!=SQ
2f5f0 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20  LITE_DONE);.    
2f600 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
2f610 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
2f620 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
2f630 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75  t savepoint, tru
2f640 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68  ncate .    ** th
2f650 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f  e sub-journal to
2f660 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
2f670 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ize. */.    if( 
2f680 6e 4e 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53  nNew==0 && op==S
2f690 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2f6a0 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2f6b0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
2f6c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2f6d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2f6e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
2f6f0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
2f700 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  sjfd, 0);.      
2f710 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
2f720 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2f730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f740 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2f750 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
2f760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2f770 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2f780 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
2f790 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
2f7a0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2f7b0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2f7c0 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
2f7d0 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
2f7e0 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
2f7f0 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
2f800 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
2f810 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
2f820 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2f830 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
2f840 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2f850 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
2f860 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
2f870 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
2f880 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
2f890 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
2f8a0 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
2f8b0 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
2f8c0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2f8d0 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
2f8e0 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
2f8f0 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
2f900 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2f910 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
2f920 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2f930 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
2f940 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2f950 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2f960 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
2f970 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
2f980 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2f990 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
2f9a0 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
2f9b0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
2f9c0 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
2f9d0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
2f9e0 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
2f9f0 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
2fa00 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
2fa10 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
2fa20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2fa30 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
2fa40 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2fa50 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
2fa60 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2fa70 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
2fa80 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
2fa90 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
2faa0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2fab0 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
2fac0 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
2fad0 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
2fae0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
2faf0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
2fb00 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
2fb10 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
2fb20 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
2fb30 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
2fb40 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ecArg;.}.#endif.
2fb50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2fb60 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2fb70 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
2fb80 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74  age pPg to locat
2fb90 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
2fba0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  file..**.** Ther
2fbb0 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
2fbc0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2fbd0 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
2fbe0 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e  ocated at.** pgn
2fbf0 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c  o (which we call
2fc00 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20   pPgOld) though 
2fc10 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c  that page is all
2fc20 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  owed to be.** in
2fc30 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20   cache.  If the 
2fc40 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
2fc50 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20  located at pgno 
2fc60 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
2fc70 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  * in the rollbac
2fc80 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
2fc90 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62   not put there b
2fca0 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  y by this routin
2fcb0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
2fcc0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2fcd0 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  pPg remain valid
2fce0 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
2fcf0 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
2fd00 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20  ciated with pPg 
2fd10 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
2fd20 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
2fd30 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
2fd40 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
2fd50 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
2fd60 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
2fd70 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
2fd80 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
2fd90 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
2fda0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2fdb0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
2fdc0 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
2fdd0 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
2fde0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
2fdf0 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
2fe00 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
2fe10 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
2fe20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
2fe30 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
2fe40 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
2fe50 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
2fe60 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2fe70 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a  is active)..**.*
2fe80 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20  * If the fourth 
2fe90 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d  argument, isComm
2fea0 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  it, is non-zero,
2feb0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
2fec0 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65  is being.** move
2fed0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64  d as part of a d
2fee0 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69  atabase reorgani
2fef0 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f  zation just befo
2ff00 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
2ff10 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20  on .** is being 
2ff20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68  committed. In th
2ff30 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67  is case, it is g
2ff40 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
2ff50 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
2ff60 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20   .** pPg refers 
2ff70 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77  to will not be w
2ff80 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20  ritten to again 
2ff90 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
2ffa0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
2ffb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2ffc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2ffd0 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
2ffe0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
2fff0 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
30000 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 65  Otherwise, it re
30010 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
30020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
30030 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
30040 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
30050 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
30060 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  no, int isCommit
30070 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
30080 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
30090 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65    /* The page be
300a0 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
300b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   */.  Pgno needS
300c0 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20  yncPgno = 0;    
300d0 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20     /* Old value 
300e0 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66  of pPg->pgno, if
300f0 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
30100 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  d */.  int rc;  
30110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30120 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
30130 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69  de */.  Pgno ori
30140 67 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  gPgno;          
30150 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67       /* The orig
30160 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  inal page number
30170 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
30180 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
30190 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
301a0 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64  being moved is d
301b0 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74  irty and has not
301c0 20 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74   been saved by t
301d0 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73  he latest.  ** s
301e0 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73  avepoint, then s
301f0 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
30200 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
30210 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20  page into the . 
30220 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20   ** sub-journal 
30230 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71  now. This is req
30240 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  uired to handle 
30250 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
30260 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  enario:.  **.  *
30270 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20  *   BEGIN;.  ** 
30280 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67      <journal pag
30290 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79  e X, then modify
302a0 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20   it in memory>. 
302b0 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
302c0 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20  T one;.  **     
302d0 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74    <Move page X t
302e0 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20  o location Y>.  
302f0 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  **     ROLLBACK 
30300 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  TO one;.  **.  *
30310 2a 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65  * If page X were
30320 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
30330 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
30340 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e  here, it would n
30350 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69  ot.  ** be possi
30360 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69  ble to restore i
30370 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e  ts contents when
30380 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
30390 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74  O one".  ** stat
303a0 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72  ement were is pr
303b0 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20  ocessed..  **.  
303c0 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67  ** subjournalPag
303d0 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  e() may need to 
303e0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74  allocate space t
303f0 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e  o store pPg->pgn
30400 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20  o into.  ** one 
30410 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e  or more savepoin
30420 74 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20  t bitvecs. This 
30430 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68  is the reason th
30440 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
30450 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
30460 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20  TE_NOMEM..  */. 
30470 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
30480 50 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20 20  PGHDR_DIRTY .   
30490 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
304a0 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53  age(pPg).   && S
304b0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
304c0 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
304d0 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  Pg)).  ){.    re
304e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
304f0 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56  PAGERTRACE(("MOV
30500 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
30510 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
30520 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
30530 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
30540 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70  ), pPg->pgno, (p
30550 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
30560 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20  NEED_SYNC)?1:0, 
30570 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43  pgno));.  IOTRAC
30580 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25  E(("MOVE %p %d %
30590 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
305a0 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a  g->pgno, pgno)).
305b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75  .  /* If the jou
305c0 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
305d0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
305e0 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20   page pPg->pgno 
305f0 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  can.  ** be writ
30600 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50  ten to, store pP
30610 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c  g->pgno in local
30620 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79   variable needSy
30630 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a  ncPgno..  **.  *
30640 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69  * If the isCommi
30650 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  t flag is set, t
30660 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
30670 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
30680 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
30690 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
306a0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
306b0 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d  tabase page pPg-
306c0 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20  >pgno .  ** can 
306d0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
306e0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
306f0 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
30700 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69  ot to write to i
30710 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  t..  */.  if( (p
30720 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
30730 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69  NEED_SYNC) && !i
30740 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e  sCommit ){.    n
30750 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
30760 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
30770 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e  ert( pageInJourn
30780 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  al(pPg) || pPg->
30790 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
307a0 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  rigSize );.    a
307b0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
307c0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
307d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
307e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
307f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
30800 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
30810 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
30820 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
30830 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
30840 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69  om its hash chai
30850 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
30860 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
30870 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
30880 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
30890 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
308a0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
308b0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
308c0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
308d0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
308e0 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67    */.  pPg->flag
308f0 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
30900 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20  _SYNC;.  pPgOld 
30910 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
30920 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
30930 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20  assert( !pPgOld 
30940 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  || pPgOld->nRef=
30950 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  =1 );.  if( pPgO
30960 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66  ld ){.    pPg->f
30970 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d  lags |= (pPgOld-
30980 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
30990 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 73 71 6c  D_SYNC);.    sql
309a0 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
309b0 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 6f  PgOld);.  }..  o
309c0 72 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  rigPgno = pPg->p
309d0 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  gno;.  sqlite3Pc
309e0 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67  acheMove(pPg, pg
309f0 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  no);.  sqlite3Pc
30a00 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
30a10 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  g);.  pPager->db
30a20 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20  Modified = 1;.. 
30a30 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
30a40 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  o ){.    /* If n
30a50 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e  eedSyncPgno is n
30a60 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
30a70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
30a80 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
30a90 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  ** sync()ed befo
30aa0 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77  re any data is w
30ab0 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61  ritten to databa
30ac0 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65  se file page nee
30ad0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a  dSyncPgno..    *
30ae0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20  * Currently, no 
30af0 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
30b00 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
30b10 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  he and the .    
30b20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64  ** "is journaled
30b30 22 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61  " bitvec flag ha
30b40 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
30b50 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
30b60 65 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  edied by.    ** 
30b70 6c 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65  loading the page
30b80 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
30b90 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
30ba0 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
30bb0 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61  Sync .    ** fla
30bc0 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g..    **.    **
30bd0 20 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   If the attempt 
30be0 74 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65  to load the page
30bf0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63   into the page-c
30c00 61 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65  ache fails, (due
30c10 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c  .    ** to a mal
30c20 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c  loc() or IO fail
30c30 75 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20  ure), clear the 
30c40 62 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f  bit in the pInJo
30c50 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61  urnal[].    ** a
30c60 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
30c70 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
30c80 6c 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74  loaded and writt
30c90 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20  en again in.    
30ca0 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  ** this transact
30cb0 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77  ion, it may be w
30cc0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
30cd0 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
30ce0 72 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  re.    ** it is 
30cf0 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
30d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
30d10 69 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65  is way, it may e
30d20 6e 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20  nd up in.    ** 
30d30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30d40 20 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74   twice, but that
30d50 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65   is not a proble
30d60 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m..    **.    **
30d70 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   The sqlite3Page
30d80 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  rGet() call may 
30d90 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
30da0 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61  l to sync. So ma
30db0 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74  ke.    ** sure t
30dc0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
30dd0 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  c flag is set to
30de0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 67  o..    */.    Pg
30df0 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20  Hdr *pPgHdr;.   
30e00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30e10 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
30e20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30e30 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65  erGet(pPager, ne
30e40 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67  edSyncPgno, &pPg
30e50 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
30e60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30e70 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
30e80 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 6e  >pInJournal && n
30e90 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61  eedSyncPgno<=pPa
30ea0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
30eb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30ec0 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50  e3BitvecClear(pP
30ed0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
30ee0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b  , needSyncPgno);
30ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
30f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
30f10 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
30f20 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
30f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
30f40 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
30f50 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
30f60 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
30f70 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73  NEED_SYNC;.    s
30f80 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
30f90 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
30fa0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
30fb0 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
30fc0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72  }..  /*.  ** For
30fd0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
30fe0 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72  tabase, make sur
30ff0 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
31000 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20  age continues.  
31010 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20  ** to exist, in 
31020 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63  case the transac
31030 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f  tion needs to ro
31040 6c 6c 20 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c  ll back.  We all
31050 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
31060 61 67 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64  age now, instead
31070 20 6f 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c   of at rollback,
31080 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 20   because we can 
31090 62 65 74 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a  better deal.  **
310a0 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d   with an out-of-
310b0 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77  memory error now
310c0 2e 20 20 54 69 63 6b 65 74 20 23 33 37 36 31 2e  .  Ticket #3761.
310d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
310e0 42 20 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20  B ){.    DbPage 
310f0 2a 70 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20  *pNew;.    rc = 
31100 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
31110 69 72 65 28 70 50 61 67 65 72 2c 20 6f 72 69 67  ire(pPager, orig
31120 50 67 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b  Pgno, &pNew, 1);
31130 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
31140 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
31150 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  rc;.    sqlite3P
31160 61 67 65 72 55 6e 72 65 66 28 70 4e 65 77 29 3b  agerUnref(pNew);
31170 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
31180 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
31190 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
311a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
311b0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
311c0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
311d0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
311e0 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
311f0 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  ge *pPg){.  asse
31200 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
31210 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
31220 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72  memDb );.  retur
31230 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a  n pPg->pData;.}.
31240 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
31250 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
31260 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
31270 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
31280 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
31290 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
312a0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
312b0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
312c0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
312d0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
312e0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
312f0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
31300 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d  urn (pPager?pPg-
31310 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f  >pExtra:0);.}../
31320 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
31330 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
31340 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
31350 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
31360 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
31370 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31380 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
31390 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
313a0 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
313b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
313c0 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
313d0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
313e0 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
313f0 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
31400 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
31410 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
31420 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
31430 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
31440 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
31450 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
31460 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31470 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
31480 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
31490 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
314a0 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
314b0 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
314c0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
314d0 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
314e0 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
314f0 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
31500 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
31510 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
31520 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
31530 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
31540 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
31550 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
31560 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31570 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
31580 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
31590 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
315a0 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
315b0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
315c0 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
315d0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
315e0 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
315f0 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
31600 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
31610 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
31620 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
31630 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20  e = (u8)eMode;. 
31640 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
31650 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
31660 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  veMode;.}../*.**
31670 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75   Get/set the jou
31680 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68  rnal-mode for th
31690 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
316a0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
316b0 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e one of:.**.** 
316c0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
316d0 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20  MODE_QUERY.**   
316e0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
316f0 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  DE_DELETE.**    
31700 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
31710 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  E_TRUNCATE.**   
31720 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31730 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  DE_PERSIST.**   
31740 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31750 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47  DE_OFF.**    PAG
31760 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
31770 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74  EMORY.**.** If t
31780 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
31790 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
317a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
317b0 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a  e is set to the.
317c0 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  ** value specifi
317d0 65 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65  ed if the change
317e0 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68   is allowed.  Th
317f0 65 20 63 68 61 6e 67 65 20 69 73 20 64 69 73 61  e change is disa
31800 6c 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68  llowed.** for th
31810 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73  e following reas
31820 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ons:.**.**   *  
31830 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  An in-memory dat
31840 61 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68  abase can only h
31850 61 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f  ave its journal_
31860 6d 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46  mode set to _OFF
31870 0a 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d  .**      or _MEM
31880 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ORY..**.**   *  
31890 54 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  The journal mode
318a0 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e   may not be chan
318b0 67 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e  ged while a tran
318c0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
318d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  e..**.** The ret
318e0 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
318f0 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
31900 69 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f  ibly updated) jo
31910 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
31920 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
31930 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
31940 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
31950 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
31960 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
31970 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20  RNALMODE_QUERY. 
31980 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31990 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
319a0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20  ALMODE_DELETE.  
319b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
319c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
319d0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
319e0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
319f0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
31a00 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
31a10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
31a20 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
31a30 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
31a40 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
31a50 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
31a60 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
31a70 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f  assert( PAGER_JO
31a80 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c  URNALMODE_QUERY<
31a90 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
31aa0 3e 3d 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44  >=0.   && (!MEMD
31ab0 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45  B || eMode==PAGE
31ac0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
31ad0 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20  MORY .          
31ae0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
31af0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31b00 4f 46 46 29 0a 20 20 20 26 26 20 21 70 50 61 67  OFF).   && !pPag
31b10 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20  er->dbModified. 
31b20 20 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50    && (!isOpen(pP
31b30 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d  ager->jfd) || 0=
31b40 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
31b50 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66  Off).  ){.    if
31b60 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
31b70 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73  >jfd) ){.      s
31b80 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
31b90 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
31ba0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  }.    pPager->jo
31bb0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
31bc0 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
31bd0 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
31be0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a  >journalMode;.}.
31bf0 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
31c00 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73  he size-limit us
31c10 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e  ed for persisten
31c20 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  t journal files.
31c30 0a 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74  .**.** Setting t
31c40 68 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f  he size limit to
31c50 20 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d   -1 means no lim
31c60 69 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a  it is enforced..
31c70 2a 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f  ** An attempt to
31c80 20 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61   set a limit sma
31c90 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20  ller than -1 is 
31ca0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20  a no-op..*/.i64 
31cb0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
31cc0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67  nalSizeLimit(Pag
31cd0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20  er *pPager, i64 
31ce0 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69  iLimit){.  if( i
31cf0 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20  Limit>=-1 ){.   
31d00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31d10 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d  SizeLimit = iLim
31d20 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
31d30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
31d40 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a  SizeLimit;.}../*
31d50 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
31d60 6e 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67  nter to the pPag
31d70 65 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69  er->pBackup vari
31d80 61 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70  able. The backup
31d90 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61   module.** in ba
31da0 63 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73  ckup.c maintains
31db0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
31dc0 74 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54  this variable. T
31dd0 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73  his module.** us
31de0 65 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61  es it opaquely a
31df0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f  s an argument to
31e00 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
31e10 73 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73  start() and.** s
31e20 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
31e30 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71  te() only..*/.sq
31e40 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73  lite3_backup **s
31e50 71 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75  qlite3PagerBacku
31e60 70 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67  pPtr(Pager *pPag
31e70 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70  er){.  return &p
31e80 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a  Pager->pBackup;.
31e90 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
31ea0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
31eb0 2a 2f 0a                                         */.