/ Hex Artifact Content
Login

Artifact 2ac73f55f5782c434c91ce48c756060e1366aeb7:


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 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 4d 61  Int.h"../*.** Ma
0370: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
0380: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
0390: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
03a0: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
03b0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
03c0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
03d0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
03e0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
03f0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
0400: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
0410: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
0420: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
0430: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
0440: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
0450: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
0460: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
0470: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
0480: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
0490: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
04a0: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
04b0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
04c0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
04d0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
04e0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
04f0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
0500: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
0510: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
0520: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
0530: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
0540: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
0550: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
0560: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
0570: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
0580: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
0590: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
05a0: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
05b0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
05c0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
05d0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
05e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
05f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0600: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0620: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0630: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0640: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0650: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0660: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0670: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0680: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
06b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
06c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
06d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
06e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
06f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0710: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0720: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0730: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0740: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0750: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0770: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0780: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0790: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
07c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
07d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0800: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0810: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0820: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0830: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0840: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0850: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0880: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0890: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
08a0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
08d0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
08e0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
08f0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0910: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0920: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0930: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0960: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0970: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0980: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0990: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
09a0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
09b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
09c0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
09d0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
09e0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0a10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0a20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0a30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0a50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0a60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0a70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0a90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0aa0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0ab0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0ac0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0ad0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ae0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0af0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0b00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0b10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0b20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0b30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0b70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0b80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0b90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0ba0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0bb0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0bc0: 6f 76 65 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ove or.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
0bf0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68  rnal file and th
0c00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  e transaction .*
0c10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c20: 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20          will be 
0c30: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0c40: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0c50: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0c60: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0c70: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0c80: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
0c90: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74 61   occurs, the sta
0ca0: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0cb0: 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a  o PAGER_SHARED..
0cc0: 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67  ** After all pag
0cd0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c  es have been rel
0ce0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
0cf0: 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c  te_page_unref(),
0d00: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74 72  .** the state tr
0d10: 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74  ansitions back t
0d20: 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  o PAGER_UNLOCK. 
0d30: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a   The first time.
0d40: 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33 50  ** that sqlite3P
0d50: 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
0d60: 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65  alled, the state
0d70: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a   transitions to.
0d80: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0d90: 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73  D.  (Note that s
0da0: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
0db0: 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a  () can only be.*
0dc0: 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f  * called on an o
0dd0: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
0de0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
0df0: 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a   the pager must.
0e00: 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53  ** be in PAGER_S
0e10: 48 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20  HARED before it 
0e20: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e30: 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a  AGER_RESERVED.).
0e40: 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  ** PAGER_RESERVE
0e50: 44 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  D means that the
0e60: 72 65 20 69 73 20 61 6e 20 6f 70 65 6e 20 72 6f  re is an open ro
0e70: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
0e80: 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f  ** The transitio
0e90: 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  n to PAGER_EXCLU
0ea0: 53 49 56 45 20 6f 63 63 75 72 73 20 62 65 66 6f  SIVE occurs befo
0eb0: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a  re any changes.*
0ec0: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  * are made to th
0ed0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
0ee0: 20 74 68 6f 75 67 68 20 77 72 69 74 65 73 20 74   though writes t
0ef0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a  o the rollback.*
0f00: 2a 20 6a 6f 75 72 6e 61 6c 20 6f 63 63 75 72 73  * journal occurs
0f10: 20 77 69 74 68 20 6a 75 73 74 20 50 41 47 45 52   with just PAGER
0f20: 5f 52 45 53 45 52 56 45 44 2e 20 20 41 66 74 65  _RESERVED.  Afte
0f30: 72 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  r an sqlite3Page
0f40: 72 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f  rRollback().** o
0f50: 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  r sqlite3PagerCo
0f60: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2c 20  mmitPhaseTwo(), 
0f70: 74 68 65 20 73 74 61 74 65 20 63 61 6e 20 67 6f  the state can go
0f80: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
0f90: 48 41 52 45 44 2c 0a 2a 2a 20 6f 72 20 69 74 20  HARED,.** or it 
0fa0: 63 61 6e 20 73 74 61 79 20 61 74 20 50 41 47 45  can stay at PAGE
0fb0: 52 5f 45 58 43 4c 55 53 49 56 45 20 69 66 20 77  R_EXCLUSIVE if w
0fc0: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
0fd0: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 0a  ve access mode..
0fe0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
0ff0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23  _UNLOCK      0.#
1000: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41  define PAGER_SHA
1010: 52 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20  RED      1   /* 
1020: 73 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c  same as SHARED_L
1030: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1040: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
1050: 20 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   2   /* same as 
1060: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f  RESERVED_LOCK */
1070: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
1080: 58 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f  XCLUSIVE   4   /
1090: 2a 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53  * same as EXCLUS
10a0: 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  IVE_LOCK */.#def
10b0: 69 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ine PAGER_SYNCED
10c0: 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 41        5../*.** A
10d0: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
10e0: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
10f0: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
1100: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
1110: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
1120: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
1130: 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69  D,N,X,E) \.    i
1140: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20  f( P->xCodec && 
1150: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1160: 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b  dec,D,N,X)==0 ){
1170: 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43   E; }.# define C
1180: 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c  ODEC2(P,D,N,X,E,
1190: 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e  O) \.    if( P->
11a0: 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28  xCodec==0 ){ O=(
11b0: 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c  char*)D; }else \
11c0: 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61  .    if( (O=(cha
11d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d  r*)(P->xCodec(P-
11e0: 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29  >pCodec,D,N,X)))
11f0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73  ==0 ){ E; }.#els
1200: 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  e.# define CODEC
1210: 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f  1(P,D,N,X,E)   /
1220: 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66  * NO-OP */.# def
1230: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
1240: 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a  ,X,E,O) O=(char*
1250: 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  )D.#endif../*.**
1260: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
1270: 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  owed sector size
1280: 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20  . 64KiB. If the 
1290: 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65  xSectorsize() me
12a0: 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73  thod .** returns
12b0: 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20   a value larger 
12c0: 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20  than this, then 
12d0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
12e0: 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e  is used instead.
12f0: 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63  .** This could c
1300: 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65  onceivably cause
1310: 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c   corruption foll
1320: 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61  owing a power fa
1330: 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68  ilure on.** such
1340: 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20   a system. This 
1350: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20  is currently an 
1360: 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d  undocumented lim
1370: 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  it..*/.#define M
1380: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30  AX_SECTOR_SIZE 0
1390: 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  x10000../*.** An
13a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
13b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
13c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
13d0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
13e0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
13f0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
1400: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
1410: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
1420: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
1430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
1440: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
1450: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
1460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1470: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
1480: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
1490: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
14a0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
14b0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
14c0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14d0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
14e0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
14f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1500: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1520: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
1530: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1540: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
1550: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1560: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
1570: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1580: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
1590: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
15a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15b0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
15c0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
15d0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
15e0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
15f0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
1600: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
1610: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
1620: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
1630: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1640: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
1650: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
1660: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1670: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
16a0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
16b0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
16c0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
16d0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
16e0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
16f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
1700: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
1710: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
1720: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
1730: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1750: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
1760: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
1770: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
17a0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
17b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ournal */.};../*
17c0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
17d0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
17e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
17f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1800: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
1810: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72  *.**   Pager.err
1820: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
1830: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
1840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1850: 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49   or.**   or SQLI
1860: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1870: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1880: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1890: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
18a0: 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75  **   and is retu
18b0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
18c0: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
18d0: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
18e0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49  .  The.**   SQLI
18f0: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1900: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1910: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1920: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1930: 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20  l the.**   next 
1940: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
1950: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
1960: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
1970: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20  che. Also,.**   
1980: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1990: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
19a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
19c0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20  erLookup().**   
19d0: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
19e0: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
19f0: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  cessfully..**.**
1a00: 20 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62   dbSizeValid, db
1a10: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1a20: 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a  , dbFileSize.**.
1a30: 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68  **   Managing th
1a40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1a50: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1a60: 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ages is a little
1a70: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
1a80: 20 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20     The variable 
1a90: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1aa0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ab0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1ac0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
1ad0: 20 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79   image currently
1ae0: 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68   contains. As th
1af0: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1b00: 20 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b   grows or shrink
1b10: 73 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69  s this.**   vari
1b20: 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e  able is updated.
1b30: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1b40: 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63  ger.dbFileSize c
1b50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
1b60: 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73  er.**   of pages
1b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b80: 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20   file. This may 
1b90: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
1ba0: 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a  m Pager.dbSize.*
1bb0: 2a 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65  *   if some page
1bc0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1bd0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1be0: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1bf0: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1c00: 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65  *   out from the
1c10: 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63   cache to the ac
1c20: 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  tual file on dis
1c30: 6b 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61  k. Or if the ima
1c40: 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20  ge has been.**  
1c50: 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e   truncated by an
1c60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1c70: 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  uum operation. T
1c80: 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53  he Pager.dbOrigS
1c90: 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1ca0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
1cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1cd0: 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75  mage when the cu
1ce0: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73  rrent.**   trans
1cf0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
1d00: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
1d10: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
1d20: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
1d30: 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61  is.**   only gua
1d40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1d50: 72 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f  rrect if the boo
1d60: 6c 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  lean Pager.dbSiz
1d70: 65 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a  eValid is true..
1d80: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e  **.**   TODO: Un
1d90: 64 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69  der what conditi
1da0: 6f 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c  ons is dbSizeVal
1db0: 69 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f  id set? Cleared?
1dc0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
1dd0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
1de0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
1df0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1e00: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1e10: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e20: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
1e30: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
1e40: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
1e50: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
1e60: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
1e70: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
1e80: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
1e90: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
1ea0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
1eb0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
1ec0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
1ed0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
1ee0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
1ef0: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
1f00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1f10: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f30: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
1f40: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
1f50: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
1f60: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
1f70: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
1f80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f90: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
1fa0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fb0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
1fc0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
1fd0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
1fe0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
1ff0: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
2000: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
2010: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2020: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
2030: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
2040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2050: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
2060: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
2070: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
2080: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
2090: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
20a0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
20b0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
20c0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
20d0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
20e0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
20f0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64  ted..**.** dbMod
2100: 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  ified.**.**   Th
2110: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2120: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2130: 72 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  r a database pag
2140: 65 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a  e is dirtied..**
2150: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
2160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2170: 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ach transaction.
2180: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75  .**.**   It is u
2190: 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  sed when committ
21a0: 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ing or otherwise
21b0: 20 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61   ending a transa
21c0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74  ction. If.**   t
21d0: 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c  he dbModified fl
21e0: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
21f0: 20 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74   less work has t
2200: 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  o be done..**.**
2210: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a   journalStarted.
2220: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61  **.**   This fla
2230: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2240: 72 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a  r the the main j
2250: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2260: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  . .**.**   The p
2270: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
2280: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
2290: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
22a0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
22b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
22c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22d0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
22e0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
22f0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
2300: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
2310: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2320: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
2330: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
2340: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2350: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
2360: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
2370: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
2380: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
2390: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
23a0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
23b0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
23c0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
23d0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
23e0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
23f0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
2400: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2410: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2420: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
2430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2440: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
2450: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
2460: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2470: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
2480: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
2490: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
24a0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
24d0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
24e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
2500: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
2510: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
2520: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
2530: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
2540: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
2550: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
2560: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
2570: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2580: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
2590: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
25a0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
25b0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
25c0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
25d0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
25e0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
25f0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
2600: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
2610: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
2620: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
2630: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
2640: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
2650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2660: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
2670: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
2680: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26a0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
26b0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
26c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
26d0: 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a  .** doNotSync.**
26e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
26f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
2700: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
2710: 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a  3PagerWrite()..*
2720: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
2730: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
2740: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
2750: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
2760: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
2770: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
2780: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
2790: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
27a0: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
27b0: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
27c0: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
27d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27e0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
27f0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
2800: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
2810: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
2820: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
2830: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
2840: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
2850: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2860: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2870: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
2880: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
2890: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
28a0: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
28b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
28c0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
28d0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
2900: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
2910: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2920: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2930: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2940: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2950: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2960: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2970: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2980: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2990: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
29a0: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
29b0: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29e0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29f0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
2a00: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
2a10: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a20: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a30: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a40: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a60: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a70: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a80: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2ab0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ac0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ad0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ae0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2af0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2b00: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2b10: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b20: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b30: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b40: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b60: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b80: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b90: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2ba0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2bb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bc0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bd0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2be0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bf0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2c00: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2c10: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c20: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c30: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c40: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c50: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c60: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c70: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c80: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c90: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2ca0: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2cb0: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2cc0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2ce0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cf0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2d00: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2d10: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d20: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d30: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d40: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d50: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d60: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d70: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d80: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d90: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2da0: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2db0: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2dc0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2dd0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2de0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2df0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2e00: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2e10: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e20: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e40: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e50: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e60: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e70: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e90: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2ea0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2eb0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ec0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ed0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ee0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ef0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2f00: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2f10: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f30: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f40: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f50: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f70: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f80: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2fa0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fc0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fd0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fe0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2ff0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3010: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3020: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3030: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3040: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3060: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3070: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
3080: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
3090: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30a0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
30b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
30c0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30f0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3100: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
3110: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
3120: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
3130: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
3140: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3150: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
3160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3170: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
3180: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3190: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
31a0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
31b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
31c0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
31d0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
31e0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
31f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
3200: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
3210: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
3220: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
3230: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
3250: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
3260: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
3270: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
3280: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
3290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32a0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
32b0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
32c0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
32d0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
32e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
32f0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3310: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
3320: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
3330: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3340: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
3350: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
3360: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
3370: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
3380: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
3390: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
33a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
33b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
33c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
33d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
33e0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
33f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3400: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
3410: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
3420: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3430: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
3450: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
3460: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
3470: 61 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53  ader */.  PagerS
3480: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
3490: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
34a0: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
34b0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
34c0: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
34d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34e0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
34f0: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
3500: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
3510: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
3520: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
3530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3540: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73  anges */.  u32 s
3550: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3560: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3570: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3580: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3590: 0a 0a 20 20 75 31 36 20 6e 45 78 74 72 61 3b 20  ..  u16 nExtra; 
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
35c0: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
35d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
35e0: 0a 20 20 69 31 36 20 6e 52 65 73 65 72 76 65 3b  .  i16 nReserve;
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3600: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  * Number of unus
3610: 65 64 20 62 79 74 65 73 20 61 74 20 65 6e 64 20  ed bytes at end 
3620: 6f 66 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  of each page */.
3630: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3650: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
3660: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
3670: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
3680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
36a0: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
36b0: 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20    Pgno mxPgno;  
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d0: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
36e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
36f0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
3700: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
3710: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3720: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
3730: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
3740: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
3750: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3760: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3770: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
3780: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
3790: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
37a0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
37b0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
37c0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
37d0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
37e0: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
37f0: 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66 20  ndler */.#ifdef 
3800: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
3810: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
3820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
3830: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
3840: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
3850: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
3860: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3870: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
3880: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
3890: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
38a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
38b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
38c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
38d0: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
38e0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
38f0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
3900: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3910: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3920: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3930: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3940: 6f 69 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65  oid (*xCodecSize
3950: 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Chng)(void*,int,
3960: 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20  int); /* Notify 
3970: 6f 66 20 70 61 67 65 20 73 69 7a 65 20 63 68 61  of page size cha
3980: 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28  nges */.  void (
3990: 2a 78 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69  *xCodecFree)(voi
39a0: 64 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  d*);            
39b0: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66   /* Destructor f
39c0: 6f 72 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a  or the codec */.
39d0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20    void *pCodec; 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39f0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
3a00: 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74  to xCodec... met
3a10: 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  hods */.#endif. 
3a20: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
3a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3a40: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
3a50: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
3a60: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69  r tmp use */.  i
3a70: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
3a80: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
3a90: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
3aa0: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
3ab0: 66 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68  files */.  PCach
3ac0: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
3ad0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
3ae0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
3af0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
3b00: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
3b10: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
3b20: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
3b30: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
3b40: 63 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  cesses */.};../*
3b50: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
3b60: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
3b70: 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73  es hold counters
3b80: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
3b90: 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e  ting purposes on
3ba0: 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ly.  These varia
3bb0: 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73  bles do not exis
3bc0: 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65  t in.** a non-te
3bd0: 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68  sting build.  Th
3be0: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72  ese variables ar
3bf0: 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66  e not thread-saf
3c00: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3c10: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
3c20: 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
3c30: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20  b_count = 0;    
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c  /* Number of ful
3c50: 6c 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f  l pages read fro
3c60: 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  m DB */.int sqli
3c70: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
3c80: 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f  b_count = 0;   /
3c90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3ca0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
3cb0: 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  o DB */.int sqli
3cc0: 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
3cd0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3ce0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
3cf0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75  s written to jou
3d00: 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65  rnal */.# define
3d10: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20   PAGER_INCR(v)  
3d20: 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  v++.#else.# defi
3d30: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
3d40: 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a  .#endif..../*.**
3d50: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62   Journal files b
3d60: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f  egin with the fo
3d70: 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74  llowing magic st
3d80: 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a  ring.  The data.
3d90: 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ** was obtained 
3da0: 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d  from /dev/random
3db0: 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e  .  It is used on
3dc0: 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63  ly as a sanity c
3dd0: 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63  heck..**.** Sinc
3de0: 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c  e version 2.8.0,
3df0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
3e00: 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64  mat contains add
3e10: 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a  itional sanity.*
3e20: 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  * checking infor
3e30: 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  mation.  If the 
3e40: 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c  power fails whil
3e50: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
3e60: 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65   being.** writte
3e70: 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67  n, semi-random g
3e80: 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68  arbage data migh
3e90: 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  t appear in the 
3ea0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
3eb0: 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72  after power is r
3ec0: 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20  estored.  If an 
3ed0: 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20  attempt is then 
3ee0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20  made.** to roll 
3ef0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  the journal back
3f00: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  , the database c
3f10: 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65  ould be corrupte
3f20: 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e  d.  The addition
3f30: 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65  al.** sanity che
3f40: 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e  cking data is an
3f50: 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63   attempt to disc
3f60: 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65  over the garbage
3f70: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3f80: 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  al and ignore it
3f90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69  ..**.** The sani
3fa0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ty checking info
3fb0: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
3fc0: 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  new journal form
3fd0: 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f  at consists.** o
3fe0: 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b  f a 32-bit check
3ff0: 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  sum on each page
4000: 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63   of data.  The c
4010: 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62  hecksum covers b
4020: 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  oth.** the page 
4030: 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70  number and the p
4040: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
4050: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f  bytes of data fo
4060: 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54  r the page..** T
4070: 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69  his cksum is ini
4080: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32  tialized to a 32
4090: 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75  -bit random valu
40a0: 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69  e that appears i
40b0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
40c0: 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65   file right afte
40d0: 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54  r the header.  T
40e0: 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  he random initia
40f0: 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61  lizer is importa
4100: 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67  nt,.** because g
4110: 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74  arbage data that
4120: 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20   appears at the 
4130: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
4140: 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61   is likely.** da
4150: 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65  ta that was once
4160: 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20   in other files 
4170: 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65  that have now be
4180: 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20  en deleted.  If 
4190: 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64  the.** garbage d
41a0: 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e  ata came from an
41b0: 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61   obsolete journa
41c0: 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63  l file, the chec
41d0: 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62  ksums might.** b
41e0: 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20  e correct.  But 
41f0: 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
4200: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20  the checksum to 
4210: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69  random value whi
4220: 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65  ch.** is differe
4230: 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75  nt for every jou
4240: 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a  rnal, we minimiz
4250: 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a  e that risk..*/.
4260: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
4270: 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72  igned char aJour
4280: 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20  nalMagic[] = {. 
4290: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
42a0: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
42b0: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c  xa1, 0x63, 0xd7,
42c0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .};../*.** The s
42d0: 69 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61  ize of the of ea
42e0: 63 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  ch page record i
42f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
4300: 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65   given by.** the
4310: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
4320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4330: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4340: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4350: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4360: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4370: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
4380: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73  this pager. This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20   is usually the 
43a0: 73 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73  same .** size as
43b0: 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
43c0: 65 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20  ector. See also 
43d0: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e  setSectorSize().
43e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
43f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4400: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
4410: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
4420: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
4430: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
4440: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
4450: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
4460: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
4470: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
4480: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
4490: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
44a0: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
44b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
44c0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
44d0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
44e0: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
44f0: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
4500: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
4510: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
4520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
4530: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
4540: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
4550: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
4560: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
4570: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
4580: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
4590: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
45a0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
45b0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
45c0: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
45d0: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
45e0: 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a   ./*.** Usage:.*
45f0: 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61  *.**   assert( a
4600: 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
4610: 65 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a  e(pPager) );.*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
4630: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
4640: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
4650: 20 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20   /* A temp-file 
4660: 69 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47  is always in PAG
4670: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20  ER_EXCLUSIVE or 
4680: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61  PAGER_SYNCED sta
4690: 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  te. */.  assert(
46a0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
46b0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
46c0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
46d0: 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20  LUSIVE );..  /* 
46e0: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
46f0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
4700: 79 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d  ys set for temp-
4710: 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
4720: 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  t( pPager->tempF
4730: 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  ile==0 || pPager
4740: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
4750: 65 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31  e );..  return 1
4760: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4770: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4780: 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
4790: 20 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a   to write page *
47a0: 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62  pPg into the sub
47b0: 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70  -journal..** A p
47c0: 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
47d0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
47e0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
47f0: 74 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65  there exists one
4800: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e  .** or more open
4810: 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20   savepoints for 
4820: 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  which:.**.**   *
4830: 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   The page-number
4840: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
4850: 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53   equal to PagerS
4860: 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20  avepoint.nOrig, 
4870: 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62  and.**   * The b
4880: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
4890: 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d   to the page-num
48a0: 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69  ber is not set i
48b0: 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61  n.**     PagerSa
48c0: 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
48d0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
48e0: 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73  int subjRequires
48f0: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
4900: 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  {.  Pgno pgno = 
4910: 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  pPg->pgno;.  Pag
4920: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4930: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
4940: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4950: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
4960: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61  nt; i++){.    Pa
4970: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20  gerSavepoint *p 
4980: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
4990: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
49a0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
49b0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
49c0: 74 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53  tvecTest(p->pInS
49d0: 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20  avepoint, pgno) 
49e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
49f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
4a00: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4a10: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
4a20: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
4a30: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
4a40: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nal file..*/.sta
4a50: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f  tic int pageInJo
4a60: 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67  urnal(PgHdr *pPg
4a70: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
4a80: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
4a90: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  g->pPager->pInJo
4aa0: 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
4ab0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
4ac0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4ad0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4ae0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4af0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
4b00: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4b10: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
4b20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4b30: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
4b40: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
4b50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
4b60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
4b70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4b80: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4b90: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4ba0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4bb0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4bc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
4bd0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
4be0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
4bf0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
4c00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
4c10: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
4c20: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
4c30: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
4c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4c50: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
4c60: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
4c70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
4c90: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4ca0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
4cb0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
4cc0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
4cd0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
4ce0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
4cf0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
4d00: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
4d10: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4d20: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
4d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4d40: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4d50: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
4d60: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
4d70: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4d80: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
4d90: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
4da0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
4db0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
4dc0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
4dd0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
4de0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
4df0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4e00: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
4e10: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
4e20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
4e30: 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72  ent to this macr
4e40: 6f 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63  o is a file desc
4e50: 72 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c  riptor (type sql
4e60: 69 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20  ite3_file*)..** 
4e70: 52 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69  Return 0 if it i
4e80: 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e  s not open, or n
4e90: 6f 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74  on-zero (but not
4ea0: 20 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   1) if it is..**
4eb0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74  .** This is so t
4ec0: 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  hat expressions 
4ed0: 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
4ee0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69  s:.**.**   if( i
4ef0: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
4f00: 64 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  d) ){ ....**.** 
4f10: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a  instead of.**.**
4f20: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
4f30: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20  fd->pMethods ){ 
4f40: 2e 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  ....*/.#define i
4f50: 73 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64  sOpen(pFd) ((pFd
4f60: 29 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a  )->pMethods)../*
4f70: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
4f80: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
4f90: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
4fa0: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
4fb0: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
4fc0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
4fd0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
4fe0: 66 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20  f( !isOpen(pFd) 
4ff0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5000: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
5010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55  eturn sqlite3OsU
5020: 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b  nlock(pFd, eLock
5030: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
5040: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
5050: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
5060: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
5070: 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
5080: 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  n.** can be used
5090: 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72   with this pager
50a0: 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  . The optimizati
50b0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  on can be used i
50c0: 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68  f:.**.**  (a) th
50d0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
50e0: 20 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72   by OsDeviceChar
50f0: 61 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e  acteristics() in
5100: 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20  dicates that.** 
5110: 20 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20       a database 
5120: 70 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74  page may be writ
5130: 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20  ten atomically, 
5140: 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20  and.**  (b) the 
5150: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
5160: 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  y OsSectorSize()
5170: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
5180: 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74   equal.**      t
5190: 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  o the page size.
51a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d  .**.** The optim
51b0: 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ization is also 
51c0: 61 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66  always enabled f
51d0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
51e0: 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20  es. It is.** an 
51f0: 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68  error to call th
5200: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70  is function if p
5210: 50 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20  Pager is opened 
5220: 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  on an in-memory.
5230: 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ** database..**.
5240: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  ** If the optimi
5250: 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  zation cannot be
5260: 20 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75   used, 0 is retu
5270: 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20  rned. If it can 
5280: 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e  be used,.** then
5290: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
52a0: 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20  ned is the size 
52b0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
52c0: 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63  ile when it.** c
52d0: 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b  ontains rollback
52e0: 20 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c   data for exactl
52f0: 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  y one page..*/.#
5300: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5310: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
5320: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
5330: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
5340: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
5350: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
5360: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
5370: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
5380: 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20  t dc;           
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53a0: 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63  /* Device charac
53b0: 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20  teristics */.   
53c0: 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20   int nSector;   
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
53f0: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50  e */.    int szP
5400: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
5410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
5420: 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20  ge size */..    
5430: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
5440: 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
5450: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
5460: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
5470: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
5480: 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d  );.    nSector =
5490: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
54a0: 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20  ize;.    szPage 
54b0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
54c0: 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ze;..    assert(
54d0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
54e0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
54f0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  );.    assert(SQ
5500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5510: 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
5520: 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64  );.    if( 0==(d
5530: 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
5540: 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e  ATOMIC|(szPage>>
5550: 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73  8)) || nSector>s
5560: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  zPage) ){.      
5570: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
5580: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f    }..  return JO
5590: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
55a0: 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50  ger) + JOURNAL_P
55b0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a  G_SZ(pPager);.}.
55c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
55d0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
55e0: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
55f0: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
5600: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
5610: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
5620: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
5630: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
5640: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
5650: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
5660: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
5670: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
5680: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
5690: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
56a0: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
56b0: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
56c0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
56d0: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
56e0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
56f0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
5700: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
5710: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5720: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
5730: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
5740: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
5750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
5760: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
5770: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5780: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5790: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
57a0: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
57b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
57c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
57d0: 70 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d  pPage->pData);.}
57e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
57f0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
5800: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
5810: 20 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68   pPage->pageHash
5820: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
5830: 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  h(pPage);.}../*.
5840: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
5850: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
5860: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
5870: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
5880: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
5890: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
58a0: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
58b0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
58c0: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
58d0: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
58e0: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
58f0: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
5900: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
5910: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
5920: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
5930: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
5940: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
5950: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
5960: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
5970: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5980: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
5990: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
59a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
59b0: 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  ode.      || (pP
59c0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
59d0: 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61  IRTY) || pPg->pa
59e0: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
59f0: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
5a00: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
5a10: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
5a20: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
5a40: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
5a50: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
5a60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
5a70: 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a  K_PAGES */../*.*
5a80: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
5a90: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
5aa0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
5ab0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
5ac0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75  open..** This fu
5ad0: 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
5ae0: 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72  to read a master
5af0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
5b00: 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20  me from the .** 
5b10: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
5b20: 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66  and, if successf
5b30: 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e  ul, copies it in
5b40: 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69  to memory suppli
5b50: 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ed .** by the ca
5b60: 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  ller. See commen
5b70: 74 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61  ts above writeMa
5b80: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5b90: 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20  r the format.** 
5ba0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
5bb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5bc0: 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20  ile name at the 
5bd0: 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  end of a journal
5be0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61   file..**.** zMa
5bf0: 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20  ster must point 
5c00: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61  to a buffer of a
5c10: 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20  t least nMaster 
5c20: 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
5c30: 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  by.** the caller
5c40: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
5c50: 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
5c60: 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e  athname+1 (to en
5c70: 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  sure there is.**
5c80: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
5c90: 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65   write the maste
5ca0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e  r journal name).
5cb0: 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   If the master j
5cc0: 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69  ournal.** name i
5cd0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
5ce0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61   longer than nMa
5cf0: 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c  ster bytes (incl
5d00: 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74  uding a.** nul-t
5d10: 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e  erminator), then
5d20: 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64   this is handled
5d30: 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72   as if no master
5d40: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a   journal name.**
5d50: 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e   were present in
5d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
5d70: 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20  .** If a master 
5d80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5d90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20  e is present at 
5da0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
5db0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20  ournal.** file, 
5dc0: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
5dd0: 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  d into the buffe
5de0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
5df0: 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75  zMaster. A.** nu
5e00: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
5e10: 65 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  e is appended to
5e20: 20 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c   the buffer foll
5e30: 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  owing the master
5e40: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
5e50: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
5e60: 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  it is determined
5e70: 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20   that no master 
5e80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5e90: 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a  e is present .**
5ea0: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
5eb0: 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
5ec0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
5ed0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
5ee0: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
5ef0: 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
5f00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e  journal file, an
5f10: 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72   SQLite.** error
5f20: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5f30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5f40: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
5f50: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
5f60: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
5f70: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
5f80: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fa0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
5fb0: 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20   */.  u32 len;  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79   /* Length in by
5fe0: 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  tes of master jo
5ff0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
6000: 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
6010: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
6020: 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tal size in byte
6030: 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  s of journal fil
6040: 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32  e pJrnl */.  u32
6050: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68          /* MJ ch
6070: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61  ecksum value rea
6080: 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a  d from journal *
6090: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
60c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73  counter */.  uns
60d0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
60e0: 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66  c[8];   /* A buf
60f0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6100: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6110: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
6120: 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49  \0';..  if( SQLI
6130: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6140: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6150: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20  Jrnl, &szJ)).   
6160: 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20  || szJ<16.   || 
6170: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
6180: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
6190: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
61a0: 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61  ).   || len>=nMa
61b0: 73 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49  ster .   || SQLI
61c0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
61d0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
61e0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
61f0: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
6200: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
6210: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
6220: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
6230: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
6240: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
6250: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
6260: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
6270: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
6280: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
6290: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
62a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
62b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
62c0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
62d0: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
62e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
62f0: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
6300: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
6310: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
6320: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
6330: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
6340: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
6350: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
6360: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
6370: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
6380: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
6390: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
63a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
63b0: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
63c0: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
63d0: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
63e0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
63f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
6400: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
6410: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
6420: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
6430: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
6440: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
6450: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
6460: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
6470: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6480: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
6490: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
64a0: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
64b0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
64c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
64d0: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
64e0: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
64f0: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
6500: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
6510: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
6520: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
6530: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
6540: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
6550: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
6560: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
6570: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
6610: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
6620: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
6630: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
6640: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
6650: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
6660: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
6670: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
6680: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6690: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
66a0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
66b0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
66c0: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
66d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
66e0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
66f0: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
6700: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6710: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
6720: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
6730: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
6740: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
6750: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
6760: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
6770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
6780: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
6790: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
67a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
67b0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
67c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
67d0: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
67e0: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
67f0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
6800: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
6810: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
6820: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
6830: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
6840: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
6850: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
6860: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
6870: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
6880: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
6890: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
68a0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
68b0: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
68c0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
68d0: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
68e0: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
68f0: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
6900: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
6910: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
6920: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
6930: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
6940: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
6950: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
6960: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
6970: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
6980: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
6990: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
69a0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
69b0: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
69c0: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
69d0: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
69e0: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
69f0: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
6a00: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
6a10: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
6a20: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
6a30: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
6a40: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6a50: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
6a60: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
6a70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
6a80: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
6a90: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
6aa0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
6ab0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
6ac0: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
6ad0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6ae0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
6af0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
6b00: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
6b10: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
6b20: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
6b30: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
6b40: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
6b50: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
6b60: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
6b70: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
6b80: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
6b90: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
6ba0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bc0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
6bd0: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
6be0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
6bf0: 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70  >jfd) );.  if( p
6c00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6c10: 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  f ){.    const i
6c20: 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67  64 iLimit = pPag
6c30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
6c40: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  imit;    /* Loca
6c50: 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a  l cache of jsl *
6c60: 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  /..    IOTRACE((
6c70: 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c  "JZEROHDR %p\n",
6c80: 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66   pPager)).    if
6c90: 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20  ( doTruncate || 
6ca0: 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  iLimit==0 ){.   
6cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6cc0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
6cd0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  ->jfd, 0);.    }
6ce0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74  else{.      stat
6cf0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
6d00: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
6d10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6d20: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6d30: 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c  r->jfd, zeroHdr,
6d40: 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29   sizeof(zeroHdr)
6d50: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
6d60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6d70: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  K && !pPager->no
6d80: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63  Sync ){.      rc
6d90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
6da0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
6db0: 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
6dc0: 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  LY|pPager->sync_
6dd0: 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  flags);.    }.. 
6de0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
6df0: 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  int the transact
6e00: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6e10: 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c   but the write l
6e20: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73  ock .    ** is s
6e30: 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
6e40: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
6e50: 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20  is a size limit 
6e60: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a  configured for .
6e70: 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69      ** the persi
6e80: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  stent journal an
6e90: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
6ea0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
6eb0: 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a  sumes more.    *
6ec0: 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61  * space than tha
6ed0: 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66  t limit allows f
6ee0: 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20  or, truncate it 
6ef0: 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  now. There is no
6f00: 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20   need.    ** to 
6f10: 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f  sync the file fo
6f20: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65  llowing this ope
6f30: 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
6f40: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6f50: 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30  E_OK && iLimit>0
6f60: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a   ){.      i64 sz
6f70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6f80: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6f90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29  Pager->jfd, &sz)
6fa0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
6fb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e  SQLITE_OK && sz>
6fc0: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  iLimit ){.      
6fd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6fe0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6ff0: 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  >jfd, iLimit);. 
7000: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7010: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7020: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
7030: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
7040: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
7050: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7060: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
7070: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
7080: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
7090: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
70a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
70b0: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
70c0: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
70d0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
70e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
70f0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
7100: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
7110: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
7120: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
7130: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
7140: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
7150: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
7160: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
7170: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
7180: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
7190: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
71a0: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
71b0: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
71c0: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
71d0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
71e0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
71f0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
7200: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
7210: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20  journal..** - 4 
7220: 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20  bytes: Database 
7230: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a  page size..** .*
7240: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
7250: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
7260: 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  28) bytes of unu
7270: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
7280: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
7290: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
72a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
72b0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72d0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
72e0: 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72  .  char *zHeader
72f0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
7300: 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72  pace;  /* Tempor
7310: 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74  ary space used t
7320: 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a  o build header *
7330: 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20  /.  u32 nHeader 
7340: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
7350: 7a 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ze;     /* Size 
7360: 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  of buffer pointe
7370: 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20  d to by zHeader 
7380: 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b  */.  u32 nWrite;
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
73b0: 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74  s of header sect
73c0: 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  or written */.  
73d0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7400: 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ter */..  assert
7410: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
7420: 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a  >jfd) );      /*
7430: 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   Journal file mu
7440: 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a  st be open. */..
7450: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
7460: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7470: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
7480: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
7490: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
74a0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
74b0: 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
74c0: 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f  points and any o
74d0: 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61  f them were crea
74e0: 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  ted .  ** since 
74f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
7500: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
7510: 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61  as written, upda
7520: 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  te the .  ** Pag
7530: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
7540: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f  Offset fields no
7550: 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  w..  */.  for(ii
7560: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
7570: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
7580: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
7590: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
75a0: 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  .iHdrOffset==0 )
75b0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
75c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
75d0: 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  HdrOffset = pPag
75e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
7600: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
7610: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7620: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
7630: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
7640: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
7650: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
7660: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
7670: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
7680: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
7690: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
76a0: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
76b0: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
76c0: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
76d0: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
76e0: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
76f0: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
7700: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
7710: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
7720: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
7730: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
7740: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
7750: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
7760: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
7770: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
7780: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
7790: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
77a0: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
77b0: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
77c0: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
77d0: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
77e0: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
77f0: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
7800: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
7810: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
7820: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
7830: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7840: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
7850: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
7860: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
7870: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
7880: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
7890: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
78a0: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
78b0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
78c0: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
78d0: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
78e0: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
78f0: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7900: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
7910: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
7920: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
7930: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
7940: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
7950: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
7960: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
7970: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
7980: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
7990: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
79a0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
79b0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
79c0: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
79d0: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
79e0: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
79f0: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7a00: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
7a10: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7a20: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
7a30: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7a40: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
7a50: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
7a60: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7a70: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
7a80: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7a90: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7aa0: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
7ab0: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7ac0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
7ad0: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7ae0: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7af0: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65  ND) .  ){.    me
7b00: 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
7b10: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7b20: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7b30: 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69  c));.    put32bi
7b40: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7b50: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7b60: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
7b70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
7b80: 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c  mset(zHeader, 0,
7b90: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7ba0: 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a  Magic)+4);.  }..
7bb0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
7bc0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
7bd0: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
7be0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7bf0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
7c00: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
7c10: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7c20: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7c30: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7c40: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
7c50: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7c60: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
7c70: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
7c80: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7c90: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7ca0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7cb0: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
7cc0: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
7cd0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7ce0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
7cf0: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
7d00: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7d10: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d20: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
7d30: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
7d40: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
7d50: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7d60: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7d70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7d80: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
7d90: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
7da0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7db0: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7dc0: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7dd0: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7de0: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7df0: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7e00: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7e10: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7e20: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
7e30: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
7e40: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
7e50: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
7e60: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
7e70: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
7e80: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7e90: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7ea0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7eb0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ec0: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7ed0: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7ee0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7ef0: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
7f00: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
7f10: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
7f20: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
7f30: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
7f40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
7f50: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
7f60: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
7f70: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
7f80: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
7f90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
7fa0: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
7fb0: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
7fc0: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
7fd0: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
7fe0: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
7ff0: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
8000: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
8010: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
8020: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
8030: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
8040: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
8050: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
8060: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
8070: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
8080: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
8090: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
80a0: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
80b0: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
80c0: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
80d0: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
80e0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
80f0: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
8100: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
8110: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
8120: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
8130: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
8140: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
8150: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
8160: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
8170: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
8180: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
8190: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
81a0: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
81b0: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
81c0: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
81d0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
81e0: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
81f0: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
8200: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
8210: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
8220: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
8230: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8240: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
8250: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
8260: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
8270: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
8280: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
8290: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
82a0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
82b0: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
82c0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
82d0: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
82e0: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
82f0: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
8300: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
8310: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
8320: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
8330: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8340: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8350: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
8360: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
8370: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
8380: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
8390: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
83a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
83b0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
83c0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
83d0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
83e0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
83f0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
8400: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8410: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
8420: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8430: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
8440: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
8450: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
8460: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
8470: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
8480: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
8490: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
84a0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
84b0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
84c0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
84d0: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
84e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
84f0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
8500: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
8510: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
8520: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
8530: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
8540: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
8550: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
8560: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
8570: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
8580: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
8590: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
85a0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
85b0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
85c0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
85d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
85e0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
85f0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
8600: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
8610: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
8620: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
8630: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
8640: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
8650: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
8660: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
8670: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
8680: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
8690: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
86a0: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
86b0: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
86c0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
86d0: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
86e0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
86f0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
8700: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8710: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8720: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
8730: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
8740: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
8750: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
8760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
8770: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
8780: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8790: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
87a0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
87b0: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
87c0: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87e0: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
87f0: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8800: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8810: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8820: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8830: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
8840: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
8850: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8860: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8870: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8880: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8890: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
88a0: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
88b0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
88c0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
88d0: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88f0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8900: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8910: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8920: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8930: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
8940: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
8950: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8960: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8970: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8980: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8990: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
89a0: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
89b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
89c0: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
89d0: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
89e0: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
89f0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8a00: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8a10: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8a20: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8a30: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8a40: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8a50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8a60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8a70: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8a80: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8a90: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8aa0: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8ab0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8ac0: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8ad0: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8ae0: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8af0: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8b00: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8b10: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8b20: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8b30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8b40: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8b50: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8b60: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8b70: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8b80: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8b90: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8ba0: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8bb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
8bc0: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
8bd0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
8be0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8bf0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8c00: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8c10: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8c20: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
8c30: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8c40: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8c50: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
8c60: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8c70: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8c80: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
8c90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ca0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8cb0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8cc0: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8cd0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8ce0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8cf0: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8d00: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8d10: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8d30: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8d40: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8d50: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8d60: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8d70: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8d80: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8d90: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8da0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8db0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8dc0: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8dd0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8de0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8df0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e00: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8e10: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8e20: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e30: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e50: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8e60: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8e70: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8e80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8e90: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8ea0: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8ec0: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8ed0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8ee0: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8ef0: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8f00: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8f10: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8f20: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8f30: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8f40: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8f50: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8f60: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8f70: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8f80: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8f90: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8fa0: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8fb0: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8fc0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8fd0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8fe0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8ff0: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
9000: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
9010: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9020: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
9040: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
9050: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
9060: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9070: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
9080: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
9090: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
90a0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
90b0: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
90c0: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
90d0: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
90e0: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
90f0: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
9100: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
9110: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
9120: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9130: 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e 64 20   512 or 32, and 
9140: 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68 61 6e  not greater than
9150: 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a 20 72   their .    ** r
9160: 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70 69 6c  espective compil
9170: 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c  e time maximum l
9180: 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  imits..    */.  
9190: 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c    if( iPageSize<
91a0: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
91b0: 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f 72 53       || iSectorS
91c0: 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69  ize<32.     || i
91d0: 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  PageSize>SQLITE_
91e0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c  MAX_PAGE_SIZE ||
91f0: 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58   iSectorSize>MAX
9200: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20  _SECTOR_SIZE.   
9210: 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65    || ((iPageSize
9220: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d  -1)&iPageSize)!=
9230: 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74 6f 72  0   || ((iSector
9240: 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f 72 53  Size-1)&iSectorS
9250: 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a  ize)!=0 .    ){.
9260: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
9270: 65 69 74 68 65 72 20 74 68 65 20 70 61 67 65 2d  either the page-
9280: 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72 2d 73  size or sector-s
9290: 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ize in the journ
92a0: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a 20 20  al-header is .  
92b0: 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20      ** invalid, 
92c0: 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
92d0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 65 20   that wrote the 
92e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d  journal-header m
92f0: 75 73 74 20 68 61 76 65 20 0a 20 20 20 20 20 20  ust have .      
9300: 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66 6f 72  ** crashed befor
9310: 65 20 74 68 65 20 68 65 61 64 65 72 20 77 61 73  e the header was
9320: 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68 69 73   synced. In this
9330: 20 63 61 73 65 20 73 74 6f 70 20 72 65 61 64 69   case stop readi
9340: 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ng .      ** the
9350: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
9360: 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
9370: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9380: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
9390: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
93a0: 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74  page-size to mat
93b0: 63 68 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  ch the value rea
93c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
93d0: 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73 65 20  al. .    ** Use 
93e0: 61 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63  a testcase() mac
93f0: 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ro to make sure 
9400: 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  that malloc fail
9410: 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20 20 20  ure within .    
9420: 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67 65 73  ** PagerSetPages
9430: 69 7a 65 28 29 20 69 73 20 74 65 73 74 65 64 2e  ize() is tested.
9440: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 50 61 67  .    */.    iPag
9450: 65 53 69 7a 65 31 36 20 3d 20 28 75 31 36 29 69  eSize16 = (u16)i
9460: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
9470: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
9480: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
9490: 72 2c 20 26 69 50 61 67 65 53 69 7a 65 31 36 2c  r, &iPageSize16,
94a0: 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
94b0: 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
94c0: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
94d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
94e0: 7c 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28  | iPageSize16==(
94f0: 75 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b  u16)iPageSize );
9500: 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
9510: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
9520: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
9530: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
9540: 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  by .    ** the p
9550: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
9560: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
9570: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
9580: 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65  l was.    ** cre
9590: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
95a0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
95b0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
95c0: 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
95d0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
95e0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
95f0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
9600: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
9610: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
9620: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
9630: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
9640: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
9650: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
9660: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
9670: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
9680: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
9690: 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e  rnalOff += JOURN
96a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
96b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
96c0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
96d0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
96e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
96f0: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9700: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
9710: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
9720: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
9730: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
9740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
9750: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
9760: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
9770: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
9780: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9790: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
97a0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
97b0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
97c0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
97d0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
97e0: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
97f0: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
9800: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
9810: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  rmat is:.**.**  
9820: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
9830: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20  R_MJ_PGNO..**   
9840: 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + N bytes: Maste
9850: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
9860: 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20  me in utf-8..** 
9870: 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28    + 4 bytes: N (
9880: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
9890: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
98a0: 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74   bytes, no nul-t
98b0: 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20  erminator)..**  
98c0: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
98d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
98e0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b  checksum..**   +
98f0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
9900: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
9910: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
9920: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
9930: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
9940: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
9950: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
9960: 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65  al name, where e
9970: 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65  ach byte is inte
9980: 72 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67  rpreted as a sig
9990: 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65  ned 8-bit intege
99a0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  r..**.** If zMas
99b0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
99c0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
99d0: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
99e0: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
99f0: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
9a00: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
9a10: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
9a20: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
9a30: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
9a40: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
9a50: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a70: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
9a80: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ode */.  int nMa
9a90: 73 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ster;           
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
9ab0: 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d  gth of string zM
9ac0: 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  aster */.  i64 i
9ad0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9af0: 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20  ffset of header 
9b00: 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
9b10: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  */.  i64 jrnlSiz
9b20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9b30: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e   journal file on
9b50: 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63   disk */.  u32 c
9b60: 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20  ksum = 0;       
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
9b80: 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e  hecksum of strin
9b90: 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20  g zMaster */..  
9ba0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
9bb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
9bc0: 72 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  r.   || pPager->
9bd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9be0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
9bf0: 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61  EMORY .   || pPa
9c00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
9c10: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9c20: 4f 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20  ODE_OFF .  ){.  
9c30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c40: 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
9c50: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
9c60: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
9c70: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
9c80: 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  ;..  /* Calculat
9c90: 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20  e the length in 
9ca0: 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68  bytes and the ch
9cb0: 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65  ecksum of zMaste
9cc0: 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74  r */.  for(nMast
9cd0: 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d  er=0; zMaster[nM
9ce0: 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b  aster]; nMaster+
9cf0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
9d00: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9d10: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
9d20: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9d30: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
9d40: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
9d50: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
9d60: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
9d70: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
9d80: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
9d90: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
9da0: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
9db0: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
9dc0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
9dd0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
9de0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
9df0: 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
9e00: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
9e10: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
9e20: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
9e30: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
9e40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
9e50: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73  /* Write the mas
9e60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61  ter journal data
9e70: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
9e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
9e90: 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   If.  ** an erro
9ea0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
9eb0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
9ec0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
9ed0: 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20   */.  if( (0 != 
9ee0: 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74  (rc = write32bit
9ef0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
9f00: 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  HdrOff, PAGER_MJ
9f10: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29  _PGNO(pPager))))
9f20: 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
9f30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9f40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
9f50: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c  Master, nMaster,
9f60: 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20   iHdrOff+4))).  
9f70: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9f80: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9f90: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9fa0: 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73  +4+nMaster, nMas
9fb0: 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  ter))).   || (0 
9fc0: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9fd0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9fe0: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9ff0: 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a  ter+4, cksum))).
a000: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
a010: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
a020: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  (pPager->jfd, aJ
a030: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20  ournalMagic, 8, 
a040: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
a050: 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20  r+8))).  ){.    
a060: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
a070: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
a080: 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b  Off += (nMaster+
a090: 32 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  20);.  pPager->n
a0a0: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
a0b0: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a  r->noSync;..  /*
a0c0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a0d0: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
a0e0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
a0f0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
a100: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
a110: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
a120: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a130: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
a140: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
a150: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
a160: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
a170: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
a180: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
a190: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
a1a0: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
a1b0: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
a1c0: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
a1d0: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
a1e0: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
a1f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
a200: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
a210: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
a220: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
a230: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
a240: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
a250: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
a260: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
a270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
a280: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
a290: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
a2a0: 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
a2b0: 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
a2c0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
a2d0: 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
a2e0: 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
a2f0: 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
a300: 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
a320: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
a330: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
a340: 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
a350: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a360: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
a370: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
a380: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
a390: 6e 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a  number. Return.*
a3a0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
a3b0: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
a3c0: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
a3d0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a   page is not .**
a3e0: 20 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f   already in memo
a3f0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  ry..*/.static Pg
a400: 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75  Hdr *pager_looku
a410: 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
a420: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
a430: 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20  gHdr *p;        
a440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a450: 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
a460: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
a470: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
a480: 20 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68   a call to Pcach
a490: 65 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72  eFetch() with cr
a4a0: 65 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20  eateFlag==0 to. 
a4b0: 20 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20   ** fail, since 
a4c0: 6e 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  no attempt to al
a4d0: 6c 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d  locate dynamic m
a4e0: 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61  emory will be ma
a4f0: 64 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64  de..  */.  (void
a500: 29 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65  )sqlite3PcacheFe
a510: 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
a520: 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
a530: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
a540: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74  ../*.** Unless t
a550: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a560: 72 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63  rror-state, disc
a570: 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
a580: 79 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74  y pages. If.** t
a590: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
a5a0: 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e  rror-state, then
a5b0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
a5c0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  no-op..**.** TOD
a5d0: 4f 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e 6f  O: Why can we no
a5e0: 74 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  t reset the page
a5f0: 72 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f 72  r while in error
a600: 20 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69   state?.*/.stati
a610: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
a620: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
a630: 29 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ){.  if( SQLITE_
a640: 4f 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72 43  OK==pPager->errC
a650: 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
a660: 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
a670: 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
a680: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
a690: 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d  cheClear(pPager-
a6a0: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 70  >pPCache);.    p
a6b0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
a6c0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
a6d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
a6e0: 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
a6f0: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
a700: 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
a710: 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
a720: 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
a730: 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
a740: 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
a750: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
a760: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
a770: 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
a780: 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
a790: 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
a7a0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
a7b0: 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
a7c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
a7d0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
a7e0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
a7f0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
a800: 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
a810: 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
a820: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
a830: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
a840: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
a850: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
a860: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
a870: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
a880: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
a890: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
a8a0: 20 7c 7c 20 73 71 6c 69 74 65 33 49 73 4d 65 6d   || sqlite3IsMem
a8b0: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
a8c0: 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
a8d0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
a8e0: 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
a8f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
a900: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a910: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
a920: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
a930: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
a940: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
a950: 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
a960: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
a970: 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
a980: 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
a990: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
a9a0: 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
a9b0: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
a9c0: 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
a9d0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
a9e0: 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
a9f0: 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
aa00: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
aa10: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
aa20: 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
aa30: 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
aa40: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
aa50: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa70: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
aa80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
aa90: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
aaa0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
aab0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
aac0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
aad0: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
aae0: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
aaf0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
ab00: 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
ab10: 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
ab20: 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
ab30: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
ab40: 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
ab50: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
ab60: 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
ab70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
ab80: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
ab90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
aba0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
abb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
abc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
abd0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
abe0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
abf0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
ac00: 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65  o-op if the page
ac10: 72 0a 2a 2a 20 69 73 20 69 6e 20 65 78 63 6c 75  r.** is in exclu
ac20: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  sive mode..**.**
ac30: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
ac40: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72   currently in er
ac50: 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61  ror state, disca
ac60: 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  rd the contents 
ac70: 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  of .** the cache
ac80: 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50   and reset the P
ac90: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69  ager structure i
aca0: 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49  nternal state. I
acb0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  f there is.** an
acc0: 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69   open journal-fi
acd0: 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78  le, then the nex
ace0: 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d  t time a shared-
acf0: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
ad00: 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72  .** on the pager
ad10: 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f   file (by this o
ad20: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
ad30: 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65  ess), it will be
ad40: 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61  .** treated as a
ad50: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
ad60: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
ad70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
ad80: 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20  er_unlock(Pager 
ad90: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
ada0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
adb0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e  veMode ){.    in
adc0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
add0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ade0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
adf0: 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73    /* Always clos
ae00: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
ae10: 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67  le when dropping
ae20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
ae30: 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72  ck..    ** Other
ae40: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
ae50: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
ae60: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
ae70: 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64  e might.    ** d
ae80: 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f  elete the file o
ae90: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73  ut from under us
aea0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
aeb0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
aec0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 73 71  er->jfd);.    sq
aed0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
aee0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
aef0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
af00: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
af10: 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 41   0;.    releaseA
af20: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
af30: 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
af40: 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c   the file is unl
af50: 6f 63 6b 65 64 2c 20 73 6f 6d 65 62 6f 64 79 20  ocked, somebody 
af60: 65 6c 73 65 20 6d 69 67 68 74 20 63 68 61 6e 67  else might chang
af70: 65 20 69 74 2e 20 54 68 65 0a 20 20 20 20 2a 2a  e it. The.    **
af80: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
af90: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20 65  n Pager.dbSize e
afa0: 74 63 2e 20 6d 69 67 68 74 20 62 65 63 6f 6d 65  tc. might become
afb0: 20 69 6e 76 61 6c 69 64 20 69 66 0a 20 20 20 20   invalid if.    
afc0: 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  ** this happens.
afd0: 20 20 4f 6e 65 20 63 61 6e 20 61 72 67 75 65 20    One can argue 
afe0: 74 68 61 74 20 74 68 69 73 20 64 6f 65 73 6e 27  that this doesn'
aff0: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
b000: 61 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69  ared.    ** unti
b010: 6c 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  l the change-cou
b020: 6e 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73  nter check fails
b030: 20 69 6e 20 50 61 67 65 72 53 68 61 72 65 64 4c   in PagerSharedL
b040: 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2a 20 43 6c  ock()..    ** Cl
b050: 65 61 72 69 6e 67 20 74 68 65 20 70 61 67 65 20  earing the page 
b060: 73 69 7a 65 20 63 61 63 68 65 20 68 65 72 65 20  size cache here 
b070: 69 73 20 62 65 69 6e 67 20 63 6f 6e 73 65 72 76  is being conserv
b080: 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ative..    */.  
b090: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b0a0: 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20  Valid = 0;..    
b0b0: 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  rc = osUnlock(pP
b0c0: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
b0d0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  K);.    if( rc )
b0e0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
b0f0: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
b100: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
b110: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
b120: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a  pPager))..    /*
b130: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
b140: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
b150: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
b160: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
b170: 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74   be.    ** trust
b180: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
b190: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
b1a0: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
b1b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
b1c0: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
b1d0: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
b1e0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
b1f0: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
b200: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
b210: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b220: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b230: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b240: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
b250: 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
b260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
b270: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
b280: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
b290: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
b2a0: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70  tDone = 0;.    p
b2b0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
b2c0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
b2d0: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
b2e0: 69 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ied = 0;.  }.}..
b2f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
b300: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ion should be ca
b310: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4f 45  lled when an IOE
b320: 52 52 2c 20 43 4f 52 52 55 50 54 20 6f 72 20 46  RR, CORRUPT or F
b330: 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20 6d 61 79  ULL error.** may
b340: 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2e 20   have occurred. 
b350: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
b360: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
b370: 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a 2a 2a  to the pager .**
b380: 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 20   structure, the 
b390: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
b3a0: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
b3b0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
b3c0: 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20 66 75  pager .** API fu
b3d0: 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75  nction. The valu
b3e0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
b3f0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
b400: 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20  nd argument .** 
b410: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
b420: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
b430: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
b440: 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  is SQLITE_IOERR,
b450: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
b460: 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a   or SQLITE_FULL.
b470: 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62 65 63  ** the error bec
b480: 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e  omes persistent.
b490: 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69   Until the persi
b4a0: 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c  sten error is cl
b4b0: 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71  eared,.** subseq
b4c0: 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f  uent API calls o
b4d0: 6e 20 74 68 69 73 20 50 61 67 65 72 20 77 69 6c  n this Pager wil
b4e0: 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
b4f0: 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a  turn the same .*
b500: 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  * error code..**
b510: 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74  .** A persistent
b520: 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73   error indicates
b530: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
b540: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
b550: 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
b560: 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
b570: 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
b580: 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
b590: 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
b5a0: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
b5b0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
b5c0: 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
b5d0: 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
b5e0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
b5f0: 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
b600: 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
b610: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
b620: 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
b630: 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
b640: 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
b650: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
b660: 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
b670: 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
b680: 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
b690: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
b6a0: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
b6b0: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
b6c0: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
b6d0: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
b6e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b6f0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
b700: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
b710: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
b720: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
b730: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b740: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
b750: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
b760: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
b770: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
b780: 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
b790: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
b7a0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
b7b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
b7c0: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a  rCode = rc;.  }.
b7d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b7e0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
b7f0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
b800: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
b810: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
b820: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
b830: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
b840: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
b850: 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68  ready entered th
b860: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  e error state, d
b870: 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a  o not attempt .*
b880: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61  * the rollback a
b890: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73  t this time. Ins
b8a0: 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f  tead, pager_unlo
b8b0: 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20  ck() is called. 
b8c0: 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70  The.** call to p
b8d0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
b8e0: 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  ll discard all i
b8f0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20  n-memory pages, 
b900: 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61  unlock.** the da
b910: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
b920: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
b930: 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d  state. If this m
b940: 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65  eans that.** the
b950: 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  re is a hot-jour
b960: 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20  nal left in the 
b970: 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65  file-system, the
b980: 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   next connection
b990: 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
b9a0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
b9b0: 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20  he pager (which 
b9c0: 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29  may be this one)
b9d0: 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74   will.** roll it
b9e0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
b9f0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f  the pager has no
ba00: 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  t already entere
ba10: 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  d the error stat
ba20: 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a  e, but an IO or.
ba30: 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20  ** malloc error 
ba40: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
ba50: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
ba60: 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20  his will itself 
ba70: 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61  cause .** the pa
ba80: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
ba90: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68   error state. Wh
baa0: 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ich will be clea
bab0: 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61  red by the.** ca
bac0: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
bad0: 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62  ck(), as describ
bae0: 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61  ed above..*/.sta
baf0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
bb00: 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
bb10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bb20: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
bb30: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
bb40: 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
bb50: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
bb60: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
bb70: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
bb80: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
bb90: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
bba0: 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  ager);.    sqlit
bbb0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
bbc0: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
bbd0: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
bbe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
bbf0: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
bc00: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
bc10: 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
bc20: 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
bc30: 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
bc40: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
bc50: 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
bc60: 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
bc70: 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
bc80: 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
bc90: 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
bca0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
bcb0: 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
bcc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bcd0: 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
bce0: 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
bcf0: 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
bd00: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
bd10: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
bd20: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
bd30: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
bd40: 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  or PAGER_UNLOCK 
bd50: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
bd60: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
bd70: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
bd80: 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c  -op (returns SQL
bd90: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f  ITE_OK)..**.** O
bda0: 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63  therwise, any ac
bdb0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
bdc0: 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a  are released..**
bdd0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
bde0: 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c  al file is open,
bdf0: 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e   then it is "fin
be00: 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20  alized". Once a 
be10: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65  journal .** file
be20: 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
be30: 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  zed it is not po
be40: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74  ssible to use it
be50: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20   to roll back a 
be60: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
be70: 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20   Nor will it be 
be80: 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
be90: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
bea0: 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79  y this.** or any
beb0: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
bec0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63  connection. Exac
bed0: 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61  tly how a journa
bee0: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a  l is finalized.*
bef0: 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  * depends on whe
bf00: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bf10: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
bf20: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
bf30: 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75  de and.** the cu
bf40: 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  rrent journal-mo
bf50: 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61  de (Pager.journa
bf60: 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73  lMode value), as
bf70: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
bf80: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d    journalMode==M
bf90: 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75  EMORY.**     Jou
bfa0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
bfb0: 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63  ptor is simply c
bfc0: 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74  losed. This dest
bfd0: 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20  roys an .**     
bfe0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
bff0: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  l..**.**   journ
c000: 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45  alMode==TRUNCATE
c010: 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20  .**     Journal 
c020: 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
c030: 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  d to zero bytes 
c040: 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20  in size..**.**  
c050: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45   journalMode==PE
c060: 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65  RSIST.**     The
c070: 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20   first 28 bytes 
c080: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
c090: 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ile are zeroed. 
c0a0: 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73  This invalidates
c0b0: 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73  .**     the firs
c0c0: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c0d0: 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e   in the file, an
c0e0: 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69  d hence the enti
c0f0: 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  re journal.**   
c100: 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c    file. An inval
c110: 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  id journal file 
c120: 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
c130: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a   back..**.**   j
c140: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45  ournalMode==DELE
c150: 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f  TE.**     The jo
c160: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c  urnal file is cl
c170: 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
c180: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73   using sqlite3Os
c190: 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  Delete()..**.** 
c1a0: 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72      If the pager
c1b0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65   is running in e
c1c0: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
c1d0: 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69  his method of fi
c1e0: 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20  nalizing.**     
c1f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c200: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20   is never used. 
c210: 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20  Instead, if the 
c220: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a  journalMode is.*
c230: 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64  *     DELETE and
c240: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
c250: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
c260: 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63   the method desc
c270: 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20  ribed under.**  
c280: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
c290: 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20  PERSIST is used 
c2a0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41  instead..**.** A
c2b0: 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
c2c0: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69   is finalized, i
c2d0: 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
c2e0: 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  -exclusive mode,
c2f0: 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f   the.** pager mo
c300: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ves to PAGER_SHA
c310: 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64  RED state (and d
c320: 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f  owngrades the lo
c330: 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ck on the.** dat
c340: 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72  abase file accor
c350: 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49  dingly)..**.** I
c360: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
c370: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
c380: 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20  ive mode and is 
c390: 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  in PAGER_SYNCED 
c3a0: 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76  state,.** it mov
c3b0: 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c  es to PAGER_EXCL
c3c0: 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20  USIVE. No locks 
c3d0: 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77  are downgraded w
c3e0: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a  hen running in.*
c3f0: 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  * exclusive mode
c400: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
c410: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
c420: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
c430: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
c440: 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
c450: 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
c460: 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
c470: 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
c480: 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
c490: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
c4a0: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
c4b0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
c4c0: 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
c4d0: 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
c4e0: 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
c4f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c500: 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
c510: 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
c520: 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
c530: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c540: 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
c550: 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
c560: 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
c570: 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
c580: 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
c590: 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
c5a0: 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
c5b0: 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
c5c0: 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
c5d0: 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
c5e0: 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
c5f0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
c600: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
c610: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
c620: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
c630: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
c640: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c650: 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
c660: 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ode from journal
c670: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70   finalization op
c680: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
c690: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
c6a0: 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63  ;     /* Error c
c6b0: 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65  ode from db file
c6c0: 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
c6d0: 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  n */..  if( pPag
c6e0: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
c6f0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
c700: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c710: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
c720: 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
c730: 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ger);..  assert(
c740: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
c750: 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
c760: 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
c770: 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
c780: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20  ager->jfd) ){.. 
c790: 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74     /* Finalize t
c7a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c7b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
c7c0: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
c7d0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
c7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
c7f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c800: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c810: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
c820: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
c830: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
c840: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
c850: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
c860: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
c870: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
c880: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
c890: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
c8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
c8b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c8d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c8e0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
c8f0: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
c900: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
c910: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
c920: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c930: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
c940: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
c950: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
c960: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
c970: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
c980: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
c990: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
c9a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
c9b0: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
c9c0: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
c9d0: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
c9e0: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
c9f0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
ca00: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
ca10: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
ca20: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
ca30: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
ca40: 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
ca50: 63 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74  ch may be execut
ca60: 65 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f  ed with Pager.jo
ca70: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52  urnalMode==MEMOR
ca80: 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20  Y if.      ** a 
ca90: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20  hot-journal was 
caa0: 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b  just rolled back
cab0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
cac0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
cad0: 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20   ** file should 
cae0: 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  be closed and de
caf0: 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63  leted. If this c
cb00: 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
cb10: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
cb20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
cb30: 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73  it will do so us
cb40: 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ing an in-memory
cb50: 20 6a 6f 75 72 6e 61 6c 2e 20 20 2a 2f 0a 20 20   journal.  */.  
cb60: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
cb80: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
cb90: 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20  DE_DELETE .     
cba0: 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
cbb0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cbc0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cbd0: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 29 3b  MEMORY .      );
cbe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
cbf0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
cc00: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  d);.      if( !p
cc10: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
cc20: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
cc30: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
cc40: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
cc50: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
cc60: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
cc70: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
cc80: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
cc90: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
cca0: 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
ccb0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
ccc0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
ccd0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71  .#endif.  }.  sq
cce0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
ccf0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
cd00: 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
cd10: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
cd20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
cd30: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50   = 0;.  sqlite3P
cd40: 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
cd50: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
cd60: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
cd70: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
cd80: 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c  .    rc2 = osUnl
cd90: 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
cda0: 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
cdb0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
cdc0: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
cdd0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
cde0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
cdf0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
ce00: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
ce10: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
ce20: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
ce30: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
ce40: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
ce50: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
ce60: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
ce70: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
ce80: 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a  dbModified = 0;.
ce90: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74  .  /* TODO: Is t
cea0: 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79  his optimal? Why
ceb0: 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20   is the db size 
cec0: 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65  invalidated here
ced0: 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20   .  ** when the 
cee0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
cef0: 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a   not unlocked? *
cf00: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  /.  pPager->dbOr
cf10: 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71  igSize = 0;.  sq
cf20: 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
cf30: 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
cf40: 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
cf50: 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ize);.  if( !MEM
cf60: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
cf70: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
cf80: 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  0;.  }..  return
cf90: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
cfa0: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
cfb0: 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
cfc0: 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
cfd0: 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
cfe0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
cff0: 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
d000: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
d010: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
d020: 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
d030: 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
d040: 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
d050: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
d060: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
d070: 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
d080: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
d090: 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
d0a0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
d0b0: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
d0c0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
d0d0: 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
d0e0: 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
d0f0: 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
d100: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
d110: 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
d120: 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
d130: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
d140: 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
d150: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
d160: 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
d170: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
d180: 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
d190: 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
d1a0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
d1b0: 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
d1c0: 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
d1d0: 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
d1e0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
d1f0: 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
d200: 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
d210: 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
d220: 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
d230: 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
d240: 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
d250: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
d260: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
d270: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
d280: 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
d290: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
d2a0: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
d2b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
d2c0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
d2d0: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
d2e0: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
d2f0: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
d300: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
d310: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
d320: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
d330: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
d340: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
d350: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
d360: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
d370: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
d380: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
d390: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
d3a0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
d3b0: 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
d3c0: 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
d3d0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
d3e0: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
d3f0: 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
d400: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
d410: 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
d420: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
d430: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
d440: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
d450: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
d460: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
d470: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
d480: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
d490: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
d4a0: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
d4b0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
d4c0: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
d4d0: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
d4e0: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
d4f0: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
d500: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
d510: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
d520: 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66   file. The *pOff
d530: 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20  set.** value is 
d540: 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65  increased to the
d550: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
d560: 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  xt page in the j
d570: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
d580: 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61  e isMainJrnl fla
d590: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69  g is true if thi
d5a0: 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f  s is the main ro
d5b0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
d5c0: 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  nd.** false for 
d5d0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d5e0: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e  urnal.  The main
d5f0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d600: 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73  l uses.** checks
d610: 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d  ums - the statem
d620: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  ent journal does
d630: 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   not..**.** If t
d640: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
d650: 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72  f the page recor
d660: 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  d read from the 
d670: 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69  (sub-)journal fi
d680: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
d690: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
d6a0: 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
d6b0: 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c  .dbSize, then pl
d6c0: 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69  ayback is.** ski
d6d0: 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  pped and SQLITE_
d6e0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
d6f0: 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69  **.** If pDone i
d700: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
d710: 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20   it is a record 
d720: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
d730: 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  ve already.** be
d740: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  en played back. 
d750: 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20   If the page at 
d760: 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72  *pOffset has alr
d770: 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64  eady been played
d780: 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65   back.** (if the
d790: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70   corresponding p
d7a0: 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29  Done bit is set)
d7b0: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70   then skip the p
d7c0: 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65  layback..** Make
d7d0: 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20   sure the pDone 
d7e0: 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  bit correspondin
d7f0: 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65  g to the *pOffse
d800: 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a  t page is set.**
d810: 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e   prior to return
d820: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ing..**.** If th
d830: 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73  e page record is
d840: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
d850: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
d860: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  -)journal file.*
d870: 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63  * and played bac
d880: 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  k, then SQLITE_O
d890: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  K is returned. I
d8a0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d8b0: 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65  curs.** while re
d8c0: 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64  ading the record
d8d0: 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
d8e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
d8f0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a  while writing.**
d900: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
d910: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
d920: 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
d930: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61   returned. If da
d940: 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73  ta.** is success
d950: 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
d960: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
d970: 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61  l file but appea
d980: 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72  rs to be.** corr
d990: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
d9a0: 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
d9b0: 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72  Data is consider
d9c0: 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a  ed corrupted in.
d9d0: 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  ** two circumsta
d9e0: 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a  nces:.** .**   *
d9f0: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70   If the record p
da00: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c  age-number is il
da10: 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45  legal (0 or PAGE
da20: 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a  R_MJ_PGNO), or.*
da30: 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
da40: 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ord is being rol
da50: 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  led back from th
da60: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
da70: 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ile.**     and t
da80: 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c  he checksum fiel
da90: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  d does not match
daa0: 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74   the record cont
dab0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68  ent..**.** Neith
dac0: 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20  er of these two 
dad0: 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f  scenarios are po
dae0: 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20  ssible during a 
daf0: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
db00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ck..**.** If thi
db10: 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  s is a savepoint
db20: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
db30: 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20  memory may have 
db40: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
db50: 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  y.** allocated b
db60: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
db70: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
db80: 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f  case and an allo
db90: 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a  cation fails,.**
dba0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
dbb0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
dbc0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
dbd0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
dbe0: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
dbf0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
dc00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62    /* The pager b
dc10: 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b  eing played back
dc20: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e   */.  int isMain
dc30: 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Jrnl,           
dc40: 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e      /* 1 -> main
dc50: 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73   journal. 0 -> s
dc60: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
dc70: 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20 20   int isUnsync,  
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc90: 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e  * True if readin
dca0: 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64 20  g from unsynced 
dcb0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
dcc0: 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
dcf0: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
dd00: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
dd10: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
dd20: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
dd30: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dd40: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
dd50: 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  *pDone          
dd60: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
dd70: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
dd80: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
dd90: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
dda0: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ddc0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
ddd0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
dde0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
de10: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
de20: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
de30: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de50: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
de60: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
de70: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
de80: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
de90: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
dea0: 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
deb0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
dec0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
ded0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dee0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
def0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
df00: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
df10: 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
df20: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
df30: 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
df40: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
df50: 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
df60: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
df70: 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
df80: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
df90: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
dfa0: 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
dfb0: 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
dfc0: 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
dfd0: 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
dfe0: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
dff0: 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
e000: 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
e010: 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
e020: 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50  */..  aData = pP
e030: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
e040: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
e050: 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   );         /* T
e060: 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74  emp storage must
e070: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
e080: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
e090: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
e0a0: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
e0b0: 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
e0c0: 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
e0d0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
e0e0: 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
e0f0: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
e100: 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
e110: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
e120: 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
e130: 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
e140: 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
e150: 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
e160: 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
e170: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
e180: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e190: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e1a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
e1b0: 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
e1c0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e1d0: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
e1e0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
e1f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e200: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
e210: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
e220: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
e230: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
e240: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
e250: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
e260: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
e270: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
e280: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
e290: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
e2a0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
e2b0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
e2c0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
e2d0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
e2e0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
e2f0: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
e300: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
e310: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
e320: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
e330: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
e340: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
e350: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
e360: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
e370: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
e380: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
e390: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
e3a0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
e3b0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
e3c0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
e3d0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
e3e0: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
e3f0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
e400: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
e410: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e420: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e430: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
e440: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
e450: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
e460: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
e470: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
e480: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
e490: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
e4a0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
e4b0: 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
e4c0: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
e4d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
e4e0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
e4f0: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
e500: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
e510: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
e520: 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  o))!=SQLITE_OK )
e530: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e540: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
e550: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
e560: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
e570: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
e580: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
e590: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e5a0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
e5b0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
e5c0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
e5d0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
e5e0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
e5f0: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
e600: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
e610: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
e620: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
e630: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e640: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
e650: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
e660: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
e670: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
e680: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
e690: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
e6a0: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
e6b0: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
e6c0: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
e6d0: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
e6e0: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
e6f0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
e700: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
e710: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
e720: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
e730: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
e740: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
e750: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
e760: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
e770: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
e780: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
e790: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
e7a0: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
e7b0: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
e7c0: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
e7d0: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
e7e0: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
e7f0: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
e800: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
e810: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
e820: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
e830: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
e840: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
e850: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
e860: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
e870: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
e880: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
e890: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
e8a0: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
e8b0: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
e8c0: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
e8d0: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
e8e0: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
e8f0: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
e900: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
e910: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
e920: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
e930: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
e940: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
e950: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
e960: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
e970: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
e980: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
e990: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
e9a0: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
e9b0: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
e9c0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
e9d0: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
e9e0: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
e9f0: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
ea00: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
ea10: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
ea20: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
ea30: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
ea40: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
ea50: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
ea60: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
ea70: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
ea80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
ea90: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
eaa0: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
eab0: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
eac0: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
ead0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
eae0: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
eaf0: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
eb00: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
eb10: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
eb20: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
eb30: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
eb40: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
eb50: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
eb60: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
eb70: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
eb80: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
eb90: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
eba0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
ebb0: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
ebc0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
ebd0: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
ebe0: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
ebf0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
ec00: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
ec10: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
ec20: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
ec30: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
ec40: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
ec50: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
ec60: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
ec70: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
ec80: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
ec90: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
eca0: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
ecb0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
ecc0: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
ecd0: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
ece0: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
ecf0: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ed00: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ed10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
ed20: 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41  | !MEMDB );.  PA
ed30: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
ed40: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
ed50: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
ed60: 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
ed70: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
ed80: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
ed90: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
eda0: 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
edb0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
edc0: 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
edd0: 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
ede0: 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
edf0: 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
ee00: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
ee10: 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d 30  E).   && (pPg==0
ee20: 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
ee30: 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
ee40: 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70 65  NC)).   && isOpe
ee50: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20  n(pPager->fd).  
ee60: 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20 20   && !isUnsync.  
ee70: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
ee80: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
ee90: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
eea0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
eeb0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
eec0: 2d 3e 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61  ->fd, (u8*)aData
eed0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
eee0: 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ze, ofst);.    i
eef0: 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
ef00: 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20  dbFileSize ){.  
ef10: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
ef20: 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
ef30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
ef40: 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
ef50: 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
ef60: 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
ef70: 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
ef80: 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c  OMEM);.      sql
ef90: 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
efa0: 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
efb0: 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
efc0: 74 61 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ta);.      CODEC
efd0: 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
efe0: 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
eff0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61  ITE_NOMEM, aData
f000: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
f010: 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
f020: 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
f030: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
f040: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
f050: 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
f060: 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
f070: 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
f080: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
f090: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
f0a0: 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
f0b0: 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
f0c0: 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
f0d0: 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
f0e0: 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
f0f0: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
f100: 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
f110: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f120: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
f130: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
f140: 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
f150: 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
f160: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
f170: 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
f180: 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
f190: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
f1a0: 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
f1b0: 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
f1c0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
f1d0: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
f1e0: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
f1f0: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
f200: 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
f210: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
f220: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f230: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
f240: 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
f250: 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
f260: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
f270: 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
f280: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
f290: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
f2a0: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
f2b0: 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
f2c0: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
f2d0: 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
f2e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
f2f0: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
f300: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
f310: 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
f320: 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
f330: 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
f340: 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
f350: 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
f360: 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
f370: 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
f380: 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
f390: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f3a0: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
f3b0: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  ;.    if( (rc = 
f3c0: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
f3d0: 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
f3e0: 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c  , &pPg, 1))!=SQL
f3f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f400: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f410: 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
f420: 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
f430: 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
f440: 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
f450: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
f460: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
f470: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
f480: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
f490: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
f4a0: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
f4b0: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
f4c0: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
f4d0: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
f4e0: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
f4f0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
f500: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
f510: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
f520: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
f530: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
f540: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
f550: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
f560: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
f570: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
f580: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
f590: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
f5a0: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
f5b0: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
f5c0: 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
f5d0: 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
f5e0: 61 74 61 2c 20 28 75 38 2a 29 61 44 61 74 61 2c  ata, (u8*)aData,
f5f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
f600: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
f610: 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
f620: 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
f630: 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
f640: 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
f650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f660: 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
f670: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
f680: 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
f690: 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
f6a0: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
f6b0: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
f6c0: 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
f6d0: 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
f6e0: 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
f6f0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
f700: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
f710: 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
f720: 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
f730: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
f740: 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
f750: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
f760: 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
f770: 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
f780: 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  the..      **.  
f790: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
f7a0: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
f7b0: 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
f7c0: 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
f7d0: 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
f7e0: 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
f7f0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
f800: 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
f810: 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
f820: 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
f830: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
f840: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
f850: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
f860: 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
f870: 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
f880: 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
f890: 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
f8a0: 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
f8b0: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
f8c0: 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
f8d0: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f8e0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
f8f0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
f900: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
f910: 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
f920: 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
f930: 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
f940: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
f950: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
f960: 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
f970: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
f980: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
f990: 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
f9a0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
f9b0: 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
f9c0: 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
f9d0: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
f9e0: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
f9f0: 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
fa00: 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
fa10: 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
fa20: 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
fa30: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
fa40: 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
fa50: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
fa60: 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
fa70: 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
fa80: 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
fa90: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
faa0: 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
fab0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
fac0: 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
fad0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
fae0: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
faf0: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
fb00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
fb10: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
fb20: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
fb30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
fb40: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
fb50: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
fb60: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
fb70: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
fb80: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
fb90: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
fba0: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
fbb0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
fbc0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
fbd0: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
fbe0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
fbf0: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
fc00: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
fc10: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
fc20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
fc30: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
fc40: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
fc50: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
fc60: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
fc70: 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
fc80: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
fc90: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
fca0: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
fcb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fcc0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
fcd0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
fce0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
fcf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
fd00: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
fd10: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
fd20: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
fd30: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
fd40: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
fd50: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
fd60: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
fd70: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
fd80: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
fd90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
fda0: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
fdb0: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
fdc0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
fdd0: 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
fde0: 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
fdf0: 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
fe00: 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
fe10: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
fe20: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
fe30: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
fe40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
fe50: 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
fe60: 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
fe70: 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
fe80: 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
fe90: 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
fea0: 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
feb0: 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
fec0: 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
fed0: 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
fee0: 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
fef0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
ff00: 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
ff10: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
ff20: 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
ff30: 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
ff40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
ff50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
ff60: 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
ff70: 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
ff80: 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
ff90: 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
ffa0: 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
ffb0: 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
ffc0: 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
ffd0: 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
ffe0: 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
fff0: 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
10000 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
10010 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
10020 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
10030 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
10040 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
10050 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
10060 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10070 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
10080 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
10090 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
100a0 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
100b0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
100c0 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
100d0 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
100e0 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
100f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
10100 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
10110 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
10120 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
10130 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
10140 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
10150 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
10160 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
10170 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
10180 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
10190 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
101a0 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
101b0 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
101c0 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
101d0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
101e0 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
101f0 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
10200 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
10210 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
10220 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
10230 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
10240 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
10250 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
10260 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
10270 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
10280 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
10290 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
102a0 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
102b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
102c0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
102d0 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
102e0 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
102f0 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
10300 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
10310 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
10320 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
10330 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
10340 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
10350 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
10360 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
10370 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
10380 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
10390 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
103a0 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
103b0 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
103c0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
103d0 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
103e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
103f0 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
10400 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
10410 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
10420 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
10430 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
10440 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
10450 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
10460 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
10470 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
10480 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
10490 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
104a0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
104b0 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
104c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
104e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
104f0 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
10500 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
10510 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10520 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
10530 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
10540 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
10550 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
10560 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10570 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
10580 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
10590 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
105a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
105b0 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
105c0 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
105d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
105e0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
105f0 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
10600 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
10610 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
10620 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
10630 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
10640 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
10650 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
10660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10670 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
10680 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
10690 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
106a0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
106b0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
106c0 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
106d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
106e0 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
106f0 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
10700 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
10710 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
10720 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
10730 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  lse{.    const i
10740 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
10750 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
10760 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
10770 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  TER_JOURNAL);.  
10780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10790 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74  Open(pVfs, zMast
107a0 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61  er, pMaster, fla
107b0 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  gs, 0);.  }.  if
107c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
107d0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
107e0 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71  _out;..  rc = sq
107f0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
10800 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
10810 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
10820 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10830 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10840 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
10850 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
10860 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
10870 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
10880 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20  asterPtr = 0;.  
10890 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72    int nMasterPtr
108a0 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
108b0 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
108c0 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
108d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108e0 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
108f0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
10900 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
10910 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
10920 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
10930 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
10940 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
10950 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
10960 28 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75  ((int)nMasterJou
10970 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
10980 72 20 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20  r + 1);.    if( 
10990 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  !zMasterJournal 
109a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
109b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
109c0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
109d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
109e0 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
109f0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
10a00 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
10a10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10a20 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20  OsRead(pMaster, 
10a30 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
10a40 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
10a50 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nal, 0);.    if(
10a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10a70 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
10a80 6f 75 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  out;.    zMaster
10a90 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
10aa0 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
10ab0 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
10ac0 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
10ad0 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
10ae0 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
10af0 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
10b00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
10b10 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
10b20 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
10b30 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
10b40 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
10b50 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
10b60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
10b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10b80 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
10b90 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
10ba0 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
10bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
10bc0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
10bd0 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
10be0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10bf0 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
10c00 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
10c10 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
10c20 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
10c30 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
10c40 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
10c50 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
10c60 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
10c70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
10c80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10c90 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
10ca0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
10cb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10cc0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10cd0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
10ce0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10cf0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
10d00 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
10d10 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
10d20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d40 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
10d50 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
10d60 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
10d70 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
10d80 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
10d90 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
10da0 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
10db0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
10dc0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
10dd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10de0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10df0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
10e00 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
10e10 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
10e20 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
10e30 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
10e40 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
10e50 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
10e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
10e70 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
10e80 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
10e90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10ea0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
10eb0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
10ec0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
10ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
10ee0 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
10ef0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
10f00 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
10f10 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
10f20 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
10f30 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
10f40 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
10f50 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
10f60 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
10f70 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
10f80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
10f90 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
10fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
10fb0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
10fc0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
10fd0 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
10fe0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
10ff0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
11000 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
11010 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11020 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
11030 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
11040 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11050 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
11060 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
11070 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
11080 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
11090 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
110a0 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
110b0 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
110c0 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
110d0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
110e0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
110f0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
11100 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
11110 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63   open, or an exc
11120 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e  lusive lock is n
11130 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73  ot.** held, this
11140 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11150 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
11160 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
11170 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e   file is.** chan
11180 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
11190 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
111a0 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
111b0 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a  ). If the file.*
111c0 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  * on disk is cur
111d0 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
111e0 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
111f0 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
11200 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
11210 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
11220 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
11230 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   it might might 
11240 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
11250 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
11260 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
11270 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
11280 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
11290 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
112a0 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
112b0 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
112c0 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
112d0 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
112e0 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
112f0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
11300 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
11310 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
11320 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
11330 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
11340 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
11350 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
11360 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
11370 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11390 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
113a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
113b0 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
113c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
113d0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
113e0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
113f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
11400 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
11410 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
11420 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
11430 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11440 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11450 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
11460 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e  LUSIVE && isOpen
11470 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
11480 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
11490 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
114a0 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
114b0 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
114c0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
114d0 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
114e0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
114f0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
11500 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
11510 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
11520 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
11530 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
11540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11550 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
11560 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
11570 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
11580 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11590 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
115a0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
115b0 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
115c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
115d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
115e0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
115f0 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
11600 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
11610 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11630 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
11640 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11650 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11670 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
11680 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
11690 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
116a0 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
116b0 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
116c0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
116d0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
116e0 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
116f0 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
11700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11710 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
11720 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
11730 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
11740 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
11750 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
11760 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
11770 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
11780 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
11790 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
117a0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
117b0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
117c0 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
117d0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
117e0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
117f0 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
11800 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
11810 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
11820 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
11830 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
11840 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
11850 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
11860 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
11870 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a  ded up to 32 if.
11880 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74 68  ** it is less th
11890 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65  an 32, or rounde
118a0 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45  d down to MAX_SE
118b0 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a  CTOR_SIZE if it.
118c0 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
118d0 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  an MAX_SECTOR_SI
118e0 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ZE..*/.static vo
118f0 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
11900 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11910 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
11920 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
11930 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
11940 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  e );..  if( !pPa
11950 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
11960 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73  .    /* Sector s
11970 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ize doesn't matt
11980 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  er for temporary
11990 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68   files. Also, th
119a0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61  e file.    ** ma
119b0 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  y not have been 
119c0 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77  opened yet, in w
119d0 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73  hich case the Os
119e0 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20  SectorSize().   
119f0 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65   ** call will se
11a00 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  gfault..    */. 
11a10 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
11a20 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f  rSize = sqlite3O
11a30 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  sSectorSize(pPag
11a40 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69  er->fd);.  }.  i
11a50 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
11a60 72 53 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20  rSize<32 ){.    
11a70 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
11a80 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
11a90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
11aa0 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
11ab0 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
11ac0 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
11ad0 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
11ae0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
11af0 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
11b00 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
11b10 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
11b20 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
11b30 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
11b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
11b50 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
11b60 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
11b70 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
11b80 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
11b90 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
11ba0 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
11bb0 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
11bc0 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
11bd0 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
11be0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
11bf0 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
11c00 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
11c10 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
11c20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
11c30 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
11c40 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
11c50 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
11c60 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
11c70 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
11c80 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
11c90 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
11ca0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
11cb0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
11cc0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
11cd0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
11ce0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
11cf0 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
11d00 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
11d10 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
11d20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
11d30 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
11d40 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11d50 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
11d60 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
11d70 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
11d80 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
11d90 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
11da0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
11db0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
11dc0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
11dd0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
11de0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
11df0 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
11e00 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
11e10 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
11e20 20 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a   is the page siz
11e30 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f  e..**  (7)  zero
11e40 20 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20   padding out to 
11e50 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
11e60 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a  size..**  (8)  Z
11e70 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
11e80 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
11e90 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
11ea0 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
11eb0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
11ec0 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
11ed0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
11ee0 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
11ef0 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
11f00 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
11f10 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
11f20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
11f30 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
11f40 66 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62  first 7 items ab
11f50 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
11f60 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
11f70 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
11f80 20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d   of the 8th item
11f90 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
11fa0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
11fb0 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
11fc0 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
11fd0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
11fe0 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
11ff0 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
12000 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
12010 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
12020 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
12030 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
12040 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
12050 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
12060 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
12070 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
12080 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
12090 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
120a0 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
120b0 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
120c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
120d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
120e0 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
120f0 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
12100 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
12110 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
12120 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
12130 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
12140 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
12150 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
12160 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
12170 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
12180 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
12190 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
121a0 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
121b0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
121c0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
121d0 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
121e0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
121f0 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
12200 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
12210 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
12220 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
12230 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
12240 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
12250 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
12260 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
12270 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
12280 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
12290 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
122a0 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
122b0 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
122c0 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
122d0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
122e0 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
122f0 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
12300 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
12310 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
12320 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
12330 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
12340 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
12350 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
12360 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
12370 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
12380 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
12390 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
123a0 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
123b0 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
123c0 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
123d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
123e0 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
123f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
12400 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
12410 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
12420 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
12430 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
12440 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
12450 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
12460 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
12470 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
12480 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
12490 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
124a0 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
124b0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
124c0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
124d0 20 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72   isHot parameter
124e0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
124f0 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
12500 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72   rollback a jour
12510 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68  nal.** that migh
12520 74 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e  t be a hot journ
12530 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c  al.  Or, it coul
12540 64 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f  d be that the jo
12550 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65  urnal is .** pre
12560 73 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f  served because o
12570 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  f JOURNALMODE_PE
12580 52 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c  RSIST or JOURNAL
12590 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a  MODE_TRUNCATE..*
125a0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
125b0 20 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20   really is hot, 
125c0 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
125d0 63 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c  cache prior roll
125e0 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20  ing.** back any 
125f0 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65  content.  If the
12600 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65   journal is mere
12610 6c 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e  ly persistent, n
12620 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65  o reset is.** ne
12630 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
12640 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
12650 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
12660 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
12670 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12680 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
12690 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
126a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
126b0 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
126c0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
126d0 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
12700 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
12710 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
12740 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
12750 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
12760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
12770 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
12780 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
12790 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
127b0 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
127c0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
127d0 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
127e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
127f0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
12800 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
12810 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
12820 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
12830 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
12840 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
12850 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65   any */.  int ne
12860 65 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20  edPagerReset;   
12870 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
12880 73 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74  set page prior t
12890 6f 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c  o first page rol
128a0 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46  lback */..  /* F
128b0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
128c0 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
128d0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
128e0 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
128f0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
12900 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
12910 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
12920 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
12930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12940 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
12950 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
12960 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12970 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
12980 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
12990 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
129a0 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
129b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
129c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
129d0 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
129e0 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
129f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
12a00 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
12a10 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
12a20 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
12a30 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
12a40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
12a50 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
12a60 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
12a70 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
12a80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
12a90 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
12aa0 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
12ab0 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
12ac0 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
12ad0 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
12ae0 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
12af0 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
12b00 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
12b10 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
12b20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
12b30 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
12b40 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
12b50 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
12b60 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65    **  mxPathname
12b70 20 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69   is 512, which i
12b80 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
12b90 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61  e minimum allowa
12ba0 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66  ble value.  ** f
12bb0 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a  or pageSize..  *
12bc0 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50  /.  zMaster = pP
12bd0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
12be0 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
12bf0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
12c00 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
12c10 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
12c20 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69  Pathname+1);.  i
12c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12c40 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29   && zMaster[0] )
12c50 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12c60 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
12c70 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
12c80 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
12c90 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61  &res);.  }.  zMa
12ca0 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ster = 0;.  if( 
12cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
12cc0 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74   !res ){.    got
12cd0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
12ce0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
12cf0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
12d00 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d  needPagerReset =
12d10 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68   isHot;..  /* Th
12d20 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
12d30 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61  es either when a
12d40 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
12d50 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72  ) or .  ** pager
12d60 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
12d70 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ge() call return
12d80 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
12d90 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20   an IO error .  
12da0 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f  ** occurs. .  */
12db0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
12dc0 20 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63 20     int isUnsync 
12dd0 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  = 0;..    /* Rea
12de0 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
12df0 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
12e00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
12e10 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
12e20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
12e30 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
12e40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12e50 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
12e60 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
12e70 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
12e80 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
12e90 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
12ea0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
12eb0 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
12ec0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
12ed0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
12ee0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
12ef0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
12f00 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
12f10 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c  ger, isHot, szJ,
12f20 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
12f30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12f40 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
12f50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
12f60 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
12f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
12f90 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
12fa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12fb0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
12fc0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
12fd0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
12fe0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
12ff0 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
13000 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
13010 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13020 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
13030 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
13040 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
13050 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
13060 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
13070 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
13080 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
13090 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
130a0 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
130b0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
130c0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
130d0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
130e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
130f0 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
13100 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13110 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
13120 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
13130 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13140 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
13150 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
13170 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
13180 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
13190 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
131a0 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
131b0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
131c0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
131d0 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
131e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
131f0 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
13200 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
13210 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13220 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
13230 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
13240 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
13250 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
13260 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
13270 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
13280 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
13290 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
132a0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
132b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
132c0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
132d0 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
132e0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
132f0 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
13300 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
13310 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
13320 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
13330 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
13340 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
13350 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
13360 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
13370 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13380 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
13390 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
133a0 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
133b0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
133c0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
133d0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
133e0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
133f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13400 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
13410 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
13420 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
13430 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
13440 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
13450 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
13460 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
13470 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
13480 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13490 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
134a0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
134b0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
134c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
134d0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
134e0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
134f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13500 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
13510 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
13520 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
13530 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
13540 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
13550 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20   isUnsync = 1;. 
13560 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13570 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
13580 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
13590 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
135a0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
135b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
135c0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
135d0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
135e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
135f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13600 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13610 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
13620 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
13630 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
13640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13650 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13660 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
13670 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
13680 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
13690 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
136a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
136b0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
136c0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
136d0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
136e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
136f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
13700 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
13710 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
13720 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
13730 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
13740 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
13750 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
13760 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
13770 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
13780 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13790 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
137a0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
137b0 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e  pPager,1,isUnsyn
137c0 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  c,&pPager->journ
137d0 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20  alOff,0,0);.    
137e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
137f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
13800 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
13810 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
13820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13830 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
13840 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
13850 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
13860 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
13870 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
13880 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
13890 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71  e to rollback, q
138a0 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  uit and return t
138b0 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
138c0 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69     ** code.  Thi
138d0 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
138e0 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
138f0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a  the error state.
13900 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
13910 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20  that no further 
13920 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e  harm will be don
13930 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20  e.  Perhaps the 
13940 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a  next.          *
13950 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  * process to com
13960 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20  e along will be 
13970 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
13980 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
13990 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
139a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
139b0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
139c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
139d0 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
139e0 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
139f0 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
13a00 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69  ck:.  /* Followi
13a10 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
13a20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
13a30 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20   should be back 
13a40 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  in its original.
13a50 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72    ** state prior
13a60 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
13a70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13a80 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a  , so invoke the.
13a90 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54    ** SQLITE_FCNT
13aa0 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66  L_DB_UNCHANGED f
13ab0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile-control meth
13ac0 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  od to disable th
13ad0 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e  e.  ** assertion
13ae0 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
13af0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
13b00 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  s modified..  */
13b10 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70  .  assert(.    p
13b20 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
13b30 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71  ods==0 ||.    sq
13b40 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
13b50 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  ol(pPager->fd,SQ
13b60 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
13b70 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49  CHANGED,0)>=SQLI
13b80 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a  TE_OK.  );..  /*
13b90 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
13ba0 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
13bb0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
13bc0 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
13bd0 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
13be0 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
13bf0 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
13c00 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
13c10 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
13c20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
13c30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
13c40 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
13c50 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
13c60 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
13c70 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
13c80 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
13c90 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
13ca0 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
13cb0 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
13cc0 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
13cd0 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
13ce0 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
13cf0 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
13d00 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
13d10 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
13d20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
13d30 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
13d40 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
13d50 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
13d60 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
13d70 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
13d80 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
13d90 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
13da0 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
13db0 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
13dc0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
13dd0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
13de0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
13df0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
13e00 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
13e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13e20 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
13e30 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
13e40 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
13e50 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
13e60 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
13e70 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
13e80 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
13e90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
13ea0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
13eb0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
13ec0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
13ed0 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 70  ->noSync==0 && p
13ee0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
13ef0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
13f00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13f10 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
13f20 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
13f30 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 69  _flags);.  }.  i
13f40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
13f50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
13f60 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
13f70 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
13f80 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20  er[0]!='\0');.  
13f90 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
13fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
13fb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13fc0 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
13fd0 30 5d 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  0] && res ){.   
13fe0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
13ff0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
14000 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
14010 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
14020 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
14030 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
14040 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
14050 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
14060 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  l..    */.    rc
14070 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
14080 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  er(pPager, zMast
14090 65 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  er);.    testcas
140a0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
140b0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
140c0 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  e Pager.sectorSi
140d0 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  ze variable may 
140e0 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65  have been update
140f0 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a  d while rolling.
14100 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72    ** back a jour
14110 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61  nal created by a
14120 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20   process with a 
14130 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
14140 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65   size.  ** value
14150 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68  . Reset it to th
14160 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20  e correct value 
14170 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
14180 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74  ..  */.  setSect
14190 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
141a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
141b0 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
141c0 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
141d0 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
141e0 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
141f0 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
14200 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
14210 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
14220 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
14230 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
14240 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
14250 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
14260 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
14270 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
14280 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
14290 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
142a0 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
142b0 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
142c0 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
142d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
142e0 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
142f0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
14300 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
14310 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
14320 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
14330 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
14340 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
14350 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
14360 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
14370 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
14380 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
14390 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
143a0 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
143b0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
143c0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
143d0 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
143e0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
143f0 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
14400 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
14410 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
14420 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
14430 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14440 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
14450 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
14460 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
14470 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
14480 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
14490 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
144a0 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
144b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
144c0 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
144d0 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
144e0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
144f0 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
14500 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
14510 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
14520 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
14530 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
14540 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
14550 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
14560 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
14570 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
14580 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
14590 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
145a0 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
145b0 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
145c0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
145d0 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
145e0 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
145f0 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
14600 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
14610 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
14620 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
14630 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
14640 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
14650 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
14660 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
14670 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
14680 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
14690 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
146a0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
146b0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
146c0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
146d0 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
146e0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
146f0 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
14700 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
14710 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
14720 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
14730 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
14740 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
14750 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
14760 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
14770 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
14780 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
14790 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
147a0 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
147b0 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
147c0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
147d0 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
147e0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
147f0 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
14800 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
14810 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
14820 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
14830 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
14840 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
14850 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
14860 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
14870 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
14880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
14890 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
148a0 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
148b0 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
148c0 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
148d0 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
148f0 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
14900 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14910 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
14920 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
14930 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
14940 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
14950 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
14960 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
14970 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
14980 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
14990 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
149a0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
149b0 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
149c0 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
149d0 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
149e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
149f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
14a00 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41  HARED );..  /* A
14a10 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
14a20 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
14a30 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
14a40 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
14a50 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
14a60 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
14a70 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
14a80 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
14a90 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
14aa0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
14ab0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
14ac0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
14ad0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61  .  /* Set the da
14ae0 74 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b  tabase size back
14af0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
14b00 20 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20   was before the 
14b10 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20  savepoint .  ** 
14b20 62 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77  being reverted w
14b30 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  as opened..  */.
14b40 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
14b50 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20   = pSavepoint ? 
14b60 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
14b70 67 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  g : pPager->dbOr
14b80 69 67 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 55 73  igSize;..  /* Us
14b90 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
14ba0 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
14bb0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
14bc0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
14bd0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
14be0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
14bf0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
14c00 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
14c10 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
14c20 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
14c30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14c40 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
14c50 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
14c60 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
14c70 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
14c80 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
14c90 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
14ca0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
14cb0 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e   Begin by rollin
14cc0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66  g back records f
14cd0 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  rom the main jou
14ce0 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74  rnal starting at
14cf0 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70  .  ** PagerSavep
14d00 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
14d10 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
14d20 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
14d30 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65  header..  ** The
14d40 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f  re might be reco
14d50 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  rds in the main 
14d60 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76  journal that hav
14d70 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  e a page number.
14d80 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
14d90 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  n the current da
14da0 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61  tabase size (pPa
14db0 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74  ger->dbSize) but
14dc0 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c   those.  ** will
14dd0 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f   be skipped auto
14de0 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65  matically.  Page
14df0 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70  s are added to p
14e00 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a  Done as they.  *
14e10 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63  * are played bac
14e20 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  k..  */.  if( pS
14e30 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
14e40 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
14e50 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
14e60 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
14e70 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
14e80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
14e90 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
14ea0 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
14eb0 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
14ec0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14ed0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
14ee0 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
14ef0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
14f00 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
14f10 65 72 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65  er, 1, 0, &pPage
14f20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
14f30 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a  , pDone);.    }.
14f40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
14f50 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
14f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
14f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14f80 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
14f90 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
14fa0 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
14fb0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14fc0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
14fd0 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
14fe0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
14ff0 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
15000 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
15010 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
15020 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
15030 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
15040 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
15050 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
15060 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
15070 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
15080 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
15090 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
150a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
150b0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
150c0 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
150d0 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
150e0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
150f0 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a  er */.    u32 nJ
15100 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Rec = 0;     /* 
15110 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
15120 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
15130 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
15140 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
15150 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73  Hdr(pPager, 0, s
15160 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
15170 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
15180 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15190 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
151a0 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
151b0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
151c0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
151d0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
151e0 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
151f0 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
15200 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
15210 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
15220 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
15230 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15240 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
15250 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15260 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
15270 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
15280 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
15290 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
152a0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
152b0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
152c0 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
152d0 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
152e0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
152f0 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
15300 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15310 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
15320 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
15330 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
15340 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
15350 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
15360 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
15370 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
15380 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
15390 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  , 0, &pPager->jo
153a0 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f  urnalOff, 1, pDo
153b0 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
153c0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
153d0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
153e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
153f0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
15400 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
15410 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
15420 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
15430 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
15440 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
15450 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
15460 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
15470 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
15480 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
15490 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
154a0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
154b0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
154c0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
154d0 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
154e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
154f0 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
15500 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
15510 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
15520 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
15530 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
15540 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
15550 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15560 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
15570 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
15580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15590 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
155a0 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
155b0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
155c0 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
155d0 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
155e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
155f0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15600 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f  pPager, 0, 0, &o
15610 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
15620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15630 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15640 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
15650 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
15660 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
15670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15680 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
15690 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
156a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
156b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
156c0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
156d0 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
156e0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
156f0 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
15700 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15710 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
15720 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
15730 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
15740 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
15750 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
15760 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
15770 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
15780 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
15790 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
157a0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
157b0 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
157c0 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
157d0 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
157e0 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
157f0 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
15800 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
15810 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
15820 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
15830 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
15840 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
15850 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
15860 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
15870 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
15880 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
15890 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
158a0 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
158b0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
158c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
158d0 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
158e0 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
158f0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
15900 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
15910 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
15920 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
15930 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
15940 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
15950 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
15960 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
15970 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
15980 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
15990 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
159a0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
159b0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
159c0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
159d0 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
159e0 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
159f0 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
15a00 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
15a10 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
15a20 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
15a30 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
15a40 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
15a50 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
15a60 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
15a70 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
15a80 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
15a90 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
15aa0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15ab0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
15ac0 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
15ad0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
15ae0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
15af0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
15b00 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
15b10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
15b20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
15b30 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
15b40 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
15b50 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
15b60 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
15b70 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
15b80 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
15b90 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
15ba0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
15bb0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
15bc0 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
15bd0 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
15be0 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
15bf0 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
15c00 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
15c10 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
15c20 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
15c30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15c40 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
15c50 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
15c60 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
15c70 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
15c80 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
15c90 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
15ca0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
15cb0 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
15cc0 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
15cd0 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
15ce0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
15cf0 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
15d00 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
15d10 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
15d20 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
15d30 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
15d40 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
15d50 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
15d60 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
15d70 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
15d80 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
15d90 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
15da0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
15db0 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
15dc0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
15dd0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
15de0 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
15df0 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
15e00 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
15e10 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
15e20 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
15e30 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
15e40 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
15e50 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
15e60 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
15e70 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
15e80 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
15e90 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
15ea0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
15eb0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
15ec0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
15ed0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
15ee0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
15ef0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
15f00 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
15f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15f20 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
15f30 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
15f40 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
15f50 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
15f60 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
15f70 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
15f80 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
15f90 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
15fa0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
15fb0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
15fc0 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
15fd0 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
15fe0 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
15ff0 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
16000 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
16010 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16030 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
16040 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
16050 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16060 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
16070 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16080 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
16090 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
160a0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
160b0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
160c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
160d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
160e0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
160f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
16100 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
16110 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
16120 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
16130 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
16140 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
16150 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
16160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16170 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16180 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16190 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
161a0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
161b0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
161c0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
161d0 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
161e0 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
161f0 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
16200 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16210 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
16220 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16230 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
16240 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16250 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
16260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
16270 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
16280 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
16290 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
162a0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
162b0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
162c0 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
162d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
162e0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
162f0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
16300 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
16310 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
16320 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
16330 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
16340 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
16350 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
16360 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
16370 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
16380 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
16390 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
163a0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
163b0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
163c0 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
163d0 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
163e0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
163f0 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
16400 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
16410 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
16420 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
16430 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
16440 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
16450 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
16460 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
16470 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
16480 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
16490 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
164a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
164b0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
164c0 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
164d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16500 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
16510 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
16520 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
16530 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
16540 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
16550 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
16560 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
16570 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
16580 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
16590 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
165a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
165b0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
165c0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
165d0 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
165e0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
165f0 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
16600 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
16610 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
16620 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
16630 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
16640 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
16650 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
16660 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
16670 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
16680 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
16690 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
166c0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
166d0 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
166e0 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
166f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
16700 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
16710 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
16720 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16740 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
16750 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
16760 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
16770 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
16780 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
16790 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
167a0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
167b0 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
167c0 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74 68  ./*.** Report th
167d0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 73  e current page s
167e0 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  ize and number o
167f0 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
16800 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65 20   back.** to the 
16810 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65 66  codec..*/.#ifdef
16820 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16830 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  C.static void pa
16840 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50 61  gerReportSize(Pa
16850 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
16860 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
16870 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20 20  ecSizeChng ){.  
16880 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
16890 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72 2d  SizeChng(pPager-
168a0 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72 2d  >pCodec, pPager-
168b0 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67 65        (int)pPage
168e0 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  r->nReserve);.  
168f0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
16900 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  ne pagerReportSi
16910 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f 2d  ze(X)     /* No-
16920 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  op if we do not 
16930 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63 20  support a codec 
16940 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
16950 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
16960 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
16970 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
16980 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
16990 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
169a0 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
169b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
169c0 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
169d0 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
169e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
169f0 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
16a00 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
16a10 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
16a20 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
16a30 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
16a40 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
16a50 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
16a60 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54 45  ORRUPT or SQLITE
16a70 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  _FULL)..**.** Ot
16a80 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20  herwise, if all 
16a90 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16aa0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
16ab0 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67     * the new pag
16ac0 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66  e size (value of
16ad0 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20   *pPageSize) is 
16ae0 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a  valid (a power .
16af0 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65  **     of two be
16b00 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51  tween 512 and SQ
16b10 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
16b20 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20  ZE, inclusive), 
16b30 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  and.**.**   * th
16b40 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
16b50 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65  anding page refe
16b60 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a  rences, and.**.*
16b70 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
16b80 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74  se is either not
16b90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
16ba0 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a  tabase or it is.
16bb0 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d  **     an in-mem
16bc0 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61  ory database tha
16bd0 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  t currently cons
16be0 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67  ists of zero pag
16bf0 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74  es..**.** then t
16c00 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
16c10 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74  page size is set
16c20 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   to *pPageSize..
16c30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16c40 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65  e size is change
16c50 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  d, then this fun
16c60 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74  ction uses sqlit
16c70 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20  e3PagerMalloc() 
16c80 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  .** to obtain a 
16c90 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70  new Pager.pTmpSp
16ca0 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74  ace buffer. If t
16cb0 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  his allocation a
16cc0 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73  ttempt .** fails
16cd0 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
16ce0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
16cf0 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d  he page size rem
16d00 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  ains unchanged. 
16d10 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72  .** In all other
16d20 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f   cases, SQLITE_O
16d30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
16d40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
16d50 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61   size is not cha
16d60 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63  nged, either bec
16d70 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  ause one of the 
16d80 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f  enumerated.** co
16d90 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69  nditions above i
16da0 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20  s not true, the 
16db0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72  pager was in err
16dc0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
16dd0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77  is.** function w
16de0 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65  as called, or be
16df0 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79  cause the memory
16e00 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
16e10 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20  mpt failed, .** 
16e20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20  then *pPageSize 
16e30 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c  is set to the ol
16e40 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65  d, retained page
16e50 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74   size before ret
16e60 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
16e70 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
16e80 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
16e90 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65  ager, u16 *pPage
16ea0 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72  Size, int nReser
16eb0 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ve){.  int rc = 
16ec0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
16ed0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
16ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36  TE_OK ){.    u16
16ef0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
16f00 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
16f10 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
16f20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
16f30 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
16f40 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
16f50 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20  IZE) );.    if( 
16f60 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
16f70 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
16f80 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20  ize==0).     && 
16f90 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
16fa0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
16fb0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 20  Cache)==0 .     
16fc0 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
16fd0 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
16fe0 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 29  >pageSize .    )
16ff0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
17000 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
17010 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
17020 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17030 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
17040 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17050 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
17060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67  lse{.        pag
17070 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17080 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
17090 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
170a0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73  eSize;.        s
170b0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
170c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
170d0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
170e0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
170f0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  New;.        sql
17100 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
17110 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
17120 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
17130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17140 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d      *pPageSize =
17150 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61   (u16)pPager->pa
17160 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  geSize;.    if( 
17170 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
17180 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
17190 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
171a0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
171b0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
171c0 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
171d0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
171e0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
171f0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17200 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
17210 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17220 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
17230 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
17240 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
17250 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
17260 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
17270 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
17280 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
17290 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
172a0 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
172b0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
172c0 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
172d0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
172e0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
172f0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
17300 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
17310 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
17320 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
17330 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
17340 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
17350 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
17360 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
17370 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
17380 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
17390 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
173a0 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
173b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
173c0 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
173d0 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
173e0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
173f0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
17400 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
17410 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
17420 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
17430 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
17440 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
17450 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
17460 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
17470 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
17480 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
17490 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
174a0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
174b0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
174c0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
174d0 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
174e0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
174f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
17500 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
17510 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
17520 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
17530 6e 50 61 67 65 3b 0a 20 20 69 66 28 20 6d 78 50  nPage;.  if( mxP
17540 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
17550 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
17560 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
17570 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17580 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
17590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
175a0 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 6e 50 61  ger->mxPgno>=nPa
175b0 67 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ge );.  return p
175c0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
175d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
175e0 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
175f0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
17600 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
17610 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
17620 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
17630 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
17640 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
17650 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
17660 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
17670 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
17680 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
17690 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
176a0 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
176b0 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
176c0 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
176d0 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
176e0 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
176f0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
17700 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
17710 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
17720 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
17730 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
17740 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
17750 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
17760 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
17770 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
17780 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
17790 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
177a0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
177b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
177c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
177d0 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
177e0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
177f0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
17800 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
17810 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
17820 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
17830 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
17840 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
17850 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
17860 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17870 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
17880 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
17890 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
178a0 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
178b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
178c0 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
178d0 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
178e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
178f0 70 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64  pager was opened
17900 20 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20   on a transient 
17910 66 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d  file (zFilename=
17920 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e  =""), or.** open
17930 65 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73  ed on a file les
17940 73 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69  s than N bytes i
17950 6e 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70  n size, the outp
17960 75 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  ut buffer is.** 
17970 7a 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54  zeroed and SQLIT
17980 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
17990 68 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72  he rationale for
179a0 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
179b0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
179c0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
179d0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73  database headers
179e0 2c 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e  , and a new tran
179f0 73 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f  sient or.** zero
17a00 20 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20   sized database 
17a10 68 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61  has a header tha
17a20 6e 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  n consists entir
17a30 65 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a  ely of zeroes..*
17a40 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65  *.** If any IO e
17a50 72 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20  rror apart from 
17a60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17a70 52 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75  RT_READ is encou
17a80 6e 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65  ntered,.** the e
17a90 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
17aa0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
17ab0 6c 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ler and the cont
17ac0 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  ents of the.** o
17ad0 75 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64  utput buffer und
17ae0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  efined..*/.int s
17af0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
17b00 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
17b10 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
17b20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
17b30 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
17b40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
17b50 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
17b60 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  N);.  assert( is
17b70 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17b80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
17b90 46 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73  File );.  if( is
17ba0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
17bb0 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
17bc0 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
17bd0 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
17be0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17bf0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
17c00 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
17c10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17c20 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
17c30 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
17c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17c50 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17c60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17c70 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
17c80 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17c90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17ca0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a  ile associated .
17cb0 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20  ** with pPager. 
17cc0 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69  Normally, this i
17cd0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20  s calculated as 
17ce0 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f  (<db file size>/
17cf0 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a  <page-size>)..**
17d00 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
17d10 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
17d20 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
17d30 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
17d40 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
17d50 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
17d60 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a  1 page file..**.
17d70 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
17d80 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  is in error stat
17d90 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
17da0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
17db0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f  then the.** erro
17dc0 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
17dd0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
17de0 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20  nd *pnPage left 
17df0 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a  unchanged. Or,.*
17e00 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79  * if the file sy
17e10 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71  stem has to be q
17e20 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73  ueried for the s
17e30 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
17e40 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79  and.** the query
17e50 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73   attempt returns
17e60 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68   an IO error, th
17e70 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
17e80 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
17e90 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
17ea0 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
17eb0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
17ec0 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
17ed0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e  successful, then
17ee0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
17ef0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
17f00 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  nPage is set to 
17f10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17f20 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17f30 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
17f40 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17f50 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17f60 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20   int *pnPage){. 
17f70 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20   Pgno nPage;    
17f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
17f90 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69  lue to return vi
17fa0 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20  a *pnPage */..  
17fb0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
17fc0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
17fd0 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53 74   in the file. St
17fe0 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61 67  ore this in nPag
17ff0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
18000 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
18010 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  ){.    nPage = p
18020 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
18030 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18040 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18050 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 74      /* Error ret
18060 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
18070 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36 34  ize() */.    i64
18080 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
18090 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a       /* File siz
180a0 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75 72  e in bytes retur
180b0 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a  ned by OsFileSiz
180c0 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  e() */..    asse
180d0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
180e0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
180f0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
18100 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
18110 67 65 72 2d 3e 66 64 29 20 26 26 20 28 30 20 21  ger->fd) && (0 !
18120 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
18130 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
18140 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29 7b 0a 20  ->fd, &n))) ){. 
18150 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
18160 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
18170 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18180 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
18190 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
181a0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
181b0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d  nPage = 1;.    }
181c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
181d0 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70  e = (Pgno)(n / p
181e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
181f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18200 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
18210 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
18220 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
18230 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
18240 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
18250 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
18260 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
18270 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
18280 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
18290 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
182a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
182b0 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
182c0 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
182d0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
182e0 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
182f0 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
18300 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
18310 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
18320 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
18330 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
18340 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
18350 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
18360 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
18370 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
18380 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
18390 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
183a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
183b0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
183c0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
183d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
183e0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
183f0 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
18400 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
18410 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
18420 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
18430 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
18440 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
18450 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18460 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
18470 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
18480 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
18490 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
184a0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
184b0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
184c0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
184d0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
184e0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
184f0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
18500 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
18510 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
18520 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
18530 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
18540 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
18550 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
18560 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
18570 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
18580 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
18590 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
185a0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
185b0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
185c0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
185d0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
185e0 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
185f0 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
18600 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
18610 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
18620 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
18630 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
18640 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
18650 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
18660 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
18670 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
186a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
186b0 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
186c0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
186d0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
186e0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
186f0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
18700 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
18710 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
18720 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
18730 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
18740 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
18750 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
18760 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18770 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
18780 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
18790 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
187a0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
187b0 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20  e unknown. It.  
187c0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  ** must not have
187d0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
187e0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
187f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
18800 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
18810 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
18820 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
18830 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18840 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
18850 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
18860 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
18870 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
18880 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
18890 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
188a0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
188b0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
188c0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
188d0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
188e0 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
188f0 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
18900 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
18910 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
18920 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
18930 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
18940 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
18950 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
18960 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
18970 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
18980 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
18990 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
189a0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
189b0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
189c0 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
189d0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
189e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
189f0 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
18a00 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
18a10 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
18a20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
18a30 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
18a40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
18a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
18a60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18a70 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
18a80 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
18a90 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
18aa0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
18ab0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
18ac0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
18ad0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
18ae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18b00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
18b10 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
18b20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
18b30 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
18b40 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
18b50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
18b60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18b70 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
18b80 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
18b90 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
18ba0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
18bb0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
18bc0 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
18bd0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
18be0 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
18bf0 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
18c00 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
18c10 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
18c20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
18c30 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
18c40 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
18c50 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
18c60 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
18c70 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
18c80 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
18c90 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
18ca0 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
18cb0 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
18cc0 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
18cd0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
18ce0 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
18cf0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
18d00 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
18d10 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
18d20 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
18d30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
18d40 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
18d50 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
18d60 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
18d70 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
18d80 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
18d90 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
18da0 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
18db0 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
18dc0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
18dd0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
18de0 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
18df0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
18e00 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
18e10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
18e20 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
18e30 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
18e40 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
18e50 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
18e60 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
18e70 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65  haviour would be
18e80 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
18e90 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
18ea0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
18eb0 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
18ec0 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
18ed0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
18ee0 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
18ef0 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
18f00 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
18f10 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
18f20 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
18f30 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
18f40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
18f50 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
18f60 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
18f70 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
18f80 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
18f90 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
18fa0 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
18fb0 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
18fc0 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
18fd0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
18fe0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
18ff0 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
19000 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
19010 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
19020 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
19030 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
19040 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
19050 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
19060 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
19070 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
19080 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
19090 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
190a0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
190b0 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
190c0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
190d0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
190e0 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
190f0 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
19100 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
19110 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
19120 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
19130 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
19140 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
19150 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
19160 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19170 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
19180 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
19190 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
191a0 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
191b0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
191c0 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
191d0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
191e0 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
191f0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
19200 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
19210 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
19220 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
19230 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
19240 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
19250 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
19260 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
19270 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
19280 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
19290 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
192a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
192b0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
192c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
192d0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
192e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
192f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
19300 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
19310 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
19320 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
19330 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
19340 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
19350 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
19360 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
19370 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
19380 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
19390 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
193a0 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
193b0 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
193c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
193d0 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
193e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
193f0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
19400 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
19410 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
19420 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
19430 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
19440 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
19450 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
19460 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
19470 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
19480 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
19490 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
194a0 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
194b0 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
194c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
194d0 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
194e0 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
194f0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
19500 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
19510 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
19520 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
19530 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
19540 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
19550 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
19560 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
19570 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
19580 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
19590 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
195a0 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
195b0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
195c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
195d0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
195e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
195f0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
19600 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
19610 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
19620 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  = 0;.  pPager->e
19630 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
19640 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  ;.  pager_reset(
19650 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d  pPager);.  if( M
19660 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65  EMDB ){.    page
19670 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
19680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
19690 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72  * Set Pager.jour
196a0 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72  nalHdr to -1 for
196b0 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20   the benefit of 
196c0 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
196d0 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ck() .    ** cal
196e0 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d  l which may be m
196f0 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ade from within 
19700 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
19710 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a  llback(). If it.
19720 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31      ** is not -1
19730 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e  , then the unsyn
19740 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61  ced portion of a
19750 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  n open journal f
19760 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62  ile may.    ** b
19770 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e  e played back in
19780 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
19790 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
197a0 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
197b0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
197c0 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64  happening, the d
197d0 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f  atabase may beco
197e0 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
197f0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  */.    pPager->j
19800 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a  ournalHdr = -1;.
19810 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
19820 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
19830 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
19840 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
19850 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ();.  enable_sim
19860 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
19870 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
19880 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
19890 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
198a0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
198b0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
198c0 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73  er)).  sqlite3Os
198d0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
198e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
198f0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
19900 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74  pSpace);.  sqlit
19910 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
19920 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
19930 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
19940 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70  AS_CODEC.  if( p
19950 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65  Pager->xCodecFre
19960 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  e ) pPager->xCod
19970 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  ecFree(pPager->p
19980 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a  Codec);.#endif..
19990 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
199a0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26  r->aSavepoint &&
199b0 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75   !pPager->pInJou
199c0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
199d0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
199e0 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65  ->jfd) && !isOpe
199f0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
19a00 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  );..  sqlite3_fr
19a10 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
19a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19a30 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
19a40 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
19a50 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
19a60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
19a70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
19a80 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67   page pPg..*/.Pg
19a90 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
19aa0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
19ab0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
19ac0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65   pPg->pgno;.}.#e
19ad0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
19ae0 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
19af0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
19b00 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20  ge pPg..*/.void 
19b10 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
19b20 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
19b30 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
19b40 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
19b50 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
19b60 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
19b70 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
19b80 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
19b90 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
19ba0 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
19bb0 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
19bc0 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
19bd0 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
19be0 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72  isk and can be r
19bf0 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65  estored in the e
19c00 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f  vent of a hot-jo
19c10 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a  urnal rollback..
19c20 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67  **.** If the Pag
19c30 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
19c40 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74 68 65   is not set, the
19c50 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
19c60 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f  is a.** no-op. O
19c70 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
19c80 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
19c90 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
19ca0 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64  rnal-mode.** and
19cb0 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
19cc0 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
19cd0 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  he the file-syst
19ce0 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  em, as follows:.
19cf0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
19d00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
19d10 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
19d20 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61  urnal file, no a
19d30 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20  ction need.**   
19d40 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a    be taken..**.*
19d50 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65 2c  *   * Otherwise,
19d60 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20 64   if the device d
19d70 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
19d80 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44 20  the SAFE_APPEND 
19d90 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20  property,.**    
19da0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
19db0 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73 74  ield of the most
19dc0 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74 65   recently writte
19dd0 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  n journal header
19de0 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61 74  .**     is updat
19df0 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ed to contain th
19e00 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72  e number of jour
19e10 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61 74  nal records that
19e20 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65 65   have.**     bee
19e30 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77  n written follow
19e40 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20 70  ing it. If the p
19e50 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69 6e  ager is operatin
19e60 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a  g in full-sync.*
19e70 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e  *     mode, then
19e80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19e90 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66 6f  e is synced befo
19ea0 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69 73  re this field is
19eb0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
19ec0 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69 63    * If the devic
19ed0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
19ee0 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49 41  rt the SEQUENTIA
19ef0 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  L property, then
19f00 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c   .**     journal
19f10 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
19f20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73  .**.** Or, in ps
19f30 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a  eudo-code:.**.**
19f40 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d     if( NOT <in-m
19f50 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29  emory journal> )
19f60 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54  {.**     if( NOT
19f70 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a   SAFE_APPEND ){.
19f80 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66 75  **       if( <fu
19f90 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20  ll-sync mode> ) 
19fa0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
19fb0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20  ile>);.**       
19fc0 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69 65  <update nRec fie
19fd0 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a  ld>.**     } .**
19fe0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45 51       if( NOT SEQ
19ff0 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63 28  UENTIAL ) xSync(
1a000 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
1a010 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68  .**   }.**.** Th
1a020 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1a030 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72 20 62   flag is never b
1a040 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70 6f 72  e set for tempor
1a050 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e  ary files, or an
1a060 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72 61 74  y.** file operat
1a070 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
1a080 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e  ode (Pager.noSyn
1a090 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72  c set to non-zer
1a0a0 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  o)..**.** If suc
1a0b0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
1a0c0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
1a0d0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1a0e0 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
1a0f0 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
1a100 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
1a110 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a120 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
1a130 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
1a140 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1a150 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
1a160 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1a170 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
1a180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1a190 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
1a1a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
1a1b0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1a1c0 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
1a1d0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1a1e0 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  le );.    if( pP
1a1f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1a200 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
1a210 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
1a220 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20       int rc;    
1a230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1a250 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20  urn code */.    
1a260 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20    const int iDc 
1a270 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
1a280 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1a290 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1a2a0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
1a2b0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
1a2c0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
1a2d0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1a2e0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
1a2f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1a300 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
1a310 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
1a320 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
1a330 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
1a340 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1a350 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
1a360 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
1a370 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
1a380 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
1a390 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1a3a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a3b0 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
1a3c0 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
1a3d0 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
1a3e0 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
1a3f0 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
1a400 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
1a410 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
1a420 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
1a430 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
1a440 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
1a450 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
1a460 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1a470 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
1a480 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f  tions transactio
1a490 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
1a4a0 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
1a4b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
1a4c0 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
1a4d0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
1a4e0 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
1a4f0 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
1a500 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
1a510 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
1a520 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
1a530 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
1a540 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
1a550 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
1a560 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
1a570 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
1a580 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
1a590 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
1a5a0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
1a5b0 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
1a5c0 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
1a5d0 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
1a5e0 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
1a5f0 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
1a600 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
1a610 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
1a620 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
1a630 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
1a640 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
1a650 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1a660 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
1a670 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
1a680 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
1a690 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
1a6a0 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
1a6b0 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
1a6c0 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
1a6d0 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
1a6e0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
1a6f0 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
1a700 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
1a710 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
1a720 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
1a730 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
1a740 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
1a750 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1a760 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
1a770 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
1a780 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
1a790 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
1a7a0 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
1a7b0 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
1a7c0 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
1a7d0 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
1a7e0 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
1a7f0 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
1a800 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
1a810 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
1a820 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
1a830 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
1a840 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
1a850 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
1a860 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
1a870 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
1a880 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
1a890 5d 3b 0a 09 75 38 20 7a 48 65 61 64 65 72 5b 73  ];..u8 zHeader[s
1a8a0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
1a8b0 67 69 63 29 2b 34 5d 3b 0a 0a 09 6d 65 6d 63 70  gic)+4];...memcp
1a8c0 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
1a8d0 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
1a8e0 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
1a8f0 3b 0a 09 70 75 74 33 32 62 69 74 73 28 26 7a 48  ;..put32bits(&zH
1a900 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
1a910 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
1a920 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
1a930 20 20 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66        iNextHdrOf
1a940 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
1a950 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
1a960 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1a970 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
1a980 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
1a990 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   8, iNextHdrOffs
1a9a0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  et);.        if(
1a9b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1a9c0 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67  & 0==memcmp(aMag
1a9d0 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
1a9e0 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 8) ){.       
1a9f0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1aa00 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b  u8 zerobyte = 0;
1aa10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1aa20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1aa30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72  Pager->jfd, &zer
1aa40 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48  obyte, 1, iNextH
1aa50 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1aa60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1aa70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1aa80 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1aa90 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1aaa0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1aab0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1aac0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  .        /* Writ
1aad0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1aae0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1aaf0 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49  l file header. I
1ab00 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f in.        ** 
1ab10 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73  full-synchronous
1ab20 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20   mode, sync the 
1ab30 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54  journal first. T
1ab40 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
1ab50 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  .        ** all 
1ab60 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20  data has really 
1ab70 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66  hit the disk bef
1ab80 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61  ore nRec is upda
1ab90 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20  ted to mark.    
1aba0 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63      ** it as a c
1abb0 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c  andidate for rol
1abc0 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a  lback..        *
1abd0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
1abe0 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
1abf0 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73 74  d if the persist
1ac00 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72  ent media suppor
1ac10 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ts the.        *
1ac20 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72  * SAFE_APPEND pr
1ac30 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65 20  operty. Because 
1ac40 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 20  in this case it 
1ac50 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1ac60 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  .        ** for 
1ac70 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f 20  garbage data to 
1ac80 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
1ac90 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65  he file, the nRe
1aca0 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20  c field.        
1acb0 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  ** is populated 
1acc0 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46 20  with 0xFFFFFFFF 
1acd0 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
1ace0 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74   header is writt
1acf0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  en.        ** an
1ad00 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f  d never needs to
1ad10 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
1ad20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1ad30 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
1ad40 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
1ad50 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
1ad60 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
1ad70 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1ad80 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1ad90 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1ada0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1adb0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1adc0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1add0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
1ade0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1adf0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1ae00 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
1ae10 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ags);.          
1ae20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ae30 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1ae40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ae50 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
1ae60 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67  %p %lld\n", pPag
1ae70 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
1ae80 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20 20  nalHdr));.      
1ae90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1aea0 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20 20  Write(.         
1aeb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20     pPager->jfd, 
1aec0 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
1aed0 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65 72  zHeader), pPager
1aee0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 09 29 3b  ->journalHdr..);
1aef0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1af00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1af10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1af20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1af30 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1af40 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1af50 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1af60 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1af70 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1af80 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1af90 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1afa0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1afb0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
1afc0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1afd0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1afe0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
1aff0 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
1b000 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
1b010 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1b020 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
1b030 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
1b040 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1b050 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b060 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b070 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b080 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1b090 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63  le was just succ
1b0a0 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
1b0b0 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53   Set Pager.needS
1b0c0 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a  ync .    ** to z
1b0d0 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ero and clear th
1b0e0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
1b0f0 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61  C flag on all pa
1b100 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gess..    */.   
1b110 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1b120 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1b130 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1b140 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d = 1;.    sqlit
1b150 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
1b160 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
1b170 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
1b180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
1b1a0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1b1b0 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
1b1c0 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
1b1d0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
1b1e0 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
1b1f0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
1b200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
1b210 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
1b220 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
1b230 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
1b240 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
1b250 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
1b260 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
1b270 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
1b280 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
1b290 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1b2a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
1b2b0 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
1b2c0 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
1b2d0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
1b2e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
1b2f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1b300 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
1b310 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
1b320 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
1b330 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1b340 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
1b350 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
1b360 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
1b370 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
1b380 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
1b390 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1b3a0 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
1b3b0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
1b3c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b3d0 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
1b3e0 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
1b3f0 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
1b400 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
1b410 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
1b420 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
1b430 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
1b440 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
1b450 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
1b460 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
1b470 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
1b480 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
1b490 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
1b4a0 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
1b4b0 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
1b4c0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
1b4d0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
1b4e0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
1b4f0 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
1b500 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
1b510 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
1b520 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
1b530 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
1b540 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
1b550 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
1b560 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
1b570 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
1b580 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
1b590 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
1b5a0 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
1b5b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
1b5c0 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
1b5d0 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
1b5e0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
1b5f0 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
1b600 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
1b610 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
1b620 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
1b630 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
1b640 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
1b650 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
1b660 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
1b670 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
1b680 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
1b690 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
1b6a0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1b6b0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
1b6c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
1b6d0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1b6e0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
1b6f0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
1b700 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
1b710 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
1b720 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
1b730 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
1b740 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
1b750 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1b760 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1b770 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
1b780 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
1b790 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
1b7a0 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1b7d0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1b800 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
1b810 66 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d  f( NEVER(pList==
1b820 30 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  0) ) return SQLI
1b830 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
1b840 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
1b850 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
1b860 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
1b870 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
1b880 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
1b890 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
1b8a0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
1b8b0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
1b8c0 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
1b8d0 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
1b8e0 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20  owing.  ** call 
1b8f0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
1b900 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
1b910 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
1b920 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
1b930 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
1b940 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
1b950 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
1b960 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
1b970 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
1b980 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
1b990 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
1b9a0 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
1b9b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
1b9c0 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
1b9d0 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
1b9e0 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
1b9f0 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
1ba00 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
1ba10 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
1ba20 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
1ba30 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
1ba40 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
1ba50 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
1ba60 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
1ba70 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
1ba80 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
1ba90 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
1baa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1bab0 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
1bac0 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
1bad0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1bae0 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
1baf0 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
1bb00 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1bb10 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1bb20 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
1bb30 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
1bb40 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
1bb50 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1bb60 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
1bb70 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
1bb80 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
1bb90 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
1bba0 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
1bbb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bbc0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1bbd0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63  RESERVED );.  rc
1bbe0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1bbf0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1bc00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a  CLUSIVE_LOCK);..
1bc10 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1bc20 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
1bc30 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1bc40 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
1bc50 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
1bc60 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
1bc70 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
1bc80 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
1bc90 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
1bca0 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
1bcb0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1bcc0 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1bcd0 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
1bce0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
1bcf0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1bd00 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1bd10 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1bd20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1bd30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
1bd40 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
1bd50 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
1bd60 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
1bd70 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
1bd80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bd90 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
1bda0 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
1bdb0 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
1bdc0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
1bdd0 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
1bde0 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
1bdf0 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1be00 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
1be10 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
1be20 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
1be30 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1be40 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
1be50 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
1be60 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
1be70 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
1be80 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
1be90 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
1bea0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
1beb0 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
1bec0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1bed0 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
1bee0 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
1bef0 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
1bf00 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1bf10 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
1bf20 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
1bf30 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
1bf40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1bf50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
1bf60 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
1bf70 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
1bf80 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
1bf90 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1bfa0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1bfb0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1bfc0 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77    /* Offset to w
1bfd0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68  rite */.      ch
1bfe0 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ar *pData;      
1bff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c010 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f  Data to write */
1c020 20 20 20 20 0a 0a 20 20 20 20 20 20 2f 2a 20 45      ..      /* E
1c030 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
1c040 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
1c050 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
1c060 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
1c070 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1c080 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b 0a 0a  NOMEM, pData);..
1c090 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
1c0a0 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
1c0b0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
1c0c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1c0d0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
1c0e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1c0f0 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
1c100 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
1c110 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
1c120 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
1c130 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
1c140 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
1c150 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
1c160 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
1c170 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
1c180 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
1c190 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
1c1a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c1b0 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
1c1c0 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
1c1d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1c1e0 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
1c1f0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1c200 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
1c210 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
1c220 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1c230 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
1c240 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
1c250 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
1c260 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
1c270 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1c280 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
1c290 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
1c2a0 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
1c2b0 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
1c2c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
1c2d0 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
1c2e0 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1c2f0 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1c300 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
1c310 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
1c320 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1c330 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
1c340 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1c350 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1c360 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1c370 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
1c380 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
1c390 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
1c3a0 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
1c3b0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1c3c0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
1c3d0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1c3e0 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
1c3f0 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
1c400 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1c410 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73  Write);.    }els
1c420 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1c430 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE(("NOSTORE %d
1c440 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1c450 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
1c460 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  no));.    }.#ifd
1c470 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1c480 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
1c490 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
1c4a0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
1c4b0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
1c4c0 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
1c4d0 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
1c4e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c4f0 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20  Append a record 
1c500 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
1c510 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50 67  tate of page pPg
1c520 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1c530 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74  nal. .** It is t
1c540 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f  he callers respo
1c550 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65  nsibility to use
1c560 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1c570 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a  e() to check .**
1c580 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61 6c   that it is real
1c590 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ly required befo
1c5a0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
1c5b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
1c5c0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
1c5d0 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65  et the bit corre
1c5e0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d  sponding to pPg-
1c5f0 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74  >pgno in the bit
1c600 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20  vecs.** for all 
1c610 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
1c620 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1c630 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
1c640 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
1c650 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
1c660 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
1c670 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  ful, an IO.** er
1c680 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20  ror code if the 
1c690 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
1c6a0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
1c6b0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
1c6c0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
1c6d0 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  f a malloc fails
1c6e0 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61   while setting a
1c6f0 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f   bit in a savepo
1c700 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a  int.** bitvec..*
1c710 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  /.static int sub
1c720 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64  journalPage(PgHd
1c730 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  r *pPg){.  int r
1c740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c750 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c760 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c770 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1c780 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
1c790 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
1c7a0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36  g->pData;.    i6
1c7b0 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65  4 offset = pPage
1c7c0 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
1c7d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c7e0 0a 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61  .    char *pData
1c7f0 32 3b 0a 0a 20 20 20 20 43 4f 44 45 43 32 28 70  2;..    CODEC2(p
1c800 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1c810 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75  g->pgno, 7, retu
1c820 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
1c830 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 50 41   pData2);.    PA
1c840 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
1c850 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1c860 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1c870 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1c880 6f 29 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65  o));.  .    asse
1c890 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
1c8a0 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
1c8b0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
1c8c0 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63  igSize );.    rc
1c8d0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1c8e0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
1c8f0 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
1c900 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c910 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c920 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1c930 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
1c940 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
1c950 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
1c960 65 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  et+4);.    }.  }
1c970 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
1c990 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20  er->nSubRec++;. 
1c9a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c9b0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
1c9c0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54  );.    rc = addT
1c9d0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
1c9e0 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
1c9f0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
1ca00 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1ca10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1ca20 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1ca30 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
1ca40 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
1ca50 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
1ca60 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
1ca70 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1ca80 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1ca90 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a   Pager object.**
1caa0 20 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64   (cast as a void
1cab0 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73  *). The pager is
1cac0 20 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62   always 'purgeab
1cad0 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d  le' (not an in-m
1cae0 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73  emory.** databas
1caf0 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  e). The second a
1cb00 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66  rgument is a ref
1cb10 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65  erence to a page
1cb20 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72   that is .** cur
1cb30 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74  rently dirty but
1cb40 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1cb50 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20  ing references. 
1cb60 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61  The page.** is a
1cb70 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64  lways associated
1cb80 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20   with the Pager 
1cb90 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
1cba0 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61   the first .** a
1cbb0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  rgument..**.** T
1cbc0 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66  he job of this f
1cbd0 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61  unction is to ma
1cbe0 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20  ke pPg clean by 
1cbf0 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74  writing its cont
1cc00 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74  ents.** out to t
1cc10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1cc20 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54  , if possible. T
1cc30 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20  his may involve 
1cc40 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a  syncing the.** j
1cc50 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a  ournal file. .**
1cc60 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1cc70 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  l, sqlite3Pcache
1cc80 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63  MakeClean() is c
1cc90 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67  alled on the pag
1cca0 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  e and.** SQLITE_
1ccb0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
1ccc0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1ccd0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
1cce0 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70  to make the.** p
1ccf0 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49  age clean, the I
1cd00 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
1cd10 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65  returned. If the
1cd20 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a   page cannot be.
1cd30 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f  ** made clean fo
1cd40 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61  r some other rea
1cd50 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  son, but no erro
1cd60 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53  r occurs, then S
1cd70 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
1cd80 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1cd90 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1cda0 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65  n() is not calle
1cdb0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1cdc0 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
1cdd0 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
1cde0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1cdf0 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
1ce00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1ce10 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1ce20 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70  ( pPg->pPager==p
1ce30 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
1ce40 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
1ce50 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20  HDR_DIRTY );..  
1ce60 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63  /* The doNotSync
1ce70 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
1ce80 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
1ce90 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
1cea0 20 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69   while it.  ** i
1ceb0 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20  s journalling a 
1cec0 73 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  set of two or mo
1ced0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
1cee0 73 20 74 68 61 74 20 61 72 65 20 73 74 6f 72 65  s that are store
1cef0 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61  d.  ** on the sa
1cf00 6d 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  me disk sector. 
1cf10 53 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72  Syncing the jour
1cf20 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  nal is not allow
1cf30 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68  ed while.  ** th
1cf40 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
1cf50 61 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  as it is importa
1cf60 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62  nt that all memb
1cf70 65 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20  ers of such a.  
1cf80 2a 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73 20  ** set of pages 
1cf90 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69  are synced to di
1cfa0 73 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c  sk together. So,
1cfb0 20 69 66 20 74 68 65 20 70 61 67 65 20 74 68 69   if the page thi
1cfc0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
1cfd0 69 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  is trying to mak
1cfe0 65 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71  e clean will req
1cff0 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73  uire a journal s
1d000 79 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f  ync and the doNo
1d010 74 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  tSync.  ** flag 
1d020 69 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77  is set, return w
1d030 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
1d040 74 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68  thing. The pcach
1d050 65 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a  e layer will.  *
1d060 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67  * just have to g
1d070 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f  o ahead and allo
1d080 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
1d090 62 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f  buffer instead o
1d0a0 66 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70  f.  ** reusing p
1d0b0 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69  Pg..  **.  ** Si
1d0c0 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20  milarly, if the 
1d0d0 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64  pager has alread
1d0e0 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72  y entered the er
1d0f0 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ror state, do no
1d100 74 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72  t.  ** try to wr
1d110 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
1d120 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e   of pPg to disk.
1d130 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  .  */.  if( NEVE
1d140 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  R(pPager->errCod
1d150 65 29 0a 20 20 20 7c 7c 20 28 70 50 61 67 65 72  e).   || (pPager
1d160 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70  ->doNotSync && p
1d170 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d180 4e 45 45 44 5f 53 59 4e 43 29 0a 20 20 29 7b 0a  NEED_SYNC).  ){.
1d190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d1a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
1d1b0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
1d1c0 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
1d1d0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  d. */.  if( pPg-
1d1e0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1d1f0 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63  D_SYNC ){.    rc
1d200 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
1d210 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1d220 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d230 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1d240 63 20 26 26 20 0a 20 20 20 20 20 20 21 28 70 50  c && .      !(pP
1d250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1d260 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
1d270 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a  MODE_MEMORY) &&.
1d280 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f        !(sqlite3O
1d290 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1d2a0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1d2b0 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  d)&SQLITE_IOCAP_
1d2c0 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20  SAFE_APPEND).   
1d2d0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1d2e0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
1d2f0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1d300 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1d310 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1d320 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
1d330 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
1d340 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
1d350 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1d360 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  of.  ** the data
1d370 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d  base image, it m
1d380 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72  ay need to be wr
1d390 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
1d3a0 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54  -journal..  ** T
1d3b0 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
1d3c0 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72  he call to pager
1d3d0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1d3e0 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74  ) below will not
1d3f0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77  .  ** actually w
1d400 72 69 74 65 20 64 61 74 61 20 74 6f 20 74 68 65  rite data to the
1d410 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
1d420 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f  se..  **.  ** Co
1d430 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f  nsider the follo
1d440 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66  wing sequence of
1d450 20 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20   events:.  **.  
1d460 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a  **   BEGIN;.  **
1d470 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
1d480 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c  ge X>.  **     <
1d490 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20  modify page X>. 
1d4a0 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e   **     SAVEPOIN
1d4b0 54 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20  T sp;.  **      
1d4c0 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73   <shrink databas
1d4d0 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65  e file to Y page
1d4e0 73 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61  s>.  **       pa
1d4f0 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
1d500 29 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  ).  **     ROLLB
1d510 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a  ACK TO sp;.  **.
1d520 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74    ** If (X>Y), t
1d530 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74  hen when pagerSt
1d540 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70  ress is called p
1d550 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62  age X will not b
1d560 65 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f  e written.  ** o
1d570 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
1d580 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
1d590 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
1d5a0 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
1d5b0 6e 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  n,.  ** followin
1d5c0 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20  g the "ROLLBACK 
1d5d0 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74  TO sp" statement
1d5e0 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 58  , reading page X
1d5f0 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20   will read.  ** 
1d600 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61  data from the da
1d610 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
1d620 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  s will be the co
1d630 70 79 20 6f 66 20 70 61 67 65 20 58 20 61 73 20  py of page X as 
1d640 69 74 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e  it.  ** was when
1d650 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d660 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73   started, not as
1d670 20 69 74 20 77 61 73 20 77 68 65 6e 20 22 53 41   it was when "SA
1d680 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a  VEPOINT sp".  **
1d690 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
1d6a0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c   **.  ** The sol
1d6b0 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74  ution is to writ
1d6c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61  e the current da
1d6d0 74 61 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e  ta for page X in
1d6e0 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62  to the .  ** sub
1d6f0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f  -journal file no
1d700 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  w (if it is not 
1d710 61 6c 72 65 61 64 79 20 74 68 65 72 65 29 2c 20  already there), 
1d720 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a  so that it will.
1d730 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
1d740 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
1d750 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
1d760 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
1d770 69 73 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65  is .  ** execute
1d780 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  d..  */.  if( NE
1d790 56 45 52 28 0a 20 20 20 20 20 20 72 63 3d 3d 53  VER(.      rc==S
1d7a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
1d7b0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1d7c0 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
1d7d0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
1d7e0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75  ) ){.    rc = su
1d7f0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
1d800 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
1d810 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1d820 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74 20  of the page out 
1d830 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d840 66 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72  file. */.  if( r
1d850 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d860 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
1d870 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
1d880 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1d890 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  st(pPg);.  }..  
1d8a0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
1d8b0 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
1d8c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d8d0 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
1d8e0 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
1d8f0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1d900 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1d910 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
1d920 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
1d930 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
1d940 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
1d950 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1d960 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
1d970 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
1d980 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
1d990 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
1d9a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
1d9b0 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
1d9c0 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
1d9d0 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
1d9e0 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
1d9f0 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
1da00 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
1da10 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
1da20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1da30 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
1da40 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
1da50 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
1da60 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
1da70 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
1da80 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
1da90 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
1daa0 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
1dab0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
1dac0 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
1dad0 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
1dae0 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
1daf0 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
1db00 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
1db10 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
1db20 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
1db30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
1db40 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
1db50 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
1db60 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
1db70 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
1db80 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
1db90 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1dba0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
1dbb0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
1dbc0 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
1dbd0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1dbe0 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
1dbf0 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
1dc00 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
1dc10 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
1dc20 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
1dc30 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
1dc40 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
1dc50 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a  tExtra() API..**
1dc60 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
1dc70 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
1dc80 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
1dc90 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
1dca0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
1dcb0 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
1dcc0 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
1dcd0 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
1dce0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
1dcf0 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49  of the PAGER_OMI
1dd00 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41  T_JOURNAL and PA
1dd10 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20  GER_NO_READLOCK 
1dd20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
1dd30 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
1dd40 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
1dd50 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
1dd60 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
1dd70 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
1dd80 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
1dd90 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
1dda0 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
1ddb0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
1ddc0 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
1ddd0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1dde0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
1ddf0 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
1de00 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
1de10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
1de20 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
1de30 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
1de40 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
1de50 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
1de60 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
1de70 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
1de80 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
1de90 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
1dea0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
1deb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1dec0 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
1ded0 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
1dee0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
1def0 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
1df00 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
1df10 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
1df20 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
1df30 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
1df40 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
1df50 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
1df60 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
1df70 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
1df80 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
1df90 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
1dfa0 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
1dfb0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1dfc0 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
1dfd0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1dfe0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1dff0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e000 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1e010 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
1e020 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
1e030 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
1e040 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
1e050 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
1e060 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1e070 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
1e080 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
1e090 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
1e0a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
1e0b0 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
1e0c0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
1e0d0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
1e0e0 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
1e0f0 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
1e100 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
1e110 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
1e120 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
1e130 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e140 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
1e150 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
1e160 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
1e170 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1e180 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
1e190 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e1a0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
1e1b0 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
1e1c0 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
1e1d0 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
1e1e0 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
1e1f0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
1e200 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e210 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
1e220 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
1e230 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
1e240 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
1e250 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1e260 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
1e270 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
1e280 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
1e290 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
1e2a0 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
1e2b0 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
1e2c0 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
1e2d0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
1e2e0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
1e2f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
1e300 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
1e310 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1e320 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
1e330 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
1e340 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
1e350 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
1e360 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
1e370 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
1e380 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64   */.  int noRead
1e390 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20  lock = (flags & 
1e3a0 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
1e3b0 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20  K)!=0;  /* True 
1e3c0 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63  to omit read-loc
1e3d0 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68  k */.  int pcach
1e3e0 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50  eSize = sqlite3P
1e3f0 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20  cacheSize();    
1e400 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
1e410 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63  llocate for PCac
1e420 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61  he */.  u16 szPa
1e430 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
1e440 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1e450 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70  E;  /* Default p
1e460 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f  age size */..  /
1e470 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
1e480 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
1e490 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
1e4a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
1e4b0 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
1e4c0 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
1e4d0 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
1e4e0 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
1e4f0 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20  ournal). This.  
1e500 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ** is the maximu
1e510 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
1e520 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
1e530 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  y journal file h
1e540 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20  andle .  ** and 
1e550 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  a regular journa
1e560 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e  l file-handle. N
1e570 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75  ote that a "regu
1e580 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64  lar journal-hand
1e590 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  le".  ** may be 
1e5a0 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c  a wrapper capabl
1e5b0 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65  e of caching the
1e5c0 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f   first portion o
1e5d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
1e5e0 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72  ** file in memor
1e5f0 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  y to implement t
1e600 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
1e610 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65  optimization (se
1e620 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66  e .  ** source f
1e630 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a  ile journal.c)..
1e640 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
1e650 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
1e660 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  fs)>sqlite3MemJo
1e670 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20  urnalSize() ){. 
1e680 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
1e690 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
1e6a0 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
1e6b0 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Vfs));.  }else{.
1e6c0 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1e6d0 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c  ize = ROUND8(sql
1e6e0 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69  ite3MemJournalSi
1e6f0 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ze());.  }..  /*
1e700 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1e710 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c  variable to NULL
1e720 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f   in case an erro
1e730 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a  r occurs. */.  *
1e740 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
1e750 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
1e760 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
1e770 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
1e780 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
1e790 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
1e7a0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
1e7b0 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
1e7c0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
1e7d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
1e7e0 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
1e7f0 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
1e800 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
1e810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
1e820 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
1e830 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61  me[0] ){.    nPa
1e840 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
1e850 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
1e860 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
1e870 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68  ite3Malloc(nPath
1e880 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
1e890 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
1e8a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e8b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1e8c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
1e8d0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
1e8e0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
1e8f0 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
1e900 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
1e910 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
1e920 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
1e930 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  0;.    }else.#en
1e940 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
1e950 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
1e960 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69  ; /* Make sure i
1e970 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20  nitialized even 
1e980 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  if FullPathname(
1e990 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20  ) fails */.     
1e9a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1e9b0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
1e9c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
1e9d0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
1e9e0 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  e);.    }..    n
1e9f0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
1ea00 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
1ea10 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
1ea20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ea30 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73  nPathname+8>pVfs
1ea40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a  ->mxPathname ){.
1ea50 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
1ea60 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
1ea70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70  en the journal p
1ea80 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a  ath required by.
1ea90 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
1eaa0 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e  abase being open
1eab0 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20  ed will be more 
1eac0 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74  than pVfs->mxPat
1ead0 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62  hname.      ** b
1eae0 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
1eaf0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64  This means the d
1eb00 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62  atabase cannot b
1eb10 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20  e opened,.      
1eb20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f  ** as it will no
1eb30 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f  t be possible to
1eb40 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
1eb50 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20  l file or even. 
1eb60 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f       ** check fo
1eb70 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
1eb80 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a  before reading..
1eb90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
1eba0 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
1ebb0 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
1ebc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ebd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1ebe0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1ebf0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
1ec00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ec10 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
1ec20 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
1ec30 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1ec40 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
1ec50 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
1ec60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
1ec70 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
1ec80 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
1ec90 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
1eca0 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
1ecb0 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
1ecc0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
1ecd0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
1ece0 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
1ed00 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
1ed10 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
1ed20 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
1ed30 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1ed40 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
1ed50 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1ed60 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
1ed70 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
1ed80 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
1ed90 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1eda0 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
1edb0 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
1edc0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1edd0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1ede0 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
1edf0 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
1ee00 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
1ee10 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
1ee20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
1ee30 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
1ee40 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
1ee50 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
1ee60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1ee70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ee80 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
1ee90 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
1eea0 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
1eeb0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
1eec0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
1eed0 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
1eee0 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
1eef0 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
1ef00 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
1ef10 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
1ef20 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
1ef30 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
1ef40 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
1ef50 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
1ef60 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
1ef70 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
1ef80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ef90 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
1efa0 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
1efb0 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
1efc0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
1efd0 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
1efe0 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20  thname + 8 + 1  
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1f000 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a  Journal */.  );.
1f010 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1f020 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53  BYTE_ALIGNMENT(S
1f030 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1f040 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1f050 29 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74  )) );.  if( !pPt
1f060 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
1f070 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1f080 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f090 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
1f0a0 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
1f0b0 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
1f0c0 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
1f0d0 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
1f0e0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
1f0f0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
1f100 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
1f110 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
1f120 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
1f130 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
1f140 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
1f150 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
1f160 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
1f170 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
1f180 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
1f190 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
1f1a0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
1f1b0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
1f1c0 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
1f1d0 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
1f1e0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
1f1f0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
1f200 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1f210 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1f220 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
1f230 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
1f240 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
1f250 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
1f260 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
1f270 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
1f280 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
1f290 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
1f2a0 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
1f2b0 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
1f2c0 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d  me + 1);.    mem
1f2d0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
1f2e0 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
1f2f0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
1f300 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
1f310 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
1f320 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
1f330 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
1f340 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
1f350 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
1f360 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69  rnal", 8);.    i
1f370 66 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  f( pPager->zFile
1f380 6e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61  name[0]==0 ) pPa
1f390 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d  ger->zJournal[0]
1f3a0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1f3b0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
1f3c0 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
1f3d0 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
1f3e0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
1f3f0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20   = vfsFlags;..  
1f400 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
1f410 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  r file..  */.  i
1f420 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
1f430 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20  zFilename[0] && 
1f440 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e  !memDb ){.    in
1f450 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20  t fout = 0;     
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f470 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75  * VFS flags retu
1f480 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20  rned by xOpen() 
1f490 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1f4a0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
1f4b0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f4c0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76  e, pPager->fd, v
1f4d0 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b  fsFlags, &fout);
1f4e0 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20  .    readOnly = 
1f4f0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
1f500 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
1f510 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1f520 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
1f530 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61  y opened for rea
1f540 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a  d/write access,.
1f550 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20      ** choose a 
1f560 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
1f570 65 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76  e in case we hav
1f580 65 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  e to create the.
1f590 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1f5a0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
1f5b0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
1f5c0 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
1f5d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1f5e0 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  + SQLITE_DEFAULT
1f5f0 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20  _PAGE_SIZE,.    
1f600 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75  **    + The valu
1f610 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1f620 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
1f630 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  e().    **    + 
1f640 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65  The largest page
1f650 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62   size that can b
1f660 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
1f670 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ally..    */.   
1f680 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f690 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20  OK && !readOnly 
1f6a0 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74  ){.      setSect
1f6b0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
1f6c0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
1f6d0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
1f6e0 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
1f6f0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1f700 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IZE);.      if( 
1f710 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
1f720 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
1f730 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1f740 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
1f750 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1f760 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
1f770 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
1f780 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
1f790 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1f7a0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  IZE;.        }el
1f7b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  se{.          sz
1f7c0 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29  PageDflt = (u16)
1f7d0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1f7e0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ze;.        }.  
1f7f0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1f800 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
1f810 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a  C_WRITE.      {.
1f820 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20          int iDc 
1f830 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
1f840 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1f850 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
1f860 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
1f870 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
1f880 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f890 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
1f8a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
1f8b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f8c0 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
1f8d0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
1f8e0 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  rt(SQLITE_MAX_DE
1f8f0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c  FAULT_PAGE_SIZE<
1f900 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20  =65536);.       
1f910 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
1f920 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
1f930 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f940 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
1f950 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44            if( iD
1f960 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  c&(SQLITE_IOCAP_
1f970 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20  ATOMIC|(ii>>8)) 
1f980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1f990 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
1f9a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f9b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
1f9c0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ndif.    }.  }el
1f9d0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  se{.    /* If a 
1f9e0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
1f9f0 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
1fa00 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
1fa10 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
1fa20 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
1fa30 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
1fa40 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
1fa50 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
1fa60 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
1fa70 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
1fa80 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
1fa90 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
1faa0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1fab0 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72  branch is also r
1fac0 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  un for an in-mem
1fad0 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e  ory database. An
1fae0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a   in-memory.    *
1faf0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68  * database is th
1fb00 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70  e same as a temp
1fb10 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65  -file that is ne
1fb20 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20  ver written out 
1fb30 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61  to.    ** disk a
1fb40 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65  nd uses an in-me
1fb50 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  mory rollback jo
1fb60 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20  urnal..    */ . 
1fb70 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b     tempFile = 1;
1fb80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
1fb90 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
1fba0 53 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e  SIVE;.    readOn
1fbb0 6c 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53  ly = (vfsFlags&S
1fbc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1fbd0 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  NLY);.  }..  /* 
1fbe0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
1fbf0 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61  ll to PagerSetPa
1fc00 67 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20  gesize() serves 
1fc10 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65  to set the value
1fc20 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e   of .  ** Pager.
1fc30 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20  pageSize and to 
1fc40 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67  allocate the Pag
1fc50 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
1fc60 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  fer..  */.  if( 
1fc70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fc80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fc90 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b  ger->memDb==0 );
1fca0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1fcb0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
1fcc0 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67  e(pPager, &szPag
1fcd0 65 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20  eDflt, -1);.    
1fce0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1fcf0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
1fd00 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
1fd10 20 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74   occurred in eit
1fd20 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
1fd30 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
1fd40 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
1fd50 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
1fd60 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
1fd70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1fd80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1fd90 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
1fda0 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
1fdb0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1fdc0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
1fdd0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1fde0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
1fdf0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
1fe00 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
1fe10 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
1fe20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31  assert( nExtra<1
1fe30 30 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20  000 );.  nExtra 
1fe40 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
1fe50 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
1fe60 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
1fe70 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
1fe80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fe90 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
1fea0 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
1feb0 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
1fec0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
1fed0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
1fee0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
1fef0 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
1ff00 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
1ff10 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
1ff20 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
1ff30 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
1ff40 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1ff50 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
1ff60 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
1ff70 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
1ff80 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1ff90 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
1ffa0 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
1ffb0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
1ffc0 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
1ffd0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
1ffe0 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
1fff0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
20000 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
20010 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
20020 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20  (u8)memDb;.  /* 
20030 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
20040 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
20050 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
20060 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
20070 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
20080 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
20090 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
200a0 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
200b0 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
200c0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
200d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
200e0 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
200f0 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
20100 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
20110 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
20120 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
20130 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
20140 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
20150 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
20160 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
20170 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
20180 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
20190 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
201a0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
201b0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
201c0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
201d0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
201e0 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
201f0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
20200 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
20210 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
20220 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
20230 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
20240 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
20250 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
20260 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
20270 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
20280 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
20290 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
202a0 2f 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a  /.  assert( useJ
202b0 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72  ournal || pPager
202c0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
202d0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
202e0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
202f0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
20300 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  lSync = pPager->
20310 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70  noSync ?0:1;.  p
20320 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
20330 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
20340 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
20350 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
20360 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20370 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
20380 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20390 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
203a0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
203b0 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b  a = (u16)nExtra;
203c0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
203d0 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
203e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
203f0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
20400 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
20410 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
20420 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73   tempFile );.  s
20430 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
20440 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65  ger);.  if( !use
20450 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70  Journal ){.    p
20460 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
20470 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
20480 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65  ALMODE_OFF;.  }e
20490 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  lse if( memDb ){
204a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
204b0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
204c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
204d0 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
204e0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
204f0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
20500 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
20510 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
20520 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
20530 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20  ter = xReinit;. 
20540 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
20550 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
20560 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
20570 68 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61  h)); */..  *ppPa
20580 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
20590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
205a0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
205b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
205c0 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
205d0 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
205e0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
205f0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
20600 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
20610 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
20620 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
20630 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
20640 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
20650 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
20660 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
20670 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
20680 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
20690 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
206a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
206b0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
206c0 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
206d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
206e0 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a  eria are met:.**
206f0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72  .**   * The jour
20700 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
20710 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
20720 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e  em, and.**   * N
20730 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  o process holds 
20740 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
20750 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
20760 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
20770 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
20780 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74  database file it
20790 73 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20  self is greater 
207a0 74 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20  than 0 bytes in 
207b0 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  size, and.**   *
207c0 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
207d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
207e0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69  ile exists and i
207f0 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a  s not 0x00..**.*
20800 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
20810 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
20820 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
20830 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
20840 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
20850 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
20860 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
20870 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
20880 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
20890 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
208a0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
208b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
208c0 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
208d0 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
208e0 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
208f0 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
20900 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
20910 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
20920 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
20930 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68   not check if th
20940 65 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20  ere is a master 
20950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
20960 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
20970 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  f the file. If t
20980 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61  here is, and tha
20990 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  t master journal
209a0 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f   file.** does no
209b0 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68  t exist, then th
209c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
209d0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
209e0 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73  . In this.** cas
209f0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
20a00 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c  ill return a fal
20a10 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65  se-positive. The
20a20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
20a30 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c  ).** routine wil
20a40 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20  l discover that 
20a50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20a60 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
20a70 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20  ot and .** will 
20a80 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b  not roll it back
20a90 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f  . .**.** If a ho
20aa0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
20ab0 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74  s found to exist
20ac0 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65  , *pExists is se
20ad0 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53  t to 1 and .** S
20ae0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
20af0 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75  d. If no hot-jou
20b00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
20b10 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69  sent, *pExists i
20b20 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e  s.** set to 0 an
20b30 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
20b40 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
20b50 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
20b60 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64  e trying.** to d
20b70 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
20b80 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f   or not a hot-jo
20b90 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
20ba0 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a  s, the IO error.
20bb0 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  ** code is retur
20bc0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
20bd0 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73  e of *pExists is
20be0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
20bf0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
20c00 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
20c10 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69  Pager, int *pExi
20c20 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sts){.  sqlite3_
20c30 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
20c40 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
20c50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c70 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
20c80 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b  */.  int exists;
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
20cb0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20cc0 70 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  present */..  as
20cd0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
20ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20cf0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
20d00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
20d10 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
20d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73  );.  assert( !is
20d30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
20d40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20d50 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20  Pager->state <= 
20d60 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
20d70 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
20d80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20d90 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
20da0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20db0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20dc0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
20dd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20de0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
20df0 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e10 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
20e20 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
20e30 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
20e40 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
20e50 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
20e60 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
20e70 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
20e80 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
20e90 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
20ea0 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
20eb0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
20ec0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
20ed0 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
20ee0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
20ef0 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
20f00 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
20f10 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
20f20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
20f30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
20f40 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
20f50 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
20f60 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
20f70 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
20f80 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
20f90 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
20fa0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
20fb0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
20fc0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
20fd0 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
20fe0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
20ff0 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
21000 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
21010 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
21020 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
21030 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
21040 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
21050 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
21060 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
21070 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
21080 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21090 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
210a0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
210b0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
210c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
210d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
210e0 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
210f0 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
21100 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
21110 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21120 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
21130 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
21140 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
21150 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
21160 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73    Delete the obs
21170 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
21180 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a  le under.      *
21190 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * a RESERVED loc
211a0 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20  k to avoid race 
211b0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
211c0 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e  o avoid violatin
211d0 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30  g.      ** [H330
211e0 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  20]..      */.  
211f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21200 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
21210 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21220 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21240 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
21250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21260 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
21270 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
21280 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
21290 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
212a0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d   RESERVED_LOCK)=
212b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
212c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
212d0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
212e0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
212f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
21300 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
21310 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
21320 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
21330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21340 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
21350 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
21360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21370 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
21380 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
21390 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  and no other con
213a0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65  nection has a re
213b0 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20  served.         
213c0 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c   ** or greater l
213d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
213e0 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68  ase file. Now ch
213f0 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
21400 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
21410 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d  t least one non-
21420 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68  zero bytes at th
21430 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
21440 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
21450 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
21460 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63  re is, then we c
21470 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75  onsider this jou
21480 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20  rnal to be hot. 
21490 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20  If not, .       
214a0 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
214b0 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20  ignored..       
214c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
214d0 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f  int f = SQLITE_O
214e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
214f0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
21500 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
21510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
21520 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
21530 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
21540 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
21550 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21570 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66              u8 f
21580 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  irst = 0;.      
21590 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
215a0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
215b0 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66  >jfd, (void *)&f
215c0 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  irst, 1, 0);.   
215d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
215e0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
215f0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
21600 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
21610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
21620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21630 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
21640 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
21650 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
21660 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
21670 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
21680 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
21690 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
216a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
216b0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
216c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
216d0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
216e0 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
216f0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20           ** its 
21700 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
21710 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
21720 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
21730 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
21740 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
21750 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
21760 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
21770 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
21780 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
21790 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
217a0 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
217b0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
217c0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
217d0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
217e0 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
217f0 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
21800 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
21810 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
21820 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
21830 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
21840 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
21850 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
21860 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21870 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
21880 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
21890 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
218a0 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
218b0 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
218c0 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
218d0 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
218e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
218f0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
21900 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
21910 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21920 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21930 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
21940 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
21950 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
21960 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
21970 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
21980 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21990 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
219a0 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
219b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
219c0 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
219d0 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
219e0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
219f0 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
21a00 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
21a10 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
21a20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
21a30 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
21a40 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
21a50 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
21a60 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
21a70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a80 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
21a90 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
21aa0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
21ab0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
21ac0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
21ad0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
21ae0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
21af0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
21b00 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
21b10 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
21b20 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
21b30 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65  r; /* Pager obje
21b40 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ct associated wi
21b50 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20  th page pPg */. 
21b60 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
21b70 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a  ->pgno;       /*
21b80 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
21b90 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  read */.  int rc
21ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21bb0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
21bc0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69   code */.  i64 i
21bd0 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
21be0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
21bf0 6f 66 66 73 65 74 20 6f 66 20 66 69 6c 65 20 74  offset of file t
21c00 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a  o read from */..
21c10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21c20 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
21c30 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20  HARED && !MEMDB 
21c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
21c50 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
21c60 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
21c70 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
21c80 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65  fd)) ){.    asse
21c90 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
21ca0 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  File );.    mems
21cb0 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
21cc0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
21cd0 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ze);.    return 
21ce0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21cf0 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f   iOffset = (pgno
21d00 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
21d10 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20  >pageSize;.  rc 
21d20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
21d30 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d  pPager->fd, pPg-
21d40 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  >pData, pPager->
21d50 70 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65  pageSize, iOffse
21d60 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
21d70 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
21d80 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 72 63 20  _READ ){.    rc 
21d90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
21da0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
21db0 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
21dc0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
21dd0 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
21de0 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
21df0 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
21e00 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
21e10 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
21e20 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
21e30 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
21e40 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
21e50 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
21e60 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
21e70 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
21e80 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
21e90 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
21ea0 20 2a 2a 20 7a 65 72 6f 2e 20 20 42 79 74 65 73   ** zero.  Bytes
21eb0 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e   32..35 and 35..
21ec0 33 39 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67  39 should be pag
21ed0 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  e numbers which 
21ee0 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 6e 65 76  are.      ** nev
21ef0 65 72 20 30 78 66 66 66 66 66 66 66 66 2e 20 20  er 0xffffffff.  
21f00 53 6f 20 66 69 6c 6c 69 6e 67 20 70 50 61 67 65  So filling pPage
21f10 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  r->dbFileVers[] 
21f20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 0a 20 20  with all 0xff.  
21f30 20 20 20 20 2a 2a 20 62 79 74 65 73 20 73 68 6f      ** bytes sho
21f40 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20 20 20  uld suffice..   
21f50 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46     **.      ** F
21f60 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20  or an encrypted 
21f70 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 73 69  database, the si
21f80 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20  tuation is more 
21f90 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65 73 0a  complex:  bytes.
21fa0 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20        ** 24..39 
21fb0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21fc0 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73 65 2e  are white noise.
21fd0 20 20 42 75 74 20 74 68 65 20 70 72 6f 62 61 62    But the probab
21fe0 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20 20 2a  ility of.      *
21ff0 2a 20 77 68 69 74 65 20 6e 6f 69 73 69 6e 67 20  * white noising 
22000 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
22010 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
22020 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
22030 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
22040 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
22050 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
22060 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
22070 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
22080 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
22090 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
220a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
220b0 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
220c0 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
220d0 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
220e0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
220f0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
22100 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
22110 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
22120 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
22130 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
22140 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  Pg->pData, pgno,
22150 20 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f   3, rc = SQLITE_
22160 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41 47 45 52  NOMEM);..  PAGER
22170 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
22180 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
22190 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
221a0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
221b0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
221c0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
221d0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
221e0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
221f0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
22200 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
22210 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
22220 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
22230 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
22240 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
22250 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
22260 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
22270 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
22280 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
22290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
222a0 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
222b0 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
222c0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
222d0 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  () until after t
222e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
222f0 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
22300 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66  fully called. If
22310 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69   a shared-lock i
22320 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77  s already held w
22330 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
22340 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
22350 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
22360 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
22370 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  ng operations ar
22380 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64  e also performed
22390 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
223a0 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66  n..**.**   1) If
223b0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
223c0 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52  rrently in PAGER
223d0 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e  _UNLOCK state (n
223e0 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
223f0 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
22400 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
22410 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
22420 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
22430 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
22440 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
22450 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
22460 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
22470 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
22480 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
22490 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
224a0 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
224b0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
224c0 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
224d0 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
224e0 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
224f0 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
22500 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
22510 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
22520 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
22530 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
22540 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
22550 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
22560 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
22570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
22580 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
22590 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
225a0 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
225b0 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
225c0 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
225d0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
225e0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
225f0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
22600 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
22610 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
22620 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
22630 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
22640 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
22650 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
22660 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
22670 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
22680 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
22690 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
226a0 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
226b0 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
226c0 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
226d0 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
226e0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
226f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
22700 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69  operation descri
22710 62 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65  bed by (2) above
22720 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
22730 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a  d, and if the.**
22740 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20   pager is in an 
22750 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
22760 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
22770 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  LL when this is 
22780 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65  called,.** the e
22790 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
227a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
227b0 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74  d. It is permitt
227c0 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a  ed to read the.*
227d0 2a 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20  * database when 
227e0 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65  in SQLITE_FULL e
227f0 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
22800 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
22810 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
22820 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
22830 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
22840 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72   If an.** IO err
22850 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
22860 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
22870 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
22880 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
22890 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c  .** file or roll
228a0 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
228b0 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20  al file, the IO 
228c0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
228d0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
228e0 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
228f0 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
22900 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
22910 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
22920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22930 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
22940 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  nt isErrorReset 
22950 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22960 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63    /* True if rec
22970 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72  overing from err
22980 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f  or state */..  /
22990 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
229a0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
229b0 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
229c0 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
229d0 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
229e0 6e 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  nding pages */. 
229f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22a00 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
22a10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
22a20 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
22a30 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  R(MEMDB && pPage
22a40 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72  r->errCode) ){ r
22a50 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
22a60 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49  rCode; }..  /* I
22a70 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
22a80 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73  is in an error-s
22a90 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 61 20 63  tate, now is a c
22aa0 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20  hance to clear. 
22ab0 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44   ** the error. D
22ac0 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
22ad0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
22ae0 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62  -cache and rollb
22af0 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74  ack.  ** any hot
22b00 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20   journal in the 
22b10 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a  file-system..  *
22b20 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
22b30 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  errCode ){.    i
22b40 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
22b50 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
22b60 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  ->zJournal ){.  
22b70 20 20 20 20 69 73 45 72 72 6f 72 52 65 73 65 74      isErrorReset
22b80 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
22b90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
22ba0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22bb0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
22bc0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
22bd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
22be0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
22bf0 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
22c00 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
22c10 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
22c20 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
22c30 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61   int isHotJourna
22c40 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
22c50 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
22c60 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22c70 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
22c80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
22c90 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
22ca0 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
22cb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22cc0 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
22cd0 6c 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ly );.      pPag
22ce0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
22cf0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65  R_SHARED;.    }e
22d00 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
22d10 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
22d20 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
22d30 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
22d40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22d50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
22d60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
22d70 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
22d80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
22d90 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
22da0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
22db0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
22dc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
22dd0 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
22de0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
22df0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
22e00 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
22e10 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
22e20 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
22e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
22e40 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
22e50 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
22e60 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
22e70 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
22e80 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20  ( !isErrorReset 
22e90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
22ea0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c   pPager->state <
22eb0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  = PAGER_SHARED )
22ec0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  ;.      rc = has
22ed0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
22ee0 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c  r, &isHotJournal
22ef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
22f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22f10 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
22f20 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
22f30 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72  .    if( isError
22f40 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f  Reset || isHotJo
22f50 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f  urnal ){.      /
22f60 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
22f70 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
22f80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
22f90 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
22fa0 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
22fb0 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
22fc0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
22fd0 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
22fe0 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
22ff0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
23000 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
23010 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
23020 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
23030 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
23040 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
23050 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
23060 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
23070 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
23080 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
23090 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
230a0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
230b0 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
230c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
230d0 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
230e0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
230f0 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
23100 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
23110 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
23120 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
23130 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
23140 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
23150 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
23160 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
23170 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
23180 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
23190 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
231a0 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
231b0 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
231c0 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
231d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
231e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
231f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
23200 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ate<EXCLUSIVE_LO
23210 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
23220 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
23230 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
23240 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
23250 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23270 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
23280 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
23290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
232a0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
232b0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
232c0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
232d0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
232e0 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
232f0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
23300 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
23310 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
23320 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
23330 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
23340 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
23350 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
23360 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
23370 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f   and.      ** po
23380 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
23390 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
233a0 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
233b0 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
233c0 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
233d0 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
233e0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
233f0 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
23400 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72  res.      ** a r
23410 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68  ead/write file h
23420 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  andle..      */.
23430 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
23440 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
23450 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
23460 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
23470 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
23480 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f  pVfs,pPager->zJo
23490 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43  urnal,SQLITE_ACC
234a0 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29  ESS_EXISTS,&res)
234b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
234c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
234d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73           if( res
234e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
234f0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
23500 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
23510 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
23520 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
23530 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
23540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
23550 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
23560 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
23570 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23580 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
23590 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
235a0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
235b0 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
235c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
235d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
235e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
235f0 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
23600 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23610 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
23620 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
23630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
23650 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
23660 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
23670 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
23680 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
23690 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
236a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
236b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
236c0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
236d0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
236e0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
236f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23700 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
23710 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20   managed to get 
23720 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62  in and roll it b
23730 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20  ack before .    
23740 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
23750 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69  connection obtai
23760 6e 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76  ned the exclusiv
23770 65 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72  e lock above. Or
23780 2c 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20  , it .          
23790 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
237a0 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
237b0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
237c0 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
237d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
237e0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
237f0 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
23800 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
23810 78 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  xist.  */.      
23820 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
23830 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
23840 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
23850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23860 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
23870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
23890 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
238a0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   }..      /* TOD
238b0 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65 73 65  O: Why are these
238c0 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49   cleared here? I
238d0 73 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20  s it necessary? 
238e0 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
238f0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
23900 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
23910 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
23920 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
23930 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
23940 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
23950 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
23960 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
23970 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
23980 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
23990 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
239a0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
239b0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
239c0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
239d0 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
239e0 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
239f0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
23a00 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
23a10 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
23a20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
23a30 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
23a40 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f   cache..      */
23a50 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65  .      if( isOpe
23a60 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
23a70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
23a80 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
23a90 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
23aa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23ab0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
23ac0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f   rc = pager_erro
23ad0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
23ae0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61           goto fa
23af0 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
23b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
23b10 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 73  sert( (pPager->s
23b20 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
23b30 45 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ED).           |
23b40 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  | (pPager->exclu
23b50 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
23b60 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
23b70 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b  SHARED).      );
23b80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
23b90 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
23ba0 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  || sqlite3Pcache
23bb0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
23bc0 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a  ->pPCache)>0 ){.
23bd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
23be0 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
23bf0 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
23c00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23c10 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e  file.      ** an
23c20 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65  d there are alre
23c30 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  ady pages in the
23c40 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70   cache (from a p
23c50 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a  revious.      **
23c60 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
23c70 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68  ransaction).  Ch
23c80 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
23c90 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
23ca0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64   ** has been mod
23cb0 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
23cc0 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
23cd0 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20  ged, flush the. 
23ce0 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
23cf0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
23d00 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
23d10 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
23d20 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
23d30 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
23d40 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
23d50 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
23d60 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
23d70 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
23d80 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20  es are.      ** 
23d90 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
23da0 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
23db0 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
23dc0 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
23dd0 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73    ** other bytes
23de0 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79   change randomly
23df0 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20   with each file 
23e00 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20  change when.    
23e10 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20    ** a codec is 
23e20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a  in use..      **
23e30 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65   .      ** There
23e40 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
23e50 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
23e60 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
23e70 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
23e80 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
23e90 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
23ea0 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
23eb0 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
23ec0 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  t.      ** it ca
23ed0 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
23ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
23ef0 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20  nt nPage;.      
23f00 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
23f10 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
23f20 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
23f30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
23f40 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
23f50 20 26 6e 50 61 67 65 29 3b 0a 0a 20 20 20 20 20   &nPage);..     
23f60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
23f70 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
23f80 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
23f90 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f  Code;.        go
23fa0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
23fb0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 50   }..      if( nP
23fc0 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  age>0 ){.       
23fd0 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
23fe0 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
23ff0 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
24000 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
24010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
24020 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
24030 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
24040 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
24050 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
24060 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
24080 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
24090 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
240a0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
240b0 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
240c0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
240d0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
240e0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
240f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
24100 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
24110 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
24120 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
24130 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
24140 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
24150 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24160 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
24170 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
24180 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
24190 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66 61  ARED );.  }.. fa
241a0 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
241b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
241c0 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   /* pager_unlock
241d0 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
241e0 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  r exclusive mode
241f0 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
24200 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20  atabases. */.   
24210 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
24220 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
24230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24240 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
24250 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
24260 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
24270 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
24280 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
24290 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
242a0 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c  r..**.** Except,
242b0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
242c0 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20  =EXCLUSIVE when 
242d0 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
242e0 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f   to in.** the ro
242f0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
24300 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f  the unlock is no
24310 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20  t performed and 
24320 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68  there is.** noth
24330 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ing to rollback,
24340 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
24350 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20   is a no-op..*/ 
24360 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
24370 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
24380 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24390 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50  .  if( (sqlite3P
243a0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
243b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
243c0 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67 65  0).   && (!pPage
243d0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
243e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
243f0 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a  nalOff>0) .  ){.
24400 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
24410 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
24420 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
24430 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
24440 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
24450 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
24460 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
24470 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
24480 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
24490 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
244a0 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
244b0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
244c0 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
244d0 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
244e0 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
244f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
24500 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
24510 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
24520 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
24530 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
24540 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
24550 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
24560 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
24570 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
24580 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
24590 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
245a0 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
245b0 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
245c0 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
245d0 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
245e0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
245f0 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
24600 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
24610 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
24620 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
24630 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
24640 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
24650 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
24660 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
24670 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
24680 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
24690 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
246a0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
246b0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
246c0 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
246d0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
246e0 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
246f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24700 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
24710 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
24720 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
24730 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
24740 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
24750 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
24760 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
24770 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
24780 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
24790 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
247a0 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
247b0 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
247c0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
247d0 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
247e0 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
247f0 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
24800 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
24810 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
24820 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
24830 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
24840 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
24850 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
24860 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
24870 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
24880 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
24890 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
248a0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
248b0 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
248c0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
248d0 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
248e0 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70  ccurs in two sep
248f0 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a  erate scenarios:
24900 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
24910 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
24920 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
24930 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
24940 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
24950 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
24960 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
24970 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
24980 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
24990 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
249a0 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
249b0 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74 68  populate with th
249c0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
249d0 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
249e0 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
249f0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
24a00 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
24a10 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
24a20 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
24a30 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
24a40 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
24a50 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
24a60 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
24a70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
24a80 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
24a90 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
24aa0 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
24ab0 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
24ac0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
24ad0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
24ae0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
24af0 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
24b00 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
24b10 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
24b20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
24b30 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
24b40 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
24b50 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
24b60 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
24b70 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
24b80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
24b90 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
24ba0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
24bb0 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
24bc0 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
24bd0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
24be0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
24bf0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
24c00 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
24c10 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
24c20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
24c30 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
24c40 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
24c50 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
24c60 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
24c70 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
24c80 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
24c90 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
24ca0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
24cb0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
24cc0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
24cd0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
24ce0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
24cf0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
24d00 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
24d10 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
24d20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
24d30 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
24d40 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
24d50 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
24d60 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
24d70 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
24d80 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
24d90 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
24da0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
24db0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
24dc0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
24dd0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
24de0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
24df0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
24e00 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
24e10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
24e20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24e30 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
24e40 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
24e50 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
24e60 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
24e70 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
24e80 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
24e90 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
24ea0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
24eb0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
24ec0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
24ed0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
24ee0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
24ef0 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
24f00 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
24f10 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
24f20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
24f30 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
24f40 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
24f50 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
24f60 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
24f70 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
24f80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
24f90 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  >PAGER_UNLOCK );
24fa0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ..  if( pgno==0 
24fb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
24fc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24fd0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
24fe0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
24ff0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
25000 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
25010 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20   immediately. . 
25020 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72   ** Otherwise, r
25030 65 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20  equest the page 
25040 66 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20  from the PCache 
25050 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20  layer. */.  if( 
25060 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
25070 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
25080 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
25090 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
250a0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
250b0 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  rrCode;.  }else{
250c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
250d0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
250e0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
250f0 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a  no, 1, ppPage);.
25100 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
25110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25120 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61  /* Either the ca
25130 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61  ll to sqlite3Pca
25140 63 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72  cheFetch() retur
25150 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20  ned an error or 
25160 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
25170 20 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20   was already in 
25180 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20  the error-state 
25190 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
251a0 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  on was called.. 
251b0 20 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f     ** Set pPg to
251c0 20 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74   0 and jump to t
251d0 68 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e  he exception han
251e0 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50  dler.  */.    pP
251f0 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20  g = 0;.    goto 
25200 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
25210 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  r;.  }.  assert(
25220 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
25230 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
25240 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
25250 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
25260 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67   (*ppPage)->pPag
25270 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  er==0 );..  if( 
25280 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
25290 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20  r && !noContent 
252a0 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
252b0 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
252c0 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
252d0 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
252e0 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
252f0 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
25300 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
25310 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
25320 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
25330 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
25340 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
25350 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
25360 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
25370 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20  ger->nHit);.    
25380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25390 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
253a0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
253b0 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
253c0 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
253d0 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
253e0 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
253f0 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 20 20  alized.  */.    
25400 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20 20 20 50  int nMax;..    P
25410 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
25420 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50  ->nMiss);.    pP
25430 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20  g = *ppPage;.   
25440 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
25450 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
25460 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
25470 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
25480 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
25490 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
254a0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
254b0 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
254c0 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
254d0 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
254e0 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
254f0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
25500 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
25510 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
25520 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
25530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
25540 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
25550 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
25560 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
25570 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25580 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
25590 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a  pPager, &nMax);.
255a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
255b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
255c0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
255d0 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
255e0 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 6e    if( MEMDB || n
255f0 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  Max<(int)pgno ||
25600 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69   noContent || !i
25610 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
25620 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
25630 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
25640 6e 6f 20 29 7b 0a 09 72 63 20 3d 20 53 51 4c 49  no ){..rc = SQLI
25650 54 45 5f 46 55 4c 4c 3b 0a 09 67 6f 74 6f 20 70  TE_FULL;..goto p
25660 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
25670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25680 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
25690 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  .        /* Fail
256a0 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62  ure to set the b
256b0 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75  its in the InJou
256c0 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73  rnal bit-vectors
256d0 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20   is benign..    
256e0 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79      ** It merely
256f0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d   means that we m
25700 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74  ight do some ext
25710 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e  ra work to journ
25720 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a  al a .        **
25730 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
25740 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
25750 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
25760 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
25770 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20   .        ** to 
25780 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68  test the case wh
25790 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72  ere a malloc err
257a0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
257b0 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20  trying to set . 
257c0 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20         ** a bit 
257d0 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e  in a bit vector.
257e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
257f0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
25800 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
25810 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
25820 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
25830 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
25840 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
25850 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   ) sqlite3Bitvec
25860 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
25870 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20  ournal, pgno);. 
25880 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
25890 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
258a0 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  MEM );.        }
258b0 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  .        TESTONL
258c0 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53  Y( rc = ) addToS
258d0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
258e0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
258f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25900 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
25910 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  M );.        sql
25920 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
25930 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  loc();.      }. 
25940 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
25950 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
25960 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
25970 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
25980 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
25990 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
259a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
259b0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
259c0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
259d0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
259e0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
259f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25a00 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
25a10 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
25a20 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
25a30 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
25a40 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
25a50 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
25a60 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
25a70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
25a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25a90 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71 75  _OK;..pager_acqu
25aa0 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65 72  ire_err:.  asser
25ab0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
25ac0 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b   );.  if( pPg ){
25ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
25ae0 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 7d  heDrop(pPg);.  }
25af0 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
25b00 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
25b10 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
25b20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25b30 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
25b40 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
25b50 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
25b60 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
25b70 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
25b80 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
25b90 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
25ba0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
25bb0 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
25bc0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
25bd0 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75  ache. Also, retu
25be0 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a 20  rn 0 if the .** 
25bf0 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
25c00 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77  R_UNLOCK state w
25c10 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
25c20 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  n is called,.** 
25c30 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
25c40 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  is in an error s
25c50 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20  tate other than 
25c60 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a  SQLITE_FULL..**.
25c70 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
25c80 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
25c90 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
25ca0 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
25cb0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
25cc0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
25cd0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
25ce0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
25cf0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
25d00 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
25d10 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
25d20 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
25d30 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
25d40 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
25d50 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
25d60 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
25d70 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
25d80 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
25d90 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
25da0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
25db0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
25dc0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
25dd0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
25de0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
25df0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
25e00 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73   pgno!=0 );.  as
25e10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50  sert( pPager->pP
25e20 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61 73  Cache!=0 );.  as
25e30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25e40 61 74 65 20 3e 20 50 41 47 45 52 5f 55 4e 4c 4f  ate > PAGER_UNLO
25e50 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  CK );.  sqlite3P
25e60 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
25e70 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
25e80 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72 65  , 0, &pPg);.  re
25e90 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
25ea0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
25eb0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a  e reference..**.
25ec0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
25ed0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
25ee0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
25ef0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
25f00 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
25f10 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
25f20 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
25f30 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
25f40 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
25f50 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
25f60 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
25f70 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
25f80 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
25f90 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ved..*/.void sql
25fa0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
25fb0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
25fc0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
25fd0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
25fe0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
25ff0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
26000 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
26010 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
26020 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d  d(pPager);.  }.}
26030 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d  ../*.** If the m
26040 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
26050 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
26060 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75 72 65  n opened, ensure
26070 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 75 62   that the.** sub
26080 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
26090 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20 74 68   open too. If th
260a0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69  e main journal i
260b0 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74  s not open,.** t
260c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
260d0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
260e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
260f0 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
26100 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
26110 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41  g to plan. .** A
26120 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
26130 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
26140 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
26150 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  all to .** sqlit
26160 65 33 4f 73 4f 70 65 6e 28 29 20 66 61 69 6c 73  e3OsOpen() fails
26170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26180 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
26190 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
261a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
261b0 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  _OK;.  if( isOpe
261c0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
261d0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
261e0 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69  ->sjfd) ){.    i
261f0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
26200 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
26210 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
26220 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
26230 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
26240 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
26250 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
26260 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
26270 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
26280 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
26290 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
262a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
262b0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
262c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
262d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
262e0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
262f0 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
26300 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
26310 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
26320 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
26330 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
26340 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
26350 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
26360 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
26370 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
26380 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
26390 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
263a0 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
263b0 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
263c0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
263d0 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
263e0 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
263f0 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
26400 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
26410 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
26420 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
26430 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
26440 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
26450 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
26460 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
26470 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
26480 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
26490 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
264a0 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
264b0 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
264c0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
264d0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
264e0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
264f0 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
26500 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
26510 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
26520 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
26530 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
26540 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
26550 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
26560 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
26570 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
26580 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
26590 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
265a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
265b0 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
265c0 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
265d0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
265e0 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
265f0 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
26600 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
26610 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
26620 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
26630 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
26640 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
26650 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
26660 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
26670 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
26680 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
26690 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
266a0 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
266b0 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
266c0 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
266d0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
266e0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
266f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26700 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26710 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
26720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26730 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
26740 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
26750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
26770 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  ze of database f
26780 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ile */.  sqlite3
26790 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
267a0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
267b0 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
267c0 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
267d0 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
267e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
267f0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
26800 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26810 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
26820 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26830 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
26840 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26850 45 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72  E_OFF );.  asser
26860 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
26870 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20  urnal==0 );.  . 
26880 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69   /* If already i
26890 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
268a0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
268b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75   is a no-op.  Bu
268c0 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74  t on.  ** the ot
268d0 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72  her hand, this r
268e0 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
268f0 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65  called if we are
26900 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a   already in.  **
26910 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e   an error state.
26920 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
26930 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
26940 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72   ) return pPager
26950 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74 65  ->errCode;..  te
26960 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
26970 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
26980 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
26990 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
269a0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
269b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
269c0 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n rc;.  pPager->
269d0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
269e0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
269f0 28 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70  (nPage);.  if( p
26a00 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
26a10 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  l==0 ){.    retu
26a20 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
26a30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
26a40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26a50 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
26a60 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
26a70 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
26a80 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
26a90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
26aa0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
26ab0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
26ac0 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RY ){.      sqli
26ad0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
26ae0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
26af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26b00 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
26b10 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   =              
26b20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67       /* VFS flag
26b30 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61  s to open journa
26b40 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  l file */.      
26b50 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
26b60 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
26b70 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
26b80 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d      (pPager->tem
26b90 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20  pFile ? .       
26ba0 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
26bb0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
26bc0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
26bd0 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20  OURNAL):.       
26be0 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f     (SQLITE_OPEN_
26bf0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20  MAIN_JOURNAL).  
26c00 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20        );.#ifdef 
26c10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
26c20 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
26c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
26c40 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20  rnalOpen(.      
26c50 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
26c60 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
26c70 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
26c80 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
26c90 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a  Pager).      );.
26ca0 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
26cb0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
26cc0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
26cd0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
26ce0 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
26cf0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
26d00 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
26d10 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28  TE_OK || isOpen(
26d20 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
26d30 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65    }...  /* Write
26d40 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
26d50 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
26d60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
26d70 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65  d open .  ** the
26d80 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   sub-journal if 
26d90 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
26da0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26db0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f  _OK ){.    /* TO
26dc0 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c  DO: Check if all
26dd0 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65   of these are re
26de0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a  ally required. *
26df0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  /.    pPager->db
26e00 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
26e10 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70  r->dbSize;.    p
26e20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
26e30 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70  arted = 0;.    p
26e40 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
26e50 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
26e60 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  >nRec = 0;.    p
26e70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
26e80 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  f = 0;.    pPage
26e90 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
26ea0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
26eb0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
26ec0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
26ed0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
26ee0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
26ef0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
26f00 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b  r->nSavepoint ){
26f10 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
26f20 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
26f30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
26f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26f50 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
26f60 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
26f70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
26f80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
26f90 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  al = 0;.  }.  re
26fa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26fb0 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d  * Begin a write-
26fc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
26fd0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
26fe0 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20  er object. If a 
26ff0 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61  .** write-transa
27000 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
27010 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74  y been opened, t
27020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27030 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
27040 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72 67  f the exFlag arg
27050 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20  ument is false, 
27060 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
27070 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
27080 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  .** lock on the 
27090 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
270a0 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
270b0 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61  , then acquire a
270c0 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58  t least.** an EX
270d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
270e0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
270f0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f  already held, no
27100 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e   locking .** fun
27110 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63  ctions need be c
27120 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
27130 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
27140 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
27150 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20 74  mory file and, t
27160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
27170 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66  is .** opened if
27180 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   it has not been
27190 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61 20   already. For a 
271a0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 20  temporary file, 
271b0 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20  the opening .** 
271c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
271d0 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
271e0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
271f0 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  n actual need to
27200 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74 68   .** write to th
27210 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a  e journal. TODO:
27220 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d 70   Why handle temp
27230 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66 66  orary files diff
27240 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49  erently?.**.** I
27250 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
27260 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f 72  le is opened (or
27270 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
27280 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a  y open), then a.
27290 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  ** journal-heade
272a0 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  r is written to 
272b0 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e  the start of it.
272c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75  .**.** If the su
272d0 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d  bjInMemory argum
272e0 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ent is non-zero,
272f0 20 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f   then any sub-jo
27300 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20  urnal opened.** 
27310 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
27320 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
27330 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
27340 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69  memory file. Thi
27350 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65  s.** has no effe
27360 63 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f  ct if the sub-jo
27370 75 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79  urnal is already
27380 20 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d   opened (as it m
27390 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75  ay be when.** ru
273a0 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
273b0 76 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74  ve mode) or if t
273c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64  he transaction d
273d0 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
273e0 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  a.** sub-journal
273f0 2e 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d  . If the subjInM
27400 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69  emory argument i
27410 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79  s zero, then any
27420 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62   required.** sub
27430 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c  -journal is impl
27440 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72  emented in-memor
27450 79 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61  y if pPager is a
27460 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
27470 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69  base, .** or usi
27480 6e 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ng a temporary f
27490 69 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ile otherwise..*
274a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
274b0 65 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70  erBegin(Pager *p
274c0 50 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61  Pager, int exFla
274d0 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d  g, int subjInMem
274e0 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ory){.  int rc =
274f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
27500 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
27510 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
27520 4b 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  K );.  pPager->s
27530 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75  ubjInMemory = (u
27540 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  8)subjInMemory;.
27550 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
27560 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
27570 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
27580 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
27590 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
275a0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
275b0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
275c0 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74  e );..    /* Obt
275d0 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
275e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
275f0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
27600 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
27610 72 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65  r.    ** is true
27620 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
27630 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
27640 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
27650 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a  lock. The.    **
27660 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
27670 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
27680 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
27690 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
276a0 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  VE.    ** lock, 
276b0 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
276c0 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
276d0 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  VED lock..    */
276e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
276f0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
27700 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
27710 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  K);.    if( rc==
27720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27730 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
27740 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
27750 44 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 46  D;.      if( exF
27760 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
27770 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
27780 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
27790 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
277a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
277b0 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
277c0 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
277d0 6c 20 66 69 6c 65 20 61 74 20 74 68 69 73 20 74  l file at this t
277e0 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ime.  It will be
277f0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65 64 20 62  .    ** opened b
27800 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69 74  efore it is writ
27810 74 65 6e 20 74 6f 2e 20 20 49 66 20 77 65 20 64  ten to.  If we d
27820 65 66 65 72 20 6f 70 65 6e 69 6e 67 20 74 68 65  efer opening the
27830 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20 20 2a 2a   journal,.    **
27840 20 77 65 20 6d 69 67 68 74 20 73 61 76 65 20 74   we might save t
27850 68 65 20 77 6f 72 6b 20 6f 66 20 63 72 65 61 74  he work of creat
27860 69 6e 67 20 61 20 66 69 6c 65 20 69 66 20 74 68  ing a file if th
27870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
27880 20 20 2a 2a 20 65 6e 64 73 20 75 70 20 62 65 69    ** ends up bei
27890 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  ng a no-op..    
278a0 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  */.  }else if( i
278b0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
278c0 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  d) && pPager->jo
278d0 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20  urnalOff==0 ){. 
278e0 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
278f0 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ns when the page
27900 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69  r was in exclusi
27910 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
27920 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  he last.    ** t
27930 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
27940 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
27950 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
27960 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
27970 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
27980 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
27990 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
279a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
279b0 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
279c0 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72   open and either
279d0 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74   was truncated t
279e0 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74 73  o 0 bytes or its
279f0 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20 20   header was.    
27a00 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  ** overwritten w
27a10 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
27a20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
27a30 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b  ager->nRec==0 );
27a40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27a50 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
27a60 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
27a70 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
27a80 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  rnal==0 );.    r
27a90 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
27aa0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
27ab0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
27ac0 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E(("TRANSACTION 
27ad0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
27ae0 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
27af0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27b00 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
27b10 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
27b20 20 29 3b 0a 20 20 20 20 2f 2a 20 49 67 6e 6f 72   );.    /* Ignor
27b30 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 74  e any IO error t
27b40 68 61 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  hat occurs withi
27b50 6e 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  n pager_end_tran
27b60 73 61 63 74 69 6f 6e 28 29 2e 20 54 68 65 0a 20  saction(). The. 
27b70 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 20 6f 66     ** purpose of
27b80 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 74 6f   this call is to
27b90 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
27ba0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
27bb0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 73 75   pager.    ** su
27bc0 62 2d 73 79 73 74 65 6d 2e 20 49 74 20 64 6f 65  b-system. It doe
27bd0 73 6e 27 74 20 6d 61 74 74 65 72 20 69 66 20 74  sn't matter if t
27be0 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
27bf0 69 73 20 6e 6f 74 20 70 72 6f 70 65 72 6c 79 0a  is not properly.
27c00 20 20 20 20 2a 2a 20 66 69 6e 61 6c 69 7a 65 64      ** finalized
27c10 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 28   at this point (
27c20 73 69 6e 63 65 20 69 74 20 69 73 20 6e 6f 74 20  since it is not 
27c30 61 20 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20  a valid journal 
27c40 66 69 6c 65 20 61 6e 79 77 61 79 29 2e 0a 20 20  file anyway)..  
27c50 20 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 65    */.    pager_e
27c60 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
27c70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
27c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c90 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67  *.** Mark a sing
27ca0 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20  le data page as 
27cb0 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70  writeable. The p
27cc0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
27cd0 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e  nto the .** main
27ce0 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
27cf0 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69  journal as requi
27d00 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65  red. If the page
27d10 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
27d20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a  .** one of the j
27d30 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72  ournals, the cor
27d40 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
27d50 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a  s set in the .**
27d60 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
27d70 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65  l bitvec and the
27d80 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
27d90 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
27da0 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f  vecs.** of any o
27db0 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61  pen savepoints a
27dc0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
27dd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
27de0 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
27df0 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
27e00 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
27e10 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
27e20 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
27e30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27e40 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69  TE_OK;..  /* Thi
27e50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
27e60 20 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61   called unless a
27e70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
27e80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
27e90 2a 2a 20 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f  ** started..  */
27ea0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27eb0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
27ec0 52 45 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f  RESERVED );..  /
27ed0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
27ee0 73 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  s been previousl
27ef0 79 20 64 65 74 65 63 74 65 64 2c 20 72 65 70 6f  y detected, repo
27f00 72 74 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f  rt the same erro
27f10 72 0a 20 20 2a 2a 20 61 67 61 69 6e 2e 0a 20 20  r.  ** again..  
27f20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
27f30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
27f40 29 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  )  return pPager
27f50 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a  ->errCode;..  /*
27f60 20 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f   Higher-level ro
27f70 75 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c  utines never cal
27f80 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
27f90 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  if database is n
27fa0 6f 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65  ot.  ** writable
27fb0 2e 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79  .  But check any
27fc0 77 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f  way, just for ro
27fd0 62 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69  bustness. */.  i
27fe0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
27ff0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74  >readOnly) ) ret
28000 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
28010 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
28020 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
28030 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
28040 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
28050 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
28060 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
28070 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
28080 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
28090 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
280a0 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
280b0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
280c0 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
280d0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
280e0 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75  .  if( pageInJou
280f0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75  rnal(pPg) && !su
28100 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
28110 50 67 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  Pg) ){.    pPage
28120 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
28130 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
28140 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
28150 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
28160 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
28170 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
28180 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
28190 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
281a0 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
281b0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
281c0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
281d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67     **.    ** Hig
281e0 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e  her level routin
281f0 65 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  es should have a
28200 6c 72 65 61 64 79 20 73 74 61 72 74 65 64 20 61  lready started a
28210 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20   transaction,.  
28220 20 20 2a 2a 20 77 68 69 63 68 20 6d 65 61 6e 73    ** which means
28230 20 74 68 65 79 20 68 61 76 65 20 61 63 71 75 69   they have acqui
28240 72 65 64 20 74 68 65 20 6e 65 63 65 73 73 61 72  red the necessar
28250 79 20 6c 6f 63 6b 73 20 62 75 74 20 74 68 65 20  y locks but the 
28260 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20  rollback.    ** 
28270 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f  journal might no
28280 74 20 79 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20  t yet be open.. 
28290 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
282a0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
282b0 28 70 50 61 67 65 72 2c 20 30 2c 20 70 50 61 67  (pPager, 0, pPag
282c0 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  er->subjInMemory
282d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
282e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
282f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28300 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70   }.    if( !isOp
28310 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28320 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
28330 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
28340 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
28350 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28360 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
28370 6c 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  l );.      rc = 
28380 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
28390 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
283a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
283b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
283c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
283d0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
283e0 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
283f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
28400 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
28410 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
28420 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
28430 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
28440 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
28450 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
28460 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
28470 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
28480 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
28490 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
284a0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
284b0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
284c0 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61  f( !pageInJourna
284d0 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70 65 6e  l(pPg) && isOpen
284e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
284f0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
28500 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
28510 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
28520 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
28530 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
28540 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ta2;..        /*
28550 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
28560 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
28570 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
28580 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
28590 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
285a0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
285b0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
285c0 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
285d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
285e0 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
285f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
28600 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
28610 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
28620 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32  ;.        CODEC2
28630 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
28640 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
28650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28660 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  M, pData2);.    
28670 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
28680 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
28690 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
286a0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
286b0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
286c0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
286d0 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
286e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
286f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28700 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28710 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
28720 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
28730 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
28740 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
28770 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
28780 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
28790 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
287a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
287b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
287c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
287d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
287e0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
287f0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
28800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28810 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
28820 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
28830 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
28840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28850 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
28860 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
28870 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
28880 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
28890 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
288a0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
288b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
288c0 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
288d0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
288e0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
288f0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28900 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
28910 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
28920 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
28930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
28940 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
28950 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
28960 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
28970 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
28980 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
28990 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
289a0 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
289b0 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
289c0 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
289d0 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a  occurred while j
289e0 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
289f0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
28a00 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
28a10 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
28a20 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
28a30 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
28a40 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
28a50 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
28a60 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
28a70 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
28a80 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
28a90 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
28aa0 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
28ab0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
28ac0 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
28ad0 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
28ae0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
28af0 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
28b00 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
28b10 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
28b20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
28b30 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
28b40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28b50 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
28b60 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
28b70 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
28b80 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28b90 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
28ba0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
28bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
28bc0 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
28bd0 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72   has occurred wr
28be0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
28bf0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
28c00 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
28c10 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
28c20 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
28c30 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
28c40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28c50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28c60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28c80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70      }..        p
28c90 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
28ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28cb0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
28cc0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
28cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
28ce0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
28cf0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
28d00 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65  gno);.        te
28d10 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49  stcase( rc==SQLI
28d20 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
28d30 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
28d40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
28d50 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
28d60 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61  .        rc |= a
28d70 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
28d80 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
28d90 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
28da0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28db0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
28dc0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
28dd0 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
28de0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28df0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28e10 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
28e20 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
28e30 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
28e40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
28e50 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
28e60 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
28e70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
28e80 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
28e90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
28ea0 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
28eb0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
28ec0 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
28ee0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
28ef0 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
28f00 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
28f10 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
28f20 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
28f30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
28f40 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
28f50 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
28f60 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
28f70 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
28f80 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
28f90 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
28fa0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
28fb0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
28fc0 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
28fd0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
28fe0 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
28ff0 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
29000 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
29010 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
29020 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
29030 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
29040 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
29050 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52  */.    if( subjR
29060 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
29070 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
29080 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
29090 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
290a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
290b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
290c0 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
290d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
290e0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
290f0 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61  RED );.  if( pPa
29100 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d  ger->dbSize<pPg-
29110 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
29120 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
29130 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72  g->pgno;.  }.  r
29140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29150 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
29160 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
29170 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
29180 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
29190 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20  fore .** making 
291a0 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
291b0 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  e. The caller mu
291c0 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74  st check the ret
291d0 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  urn value .** of
291e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
291f0 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
29200 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20  t to change any 
29210 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73  page data unless
29220 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
29230 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
29240 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  _OK..**.** The d
29250 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
29260 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
29270 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28  and pager_write(
29280 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
29290 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20  * function also 
292a0 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73  deals with the s
292b0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
292c0 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  e 2 or more page
292d0 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69  s.** fit on a si
292e0 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
292f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
29300 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70  ll co-resident p
29310 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76  ages.** must hav
29320 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
29330 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
29340 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  le before return
29350 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
29360 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53   error occurs, S
29370 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
29380 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
29390 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
293a0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f  s appropriate. O
293b0 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
293c0 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
293d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62  te3PagerWrite(Db
293e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a  Page *pDbPage){.
293f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
29400 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a  E_OK;..  PgHdr *
29410 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
29420 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
29430 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
29440 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63  Pgno nPagePerSec
29450 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73  tor = (pPager->s
29460 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72  ectorSize/pPager
29470 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
29480 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74  if( nPagePerSect
29490 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
294a0 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
294b0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
294c0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
294d0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
294e0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
294f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29500 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
29510 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
29520 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
29530 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
29540 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29550 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
29560 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
29570 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
29580 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20  /.    int ii;   
29590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
295a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
295b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  */.    int needS
295c0 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ync = 0;        
295d0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
295e0 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e  page has PGHDR_N
295f0 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20  EED_SYNC */..   
29600 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
29610 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
29620 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
29630 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
29640 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
29650 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
29660 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
29670 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
29680 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
29690 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
296a0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
296b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
296c0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
296d0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
296e0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
296f0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
29700 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
29710 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
29720 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
29730 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
29740 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
29750 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
29760 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
29770 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
29780 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
29790 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
297a0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
297b0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
297c0 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
297d0 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
297e0 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
297f0 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1;..    sqlite3P
29800 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
29810 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50  ager, (int *)&nP
29820 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69  ageCount);.    i
29830 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
29840 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
29850 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
29860 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
29870 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
29880 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
29890 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
298a0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
298b0 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
298c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
298d0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
298e0 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
298f0 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
29900 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
29910 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
29920 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
29930 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
29940 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
29950 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
29960 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
29970 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
29980 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
29990 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
299a0 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70  .      if( pg==p
299b0 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c  Pg->pgno || !sql
299c0 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
299d0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
299e0 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20  l, pg) ){.      
299f0 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
29a00 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
29a10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
29a20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
29a30 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70  t(pPager, pg, &p
29a40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29a60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29a70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
29a80 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
29a90 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
29aa0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
29ab0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
29ac0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
29ad0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
29ae0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
29af0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  er->needSync);. 
29b00 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29b10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29b20 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
29b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
29b40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29b50 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20  else if( (pPage 
29b60 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
29b70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29  Pager, pg))!=0 )
29b80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
29b90 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  age->flags&PGHDR
29ba0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
29bb0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
29bc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
29bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
29be0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
29bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29c00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
29c10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
29c20 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61  lag is set for a
29c30 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20  ny of the nPage 
29c40 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74  pages .    ** st
29c50 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74  arting at pg1, t
29c60 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20  hen it needs to 
29c70 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f  be set for all o
29c80 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a  f them. Because.
29c90 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74      ** writing t
29ca0 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e  o any of these n
29cb0 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64  Page pages may d
29cc0 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73  amage the others
29cd0 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  , the.    ** jou
29ce0 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63  rnal file must c
29cf0 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20  ontain sync()ed 
29d00 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66  copies of all of
29d10 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66   them.    ** bef
29d20 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  ore any of them 
29d30 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f  can be written o
29d40 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
29d50 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
29d60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
29d70 54 45 5f 4f 4b 20 26 26 20 6e 65 65 64 53 79 6e  TE_OK && needSyn
29d80 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
29d90 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  t( !MEMDB && pPa
29da0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
29db0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
29dc0 3b 20 69 69 3c 6e 50 61 67 65 3b 20 69 69 2b 2b  ; ii<nPage; ii++
29dd0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
29de0 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
29df0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
29e00 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
29e10 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
29e20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c         pPage->fl
29e30 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
29e40 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
29e50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
29e60 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
29e70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29e80 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
29e90 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
29ea0 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
29eb0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
29ec0 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
29ed0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
29ee0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
29ef0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
29f00 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
29f10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29f20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
29f30 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
29f40 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
29f50 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
29f60 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
29f70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29f80 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
29f90 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
29fa0 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
29fb0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
29fc0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
29fd0 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
29fe0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
29ff0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2a000 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
2a010 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c    return pPg->fl
2a020 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b  ags&PGHDR_DIRTY;
2a030 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2a040 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
2a050 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
2a060 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
2a070 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
2a080 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
2a090 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
2a0a0 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
2a0b0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
2a0c0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
2a0d0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
2a0e0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54  ked as dirty.  T
2a0f0 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
2a100 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a   example, when.*
2a110 2a 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  * the page has b
2a120 65 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c  een added as a l
2a130 65 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  eaf of the freel
2a140 69 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a  ist and so its.*
2a150 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e  * content no lon
2a160 67 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a  ger matters..**.
2a170 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
2a180 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
2a190 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
2a1a0 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
2a1b0 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
2a1c0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
2a1d0 75 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65  unused. The page
2a1e0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
2a1f0 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
2a200 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
2a210 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
2a220 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
2a230 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
2a240 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
2a250 6e 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  n quadruple the 
2a260 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a  speed of large .
2a270 2a 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  ** DELETE operat
2a280 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ions..*/.void sq
2a290 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2a2a0 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ite(PgHdr *pPg){
2a2b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a2c0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a2d0 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67    if( (pPg->flag
2a2e0 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26  s&PGHDR_DIRTY) &
2a2f0 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
2a300 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50  oint==0 ){.    P
2a310 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54  AGERTRACE(("DONT
2a320 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
2a330 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
2a340 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
2a350 65 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41  er)));.    IOTRA
2a360 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
2a370 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
2a380 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67  ->pgno)).    pPg
2a390 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
2a3a0 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66  _DONT_WRITE;.#if
2a3b0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
2a3c0 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
2a3d0 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
2a3e0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
2a3f0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
2a400 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a410 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
2a420 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
2a430 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2a440 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67  e file .** chang
2a450 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65  e-counter, store
2a460 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69  d as a 4-byte bi
2a470 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2a480 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a   starting at .**
2a490 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
2a4a0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
2a4b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2a4c0 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61  isDirectMode fla
2a4d0 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
2a4e0 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
2a4f0 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
2a500 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2a510 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
2a520 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
2a530 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
2a540 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
2a550 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
2a560 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
2a570 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
2a580 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
2a590 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
2a5a0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
2a5b0 63 74 4d 6f 64 65 20 66 6c 61 67 20 6d 61 79 20  ctMode flag may 
2a5c0 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  only be non-zero
2a5d0 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   if the library 
2a5e0 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20  was compiled.** 
2a5f0 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
2a600 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2a610 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ITE macro define
2a620 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
2a630 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20  .** if isDirect 
2a640 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2a650 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a660 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64  ile is updated d
2a670 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72  irectly.** by wr
2a680 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64  iting an updated
2a690 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
2a6a0 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20   1 using a call 
2a6b0 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  to the .** sqlit
2a6c0 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63  e3OsWrite() func
2a6d0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2a6e0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
2a6f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
2a700 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2a710 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20  isDirectMode){. 
2a720 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a730 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61  _OK;..  /* Decla
2a740 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  re and initializ
2a750 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  e constant integ
2a760 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49  er 'isDirect'. I
2a770 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69  f the.  ** atomi
2a780 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2a790 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
2a7a0 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74  in this build, t
2a7b0 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a  hen isDirect.  *
2a7c0 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  * is initialized
2a7d0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
2a7e0 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69  ssed as the isDi
2a7f0 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74  rectMode paramet
2a800 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  er.  ** to this 
2a810 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  function. Otherw
2a820 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ise, it is alway
2a830 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20  s set to zero.. 
2a840 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65   **.  ** The ide
2a850 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  a is that if the
2a860 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2a870 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
2a880 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61  t.  ** enabled a
2a890 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2a8a0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e  the compiler can
2a8b0 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20   omit the tests 
2a8c0 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63  of.  ** 'isDirec
2a8d0 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c  t' below, as wel
2a8e0 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65  l as the block e
2a8f0 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20  nclosed in the. 
2a900 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63   ** "if( isDirec
2a910 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a  t )" condition..
2a920 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2a930 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2a940 43 5f 57 52 49 54 45 0a 23 20 64 65 66 69 6e 65  C_WRITE.# define
2a950 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 30 0a 20   DIRECT_MODE 0. 
2a960 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63   assert( isDirec
2a970 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e  tMode==0 );.  UN
2a980 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
2a990 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65  sDirectMode);.#e
2a9a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 44 49 52  lse.# define DIR
2a9b0 45 43 54 5f 4d 4f 44 45 20 69 73 44 69 72 65 63  ECT_MODE isDirec
2a9c0 74 4d 6f 64 65 0a 23 65 6e 64 69 66 0a 0a 20 20  tMode.#endif..  
2a9d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a9e0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
2a9f0 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 21  ERVED );.  if( !
2aa00 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2aa10 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67 65  untDone && pPage
2aa20 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20  r->dbSize>0 ){. 
2aa30 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
2aa40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa50 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 74 6f   /* Reference to
2aa60 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20 20 75   page 1 */.    u
2aa70 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  32 change_counte
2aa80 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2aa90 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  Initial value of
2aaa0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2aab0 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73  field */..    as
2aac0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
2aad0 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f 70 65  empFile && isOpe
2aae0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2aaf0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61  ..    /* Open pa
2ab00 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
2ab10 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
2ab20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ab30 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
2ab40 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20  , 1, &pPgHdr);. 
2ab50 20 20 20 61 73 73 65 72 74 28 20 70 50 67 48 64     assert( pPgHd
2ab60 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  r==0 || rc==SQLI
2ab70 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
2ab80 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77 61 73   If page one was
2ab90 20 66 65 74 63 68 65 64 20 73 75 63 63 65 73 73   fetched success
2aba0 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69 73 20  fully, and this 
2abb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  function is not.
2abc0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67      ** operating
2abd0 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c   in direct-mode,
2abe0 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77 72 69   make page 1 wri
2abf0 74 61 62 6c 65 2e 20 20 57 68 65 6e 20 6e 6f 74  table.  When not
2ac00 20 69 6e 20 0a 20 20 20 20 2a 2a 20 64 69 72 65   in .    ** dire
2ac10 63 74 20 6d 6f 64 65 2c 20 70 61 67 65 20 31 20  ct mode, page 1 
2ac20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 69  is always held i
2ac30 6e 20 63 61 63 68 65 20 61 6e 64 20 68 65 6e 63  n cache and henc
2ac40 65 20 74 68 65 20 50 61 67 65 72 47 65 74 28 29  e the PagerGet()
2ac50 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 69 73  .    ** above is
2ac60 20 61 6c 77 61 79 73 20 73 75 63 63 65 73 73 66   always successf
2ac70 75 6c 20 2d 20 68 65 6e 63 65 20 74 68 65 20 41  ul - hence the A
2ac80 4c 57 41 59 53 20 6f 6e 20 72 63 3d 3d 53 51 4c  LWAYS on rc==SQL
2ac90 49 54 45 5f 4f 4b 2e 0a 20 20 20 20 2a 2f 0a 20  ITE_OK..    */. 
2aca0 20 20 20 69 66 28 20 21 44 49 52 45 43 54 5f 4d     if( !DIRECT_M
2acb0 4f 44 45 20 26 26 20 41 4c 57 41 59 53 28 72 63  ODE && ALWAYS(rc
2acc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a  ==SQLITE_OK) ){.
2acd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ace0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
2acf0 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Hdr);.    }..   
2ad00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ad10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2ad20 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
2ad30 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
2ad40 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
2ad50 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
2ad60 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
2ad70 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
2ad80 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72  byte((u8*)pPager
2ad90 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20  ->dbFileVers);. 
2ada0 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
2adb0 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74  ter++;.      put
2adc0 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 70  32bits(((char*)p
2add0 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34  PgHdr->pData)+24
2ade0 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
2adf0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 41 6c 73  );..      /* Als
2ae00 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
2ae10 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
2ae20 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
2ae30 39 20 2a 2f 0a 20 20 20 20 20 20 70 75 74 33 32  9 */.      put32
2ae40 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2ae50 48 64 72 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  Hdr->pData)+96, 
2ae60 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
2ae70 55 4d 42 45 52 29 3b 0a 0a 20 20 20 20 20 20 2f  UMBER);..      /
2ae80 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  * If running in 
2ae90 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72 69  direct mode, wri
2aea0 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
2aeb0 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68 65  of page 1 to the
2aec0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
2aed0 69 66 28 20 44 49 52 45 43 54 5f 4d 4f 44 45 20  if( DIRECT_MODE 
2aee0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2aef0 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50   void *zBuf = pP
2af00 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  gHdr->pData;.   
2af10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2af20 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
2af30 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2af40 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2af50 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
2af60 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
2af70 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
2af80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2af90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2afa0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2afb0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  untDone = 1;.   
2afc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2afd0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67  se{.        pPag
2afe0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2aff0 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
2b000 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
2b010 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
2b020 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
2b030 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2b040 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
2b050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b060 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
2b070 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
2b080 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  sk. This is a no
2b090 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  -op for in-memor
2b0a0 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61  y files.** or pa
2b0b0 67 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67  ges with the Pag
2b0c0 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73  er.noSync flag s
2b0d0 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  et..**.** If suc
2b0e0 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c  cessful, or call
2b0f0 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f  ed on a pager fo
2b100 72 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20  r which it is a 
2b110 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66  no-op, this.** f
2b120 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2b130 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
2b140 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f  wise, an IO erro
2b150 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2b160 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2b170 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
2b180 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
2b190 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1b0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2b1c0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21  e */.  assert( !
2b1d0 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
2b1e0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2b1f0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b200 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2b210 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b220 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
2b230 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
2b240 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ags);.  }.  retu
2b250 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b260 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
2b270 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
2b280 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
2b290 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
2b2a0 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
2b2b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2b2c0 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
2b2d0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
2b2e0 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
2b2f0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
2b300 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
2b310 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
2b320 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
2b330 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
2b340 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
2b350 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
2b360 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
2b370 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2b380 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  at:.**.**   * Th
2b390 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b3a0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
2b3b0 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20  s updated,.**   
2b3c0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
2b3d0 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20   synced (unless 
2b3e0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2b3f0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2b400 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61   used),.**   * a
2b410 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ll dirty pages a
2b420 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  re written to th
2b430 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2b440 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74   .**   * the dat
2b450 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72  abase file is tr
2b460 75 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75  uncated (if requ
2b470 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20  ired), and.**   
2b480 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2b490 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a  ile synced. .**.
2b4a0 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
2b4b0 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  g that remains t
2b4c0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
2b4d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66  nsaction is to f
2b4e0 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c  inalize .** (del
2b4f0 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72  ete, truncate or
2b500 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
2b510 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75  part of) the jou
2b520 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a  rnal file (or .*
2b530 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * delete the mas
2b540 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2b550 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
2b560 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2b570 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
2b580 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
2b590 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
2b5a0 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
2b5b0 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
2b5c0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2b5d0 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
2b5e0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c  .** If the final
2b5f0 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53   parameter - noS
2b600 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74  ync - is true, t
2b610 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
2b620 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20   file itself.** 
2b630 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54  is not synced. T
2b640 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
2b650 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2b660 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20  Sync() directly 
2b670 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64  to.** sync the d
2b680 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
2b690 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d  ore calling Comm
2b6a0 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20  itPhaseTwo() to 
2b6b0 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  delete the.** jo
2b6c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68  urnal file in th
2b6d0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  is case..*/.int 
2b6e0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2b6f0 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61  itPhaseOne(.  Pa
2b700 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
2b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b720 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
2b730 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b740 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20  Master,         
2b750 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
2b760 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  L, the master jo
2b770 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
2b780 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20  int noSync      
2b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7a0 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
2b7b0 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65  the xSync on the
2b7c0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20   db file */.){. 
2b7d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b7e0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2b7f0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2b800 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 64 62 4f  */..  /* The dbO
2b810 72 69 67 53 69 7a 65 20 69 73 20 6e 65 76 65 72  rigSize is never
2b820 20 73 65 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f   set if journal_
2b830 6d 6f 64 65 3d 4f 46 46 20 2a 2f 0a 20 20 61 73  mode=OFF */.  as
2b840 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2b850 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2b860 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2b870 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72   || pPager->dbOr
2b880 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 0a 20 20  igSize==0 );..  
2b890 2f 2a 20 49 66 20 61 20 70 72 69 6f 72 20 65 72  /* If a prior er
2b8a0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 72 65  ror occurred, re
2b8b0 70 6f 72 74 20 74 68 61 74 20 65 72 72 6f 72 20  port that error 
2b8c0 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  again. */.  if( 
2b8d0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
2b8e0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
2b8f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2b900 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2b910 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
2b920 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
2b930 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
2b940 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
2b950 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
2b960 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
2b970 65 29 29 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  e));..  if( MEMD
2b980 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  B && pPager->dbM
2b990 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20 2f  odified ){.    /
2b9a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
2b9b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
2b9c0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
2b9d0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
2b9e0 6f 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 66  or this.    ** f
2b9f0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
2ba00 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
2ba10 20 69 74 20 69 73 20 6d 6f 73 74 6c 79 20 61 20   it is mostly a 
2ba20 6e 6f 2d 6f 70 2e 20 20 48 6f 77 65 76 65 72 2c  no-op.  However,
2ba30 20 61 6e 79 0a 20 20 20 20 2a 2a 20 62 61 63 6b   any.    ** back
2ba40 75 70 20 69 6e 20 70 72 6f 67 72 65 73 73 20 6e  up in progress n
2ba50 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 61  eeds to be resta
2ba60 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rted..    */.   
2ba70 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
2ba80 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
2ba90 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20  ackup);.  }else 
2baa0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2bab0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
2bac0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
2bad0 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f 2a  ified ){..    /*
2bae0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2baf0 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
2bb00 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
2bb10 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
2bb20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73      ** does this
2bb30 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
2bb40 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
2bb50 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
2bb60 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
2bb70 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
2bb80 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e  compile time, an
2bb90 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61  d if this transa
2bba0 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20  ction meets the 
2bbb0 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20  .    ** runtime 
2bbc0 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20  criteria to use 
2bbd0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a  the operation: .
2bbe0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2bbf0 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74   * The file-syst
2bc00 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  em supports the 
2bc10 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
2bc20 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a  perty for.    **
2bc30 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
2bc40 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
2bc50 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20 20 2a  and .    **    *
2bc60 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
2bc70 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
2bc80 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
2bc90 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
2bca0 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
2bcb0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
2bcc0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
2bcd0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
2bce0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
2bcf0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
2bd00 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f  imization was no
2bd10 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  t enabled at com
2bd20 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20  pile time, then 
2bd30 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
2bd40 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2bd50 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ter() function i
2bd60 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61  s called to upda
2bd70 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20  te the change.  
2bd80 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20    ** counter in 
2bd90 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e  'indirect-mode'.
2bda0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
2bdb0 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64  tion is compiled
2bdc0 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20 69   in but.    ** i
2bdd0 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65  s not applicable
2bde0 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63   to this transac
2bdf0 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  tion, call sqlit
2be00 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2be10 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  ).    ** to make
2be20 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
2be30 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
2be40 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
2be50 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
2be60 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
2be70 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
2be80 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2be90 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e  ge-counter in in
2bea0 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d 6f  direct.    ** mo
2beb0 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  de. .    **.    
2bec0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2bed0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2bee0 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65  n is both enable
2bef0 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65  d and applicable
2bf00 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61  ,.    ** then ca
2bf10 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ll pager_incr_ch
2bf20 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
2bf30 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2bf40 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a  ge-counter.    *
2bf50 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f  * in 'direct' mo
2bf60 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2bf70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2bf80 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a  e will never be.
2bf90 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66      ** created f
2bfa0 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
2bfb0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64  ion..    */.#ifd
2bfc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2bfd0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2bfe0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
2bff0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2c000 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
2c010 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c020 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2c030 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
2c040 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
2c050 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2c060 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26 26 20  ->jfd) .     && 
2c070 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2c080 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69  ff==jrnlBufferSi
2c090 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  ze(pPager) .    
2c0a0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
2c0b0 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze>=pPager->dbFi
2c0c0 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26 20 28  leSize.     && (
2c0d0 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65  0==(pPg = sqlite
2c0e0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
2c0f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2c100 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44  )) || 0==pPg->pD
2c110 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20 20 20  irty).    ){.   
2c120 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2c130 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
2c140 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20  counter via the 
2c150 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74  direct-write met
2c160 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20  hod. The .      
2c170 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
2c180 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
2c190 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
2c1a0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
2c1b0 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 74  ge 1 .      ** t
2c1c0 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70  o include the up
2c1d0 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75  dated change cou
2c1e0 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
2c1f0 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20 20  ite page 1 .    
2c200 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
2c210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c220 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
2c230 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2c240 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72  .      ** proper
2c250 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66  ty of the host f
2c260 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73  ile-system, this
2c270 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20   is safe..      
2c280 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2c290 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2c2a0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
2c2b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c2c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c2d0 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
2c2e0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2c2f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c310 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2c320 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2c330 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ger, 0);.      }
2c340 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
2c350 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2c360 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2c370 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64 69  Pager, 0);.#endi
2c380 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  f.    if( rc!=SQ
2c390 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2c3a0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2c3b0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  exit;..    /* If
2c3c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2c3d0 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
2c3e0 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
2c3f0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
2c400 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
2c410 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
2c420 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
2c430 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2c440 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
2c450 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ile. This can on
2c460 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  ly happen in aut
2c470 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20  o-vacuum mode.. 
2c480 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 66     **.    ** Bef
2c490 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  ore reading the 
2c4a0 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20  pages with page 
2c4b0 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74  numbers larger t
2c4c0 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  han the .    ** 
2c4d0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
2c4e0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
2c4f0 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
2c500 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
2c510 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20  ** that it took 
2c520 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2c530 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2c540 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
2c550 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
2c560 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2c570 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20  ) return zeroed 
2c580 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66  pages instead of
2c590 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67   .    ** reading
2c5a0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
2c5b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2c5c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e    **.    ** When
2c5d0 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 3d 4f   journal_mode==O
2c5e0 46 46 20 74 68 65 20 64 62 4f 72 69 67 53 69 7a  FF the dbOrigSiz
2c5f0 65 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f  e is always zero
2c600 2c 20 73 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a  , so this.    **
2c610 20 62 6c 6f 63 6b 20 6e 65 76 65 72 20 72 75 6e   block never run
2c620 73 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  s if journal_mod
2c630 65 3d 4f 46 46 2e 0a 20 20 20 20 2a 2f 0a 23 69  e=OFF..    */.#i
2c640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c650 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2c660 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2c670 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72  ize<pPager->dbOr
2c680 69 67 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20  igSize .     && 
2c690 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a  ALWAYS(pPager->j
2c6a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2c6b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2c6c0 46 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  F).    ){.      
2c6d0 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20  Pgno i;         
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
2c700 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
2c710 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67  /.      const Pg
2c720 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  no iSkip = PAGER
2c730 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2c740 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63  ; /* Pending loc
2c750 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  k page */.      
2c760 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a  const Pgno dbSiz
2c770 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
2c780 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ze;       /* Dat
2c790 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65  abase image size
2c7a0 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67 65   */ .      pPage
2c7b0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
2c7c0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
2c7d0 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53        for( i=dbS
2c7e0 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  ize+1; i<=pPager
2c7f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b  ->dbOrigSize; i+
2c800 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  + ){.        if(
2c810 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
2c820 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
2c830 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21  ournal, i) && i!
2c840 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
2c850 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
2c860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2c870 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c   Page to journal
2c880 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
2c890 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
2c8a0 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
2c8b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2c8c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c8d0 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74  OK ) goto commit
2c8e0 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b  _phase_one_exit;
2c8f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c900 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c910 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
2c920 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2c930 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
2c940 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2c950 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c960 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2c970 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  e_exit;.        
2c980 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20  }.      } .     
2c990 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2c9a0 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  = dbSize;.    }.
2c9b0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
2c9c0 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
2c9d0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
2c9e0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2c9f0 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20  le. If a master 
2ca00 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
2ca10 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
2ca20 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
2ca30 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2ca40 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a 20  l file, .    ** 
2ca50 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73  or if zMaster is
2ca60 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72   NULL (no master
2ca70 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20   journal), then 
2ca80 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
2ca90 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o-op..    */.   
2caa0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
2cab0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
2cac0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69   zMaster);.    i
2cad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cae0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2caf0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2cb00 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
2cb10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
2cb20 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61   the atomic-upda
2cb30 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2cb40 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20  is being.    ** 
2cb50 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20  used, this call 
2cb60 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20  will not create 
2cb70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2cb80 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a   or perform any.
2cb90 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a      ** real IO..
2cba0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
2cbb0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2cbc0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
2cbd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cbe0 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2cbf0 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  ne_exit;..    /*
2cc00 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
2cc10 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
2cc20 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
2cc30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2cc40 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71  rite_pagelist(sq
2cc50 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2cc60 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2cc70 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28 20  ache));.    if( 
2cc80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2cc90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
2cca0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
2ccb0 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20  BLOCKED );.     
2ccc0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2ccd0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2cce0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63   }.    sqlite3Pc
2ccf0 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
2cd00 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a  ger->pPCache);..
2cd10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
2cd20 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f  le on disk is no
2cd30 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  t the same size 
2cd40 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
2cd50 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74 68  image,.    ** th
2cd60 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72 75  en use pager_tru
2cd70 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72  ncate to grow or
2cd80 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65   shrink the file
2cd90 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
2cda0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
2cdb0 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62  Size!=pPager->db
2cdc0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
2cdd0 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50    Pgno nNew = pP
2cde0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28  ager->dbSize - (
2cdf0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
2ce00 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
2ce10 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61 73  ager));.      as
2ce20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
2ce30 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
2ce40 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72 63  SIVE );.      rc
2ce50 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
2ce60 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b  e(pPager, nNew);
2ce70 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2ce80 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2ce90 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2cea0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  _exit;.    }..  
2ceb0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79    /* Finally, sy
2cec0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
2ced0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
2cee0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
2cef0 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20   && !noSync ){. 
2cf00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2cf10 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
2cf20 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
2cf30 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20  _flags);.    }. 
2cf40 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53     IOTRACE(("DBS
2cf50 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
2cf60 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  r))..    pPager-
2cf70 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
2cf80 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d  YNCED;.  }..comm
2cf90 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2cfa0 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
2cfb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  }.../*.** When t
2cfc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2cfd0 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61  called, the data
2cfe0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
2cff0 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a  en completely.**
2d000 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
2d010 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20  ect the changes 
2d020 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72  made by the curr
2d030 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2d040 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f  and.** synced to
2d050 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e   disk. The journ
2d060 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  al file still ex
2d070 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2d080 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75  -system .** thou
2d090 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69  gh, and if a fai
2d0a0 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74  lure occurs at t
2d0b0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c  his point it wil
2d0c0 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  l eventually.** 
2d0d0 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74  be used as a hot
2d0e0 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65  -journal and the
2d0f0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2d100 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  tion rolled back
2d110 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d120 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20  ction finalizes 
2d130 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d140 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65  , either by dele
2d150 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61  ting, .** trunca
2d160 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c  ting or partiall
2d170 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f  y zeroing it, so
2d180 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20   that it cannot 
2d190 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
2d1a0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
2d1b0 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20  back. Once this 
2d1c0 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e  is done the tran
2d1d0 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72  saction is.** ir
2d1e0 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74  revocably commit
2d1f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
2d200 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
2d210 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2d220 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2d230 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76  the pager.** mov
2d240 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  es into the erro
2d250 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  r state. Otherwi
2d260 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
2d270 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2d280 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2d290 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
2d2a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2d2b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d2c0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2d2d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d2e0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
2d2f0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2d300 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66  not be called if
2d310 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72 20 68   a prior error h
2d320 61 73 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a  as occurred..  *
2d330 2a 20 42 75 74 20 69 66 20 28 64 75 65 20 74 6f  * But if (due to
2d340 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2d350 65 6c 73 65 77 68 65 72 65 20 69 6e 20 74 68 65  elsewhere in the
2d360 20 73 79 73 74 65 6d 29 20 69 74 20 64 6f 65 73   system) it does
2d370 20 67 65 74 0a 20 20 2a 2a 20 63 61 6c 6c 65 64   get.  ** called
2d380 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68  , just return th
2d390 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64  e same error cod
2d3a0 65 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  e without doing 
2d3b0 61 6e 79 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 69  anything. */.  i
2d3c0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2d3d0 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
2d3e0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2d3f0 64 65 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66  de;..  /* This f
2d400 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e  unction should n
2d410 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ot be called if 
2d420 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
2d430 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a   in at least.  *
2d440 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
2d450 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65   state. And inde
2d460 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  ed SQLite never 
2d470 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20 69  does this. But i
2d480 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74  t is.  ** nice t
2d490 6f 20 68 61 76 65 20 74 68 69 73 20 64 65 66 65  o have this defe
2d4a0 6e 73 69 76 65 20 74 65 73 74 20 68 65 72 65 20  nsive test here 
2d4b0 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69  anyway..  */.  i
2d4c0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2d4d0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
2d4e0 45 52 56 45 44 29 20 29 20 72 65 74 75 72 6e 20  ERVED) ) return 
2d4f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
2d500 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61 74   /* An optimizat
2d510 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74 61  ion. If the data
2d520 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63 74  base was not act
2d530 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20 64  ually modified d
2d540 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73 20  uring.  ** this 
2d550 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2d560 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
2d570 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
2d580 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a 20  ode and is.  ** 
2d590 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e 74  using persistent
2d5a0 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
2d5b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2d5c0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20   a no-op..  **. 
2d5d0 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66   ** The start of
2d5e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d5f0 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
2d600 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a 6f  ains a single jo
2d610 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64  urnal .  ** head
2d620 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  er with the nRec
2d630 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30 2e   field set to 0.
2d640 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72 6e   If such a journ
2d650 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20 20  al is used as.  
2d660 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ** a hot-journal
2d670 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
2d680 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30 20  nal rollback, 0 
2d690 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
2d6a0 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  made.  ** to the
2d6b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2d6c0 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  So there is no n
2d6d0 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65 20  eed to zero the 
2d6e0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65  journal .  ** he
2d6f0 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65 20  ader. Since the 
2d700 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
2d710 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 72  usive mode, ther
2d720 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 2a  e is no need.  *
2d730 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c 6f  * to drop any lo
2d740 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a 2f  cks either..  */
2d750 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
2d760 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 20  bModified==0 && 
2d770 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2d780 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50 61  eMode .   && pPa
2d790 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2d7a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2d7b0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29 7b  ODE_PERSIST.  ){
2d7c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2d7d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
2d7e0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
2d7f0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72  pPager) );.    r
2d800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d810 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2d820 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE(("COMMIT %d\n
2d830 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2d840 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r)));.  assert( 
2d850 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
2d860 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d  AGER_SYNCED || M
2d870 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d  EMDB || !pPager-
2d880 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20  >dbModified );. 
2d890 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2d8a0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2d8b0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2d8c0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
2d8d0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2d8e0 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ger, rc);.}../*.
2d8f0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
2d900 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61 74  changes. The dat
2d910 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
2d920 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
2d930 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   mode..**.** Thi
2d940 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
2d950 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a 2a  rms two tasks:.*
2d960 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f 6c  *.**   1) It rol
2d970 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  ls back the jour
2d980 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f 72  nal file, restor
2d990 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ing all database
2d9a0 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20 20   file and .**   
2d9b0 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63     in-memory cac
2d9c0 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  he pages to the 
2d9d0 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65 20  state they were 
2d9e0 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  in when the tran
2d9f0 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20  saction.**      
2da00 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64 0a  was opened, and.
2da10 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61 6c  **   2) It final
2da20 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  izes the journal
2da30 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20 69   file, so that i
2da40 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66 6f  t is not used fo
2da50 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72 6f  r hot.**      ro
2da60 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70 6f  llback at any po
2da70 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
2da80 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63 74  e..**.** subject
2da90 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2daa0 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 73  g qualifications
2dab0 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65  :.**.** * If the
2dac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2dad0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77 68   not yet open wh
2dae0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2daf0 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20   is called,.**  
2db00 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20 69   then only (2) i
2db10 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e 20  s performed. In 
2db20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
2db30 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  is no journal fi
2db40 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c 20  le.**   to roll 
2db50 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  back..**.** * If
2db60 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
2db70 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  te other than SQ
2db80 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e 20  LITE_FULL, then 
2db90 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a 20  task (1) is .** 
2dba0 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66 20    performed. If 
2dbb0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73 6b  successful, task
2dbc0 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73 73   (2). Regardless
2dbd0 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 0a   of the outcome.
2dbe0 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c 20  **   of either, 
2dbf0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2dc00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2dc10 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
2dc20 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  ller.**   (i.e. 
2dc30 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
2dc40 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  ERR or SQLITE_CO
2dc50 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20  RRUPT)..**.** * 
2dc60 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2dc70 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  in PAGER_RESERVE
2dc80 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  D state, then at
2dc90 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74 68  tempt (1). Wheth
2dca0 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20 28  er.**   or not (
2dcb0 31 29 20 69 73 20 73 75 63 63 75 73 73 66 75 6c  1) is succussful
2dcc0 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20 28  , also attempt (
2dcd0 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  2). If successfu
2dce0 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 53  l, return.**   S
2dcf0 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
2dd00 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20 65  ise, enter the e
2dd10 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72  rror state and r
2dd20 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
2dd30 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64 65  .**   error code
2dd40 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a 2a   encountered. .*
2dd50 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
2dd60 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ase there is no 
2dd70 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
2dd80 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72 69  database was wri
2dd90 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20 53  tten to. .**   S
2dda0 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69 6e  o is safe to fin
2ddb0 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
2ddc0 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20 74  l file even if t
2ddd0 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a 20  he playback .** 
2dde0 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29 20    (operation 1) 
2ddf0 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72 20  failed. However 
2de00 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 65  the pager must e
2de10 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
2de20 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68 65  tate.**   as the
2de30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2de40 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
2de50 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63 74   are now suspect
2de60 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c  ..**.** * Finall
2de70 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f 45  y, if in PAGER_E
2de80 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20  XCLUSIVE state, 
2de90 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2dea0 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74 65  . Only.**   atte
2deb0 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20 69  mpt (2) if (1) i
2dec0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52 65  s successful. Re
2ded0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2dee0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
2def0 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e 74     otherwise ent
2df00 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
2df10 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  te and return th
2df20 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  e error code fro
2df30 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69 6c  m the .**   fail
2df40 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ing operation..*
2df50 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20 63  *.**   In this c
2df60 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ase the database
2df70 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20 62   file may have b
2df80 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  een written to. 
2df90 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20 70  So if the.**   p
2dfa0 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  layback operatio
2dfb0 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65 65  n did not succee
2dfc0 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20 62  d it would not b
2dfd0 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69  e safe to finali
2dfe0 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72  ze.**   the jour
2dff0 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65 65  nal file. It nee
2e000 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69 6e  ds to be left in
2e010 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2e020 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73 6f   so that.**   so
2e030 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
2e040 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20 72   can use it to r
2e050 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
2e060 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a 2a  ase state (by.**
2e070 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72     hot-journal r
2e080 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74  ollback)..*/.int
2e090 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2e0a0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
2e0b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
2e0c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e0e0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
2e0f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52 4f   PAGERTRACE(("RO
2e100 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
2e110 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
2e120 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
2e130 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21 69  dbModified || !i
2e140 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2e150 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  d) ){.    rc = p
2e160 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2e170 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2e180 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2e190 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
2e1a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
2e1b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
2e1c0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
2e1d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2e1e0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
2e1f0 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
2e200 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e210 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
2e220 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
2e230 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
2e240 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67  se{.    if( pPag
2e250 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2e260 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
2e270 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
2e280 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2e290 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2e2a0 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61  ;.      rc2 = pa
2e2b0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
2e2c0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
2e2d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
2e2e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e2f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e300 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
2e310 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2e320 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2e330 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
2e340 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
2e350 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
2e360 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
2e370 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
2e380 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
2e390 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
2e3a0 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
2e3b0 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
2e3c0 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
2e3d0 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  er.    ** cache.
2e3e0 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
2e3f0 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
2e400 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
2e410 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20  y error .    ** 
2e420 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20  persistent..    
2e430 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2e440 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
2e450 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
2e460 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2e470 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2e480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2e490 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
2e4a0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
2e4b0 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
2e4c0 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
2e4d0 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
2e4e0 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67 65  /.u8 sqlite3Page
2e4f0 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
2e500 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2e510 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
2e520 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
2e530 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2e540 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2e550 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
2e560 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e570 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
2e580 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2e590 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
2e5a0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
2e5b0 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
2e5c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
2e5d0 70 70 72 6f 78 69 6d 61 74 65 20 6e 75 6d 62 65  pproximate numbe
2e5e0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
2e5f0 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 0a 2a  mory currently.*
2e600 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61  * used by the pa
2e610 67 65 72 20 61 6e 64 20 69 74 73 20 61 73 73 6f  ger and its asso
2e620 63 69 61 74 65 64 20 63 61 63 68 65 2e 0a 2a 2f  ciated cache..*/
2e630 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2e640 72 4d 65 6d 55 73 65 64 28 50 61 67 65 72 20 2a  rMemUsed(Pager *
2e650 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 70  pPager){.  int p
2e660 65 72 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61  erPageSize = pPa
2e670 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
2e680 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 2b  pPager->nExtra +
2e690 20 32 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 65   20;.  return pe
2e6a0 72 50 61 67 65 53 69 7a 65 2a 73 71 6c 69 74 65  rPageSize*sqlite
2e6b0 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
2e6c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2e6d0 29 0a 20 20 20 20 20 20 20 20 20 20 20 2b 20 73  ).           + s
2e6e0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65  qlite3MallocSize
2e6f0 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  (pPager);.}../*.
2e700 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
2e710 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2e720 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69 66  es to the specif
2e730 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74  ied page..*/.int
2e740 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
2e750 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67 65  eRefcount(DbPage
2e760 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
2e770 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
2e780 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61  PageRefcount(pPa
2e790 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ge);.}..#ifdef S
2e7a0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
2e7b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2e7c0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
2e7d0 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
2e7e0 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
2e7f0 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50  ite3PagerStats(P
2e800 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e810 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
2e820 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69  ];.  a[0] = sqli
2e830 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
2e840 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2e850 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c  e);.  a[1] = sql
2e860 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
2e870 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
2e880 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73  che);.  a[2] = s
2e890 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74 43  qlite3PcacheGetC
2e8a0 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
2e8b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 33  >pPCache);.  a[3
2e8c0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
2e8d0 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29 20  zeValid ? (int) 
2e8e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a  pPager->dbSize :
2e8f0 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50   -1;.  a[4] = pP
2e900 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
2e910 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
2e920 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20  rCode;.  a[6] = 
2e930 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
2e940 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
2e950 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30  Miss;.  a[8] = 0
2e960 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65  ;  /* Used to be
2e970 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a   pPager->nOvfl *
2e980 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65  /.  a[9] = pPage
2e990 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30  r->nRead;.  a[10
2e9a0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69  ] = pPager->nWri
2e9b0 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a  te;.  return a;.
2e9c0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2e9d0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
2e9e0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
2e9f0 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  ory pager..*/.in
2ea00 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
2ea10 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61  Memdb(Pager *pPa
2ea20 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d  ger){.  return M
2ea30 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  EMDB;.}../*.** C
2ea40 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
2ea50 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61  are at least nSa
2ea60 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e  vepoint savepoin
2ea70 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68 65 72  ts open. If ther
2ea80 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  e are.** current
2ea90 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e 53 61  ly less than nSa
2eaa0 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74  vepoints open, t
2eab0 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20  hen open one or 
2eac0 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 0a  more savepoints.
2ead0 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20 74 68  ** to make up th
2eae0 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20 49 66  e difference. If
2eaf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2eb00 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61 6c 72  avepoints is alr
2eb10 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  eady.** equal to
2eb20 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74 68 65   nSavepoint, the
2eb30 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2eb40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2eb50 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
2eb60 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20  location fails, 
2eb70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
2eb80 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2eb90 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
2eba0 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74   while opening t
2ebb0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
2ebc0 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20  ile, then an IO 
2ebd0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a  error code is.**
2ebe0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
2ebf0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
2ec00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2ec10 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
2ec20 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
2ec30 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29   int nSavepoint)
2ec40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2ec50 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ec70 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2ec80 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d    int nCurrent =
2ec90 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2eca0 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  int;        /* C
2ecb0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
2ecc0 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a   savepoints */..
2ecd0 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74    if( nSavepoint
2ece0 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70 50 61  >nCurrent && pPa
2ecf0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2ed00 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  ){.    int ii;  
2ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ed30 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
2ed40 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67 65 72  ble */.    Pager
2ed50 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b  Savepoint *aNew;
2ed60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed70 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e     /* New Pager.
2ed80 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79  aSavepoint array
2ed90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
2eda0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edc0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
2edd0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
2ede0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2edf0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
2ee00 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
2ee10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2ee20 20 72 63 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f   rc;..    /* Gro
2ee30 77 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  w the Pager.aSav
2ee40 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69  epoint array usi
2ee50 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65  ng realloc(). Re
2ee60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2ee70 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20  M.    ** if the 
2ee80 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2ee90 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72  . Otherwise, zer
2eea0 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f  o the new portio
2eeb0 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20  n in case a .   
2eec0 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   ** malloc failu
2eed0 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
2eee0 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e  populating it in
2eef0 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f   the for(...) lo
2ef00 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  op below..    */
2ef10 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67  .    aNew = (Pag
2ef20 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71  erSavepoint *)sq
2ef30 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
2ef40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
2ef50 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66  avepoint, sizeof
2ef60 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29  (PagerSavepoint)
2ef70 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20  *nSavepoint.    
2ef80 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77  );.    if( !aNew
2ef90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2efa0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2efb0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2efc0 26 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c  &aNew[nCurrent],
2efd0 20 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d   0, (nSavepoint-
2efe0 6e 43 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65  nCurrent) * size
2eff0 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  of(PagerSavepoin
2f000 74 29 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t));.    pPager-
2f010 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e  >aSavepoint = aN
2f020 65 77 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ew;.    pPager->
2f030 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61  nSavepoint = nSa
2f040 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a  vepoint;..    /*
2f050 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61   Populate the Pa
2f060 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72  gerSavepoint str
2f070 75 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c  uctures just all
2f080 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66  ocated. */.    f
2f090 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20  or(ii=nCurrent; 
2f0a0 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  ii<nSavepoint; i
2f0b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65 77  i++){.      aNew
2f0c0 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61  [ii].nOrig = nPa
2f0d0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ge;.      if( is
2f0e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2f0f0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
2f100 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20  rnalOff>0 ){.   
2f110 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
2f120 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
2f130 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
2f140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f150 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
2f160 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
2f170 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
2f180 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
2f190 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
2f1a0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
2f1b0 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
2f1c0 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
2f1d0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
2f1e0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2f1f0 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53  ( !aNew[ii].pInS
2f200 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
2f210 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f220 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2f230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
2f240 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2f250 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  nal, if it is no
2f260 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  t already opened
2f270 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70  . */.    rc = op
2f280 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
2f290 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
2f2a0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
2f2b0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  nt(pPager);.  }.
2f2c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f2d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f2e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
2f2f0 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65  o rollback or re
2f300 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61  lease (commit) a
2f310 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54   savepoint..** T
2f320 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20  he savepoint to 
2f330 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
2f340 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  ack need not be 
2f350 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
2f360 79 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 61  y .** created sa
2f370 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50  vepoint..**.** P
2f380 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61  arameter op is a
2f390 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41 56  lways either SAV
2f3a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2f3b0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
2f3c0 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69  EASE..** If it i
2f3d0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
2f3e0 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73  ASE, then releas
2f3f0 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68  e and destroy th
2f400 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  e savepoint with
2f410 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70  .** index iSavep
2f420 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53  oint. If it is S
2f430 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
2f440 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b  K, then rollback
2f450 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20   all changes.** 
2f460 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 72  that have occurr
2f470 65 64 20 73 69 6e 63 65 20 74 68 65 20 73 70 65  ed since the spe
2f480 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74  cified savepoint
2f490 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a   was created..**
2f4a0 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
2f4b0 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  t to rollback or
2f4c0 20 72 65 6c 65 61 73 65 20 69 73 20 69 64 65 6e   release is iden
2f4d0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
2f4e0 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69  ter .** iSavepoi
2f4f0 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  nt. A value of 0
2f500 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72 61 74   means to operat
2f510 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f  e on the outermo
2f520 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  st savepoint.** 
2f530 28 74 68 65 20 66 69 72 73 74 20 63 72 65 61 74  (the first creat
2f540 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  ed). A value of 
2f550 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
2f560 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65 72 61  t-1) means opera
2f570 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73  te.** on the mos
2f580 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
2f590 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ed savepoint. If
2f5a0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
2f5b0 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28  reater than.** (
2f5c0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
2f5d0 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66  -1), then this f
2f5e0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2f5f0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  op..**.** If a n
2f600 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 69 73  egative value is
2f610 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
2f620 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74  function, then t
2f630 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2f640 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2f650 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
2f660 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20 63  s different to c
2f670 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
2f680 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
2f690 29 20 62 65 63 61 75 73 65 20 74 68 69 73 20 66  ) because this f
2f6a0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2f6b0 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68   terminate.** th
2f6c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
2f6d0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
2f6e0 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72 65  base, it just re
2f6f0 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20 63  stores the .** c
2f700 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
2f710 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
2f720 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a  riginal state. .
2f730 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73  **.** In any cas
2f740 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  e, all savepoint
2f750 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  s with an index 
2f760 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 53 61  greater than iSa
2f770 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20  vepoint .** are 
2f780 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20 74 68  destroyed. If th
2f790 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
2f7a0 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53  operation (op==S
2f7b0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2f7c0 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65 70  ),.** then savep
2f7d0 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20  oint iSavepoint 
2f7e0 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 65  is also destroye
2f7f0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
2f800 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2f810 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  n SQLITE_NOMEM i
2f820 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
2f830 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
2f840 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
2f850 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ode if an IO err
2f860 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2f870 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a  rolling back a .
2f880 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ** savepoint. If
2f890 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63 75 72   no errors occur
2f8a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2f8b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74  eturned..*/ .int
2f8c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
2f8d0 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
2f8e0 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  ager, int op, in
2f8f0 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
2f900 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2f910 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2f920 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2f930 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
2f940 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2f950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 61  );.  assert( iSa
2f960 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70  vepoint>=0 || op
2f970 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2f980 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69  BACK );..  if( i
2f990 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72  Savepoint<pPager
2f9a0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->nSavepoint ){.
2f9b0 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
2f9c0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2f9d0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2f9e0 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20     int nNew;    
2f9f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2fa00 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 61 76  of remaining sav
2fa10 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20 74 68  epoints after th
2fa20 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f  is op. */..    /
2fa30 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2fa40 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73   many savepoints
2fa50 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61   will still be a
2fa60 63 74 69 76 65 20 61 66 74 65 72 20 74 68 69 73  ctive after this
2fa70 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
2fa80 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20 76 61  n. Store this va
2fa90 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65  lue in nNew. The
2faa0 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63 65 73  n free resources
2fab0 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20   associated .   
2fac0 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73 61 76   ** with any sav
2fad0 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61 72 65  epoints that are
2fae0 20 64 65 73 74 72 6f 79 65 64 20 62 79 20 74 68   destroyed by th
2faf0 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
2fb00 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20    */.    nNew = 
2fb10 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 28 20  iSavepoint + (( 
2fb20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2fb30 4c 45 41 53 45 20 29 20 3f 20 30 20 3a 20 31 29  LEASE ) ? 0 : 1)
2fb40 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65  ;.    for(ii=nNe
2fb50 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  w; ii<pPager->nS
2fb60 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
2fb70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
2fb80 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
2fb90 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
2fba0 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29  i].pInSavepoint)
2fbb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
2fbc0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d  er->nSavepoint =
2fbd0 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49   nNew;..    /* I
2fbe0 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c 65  f this is a rele
2fbf0 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ase of the outer
2fc00 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c 20  most savepoint, 
2fc10 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a  truncate .    **
2fc20 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2fc30 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
2fc40 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69  n size. */.    i
2fc50 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
2fc60 5f 52 45 4c 45 41 53 45 20 29 7b 0a 20 20 20 20  _RELEASE ){.    
2fc70 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26    if( nNew==0 &&
2fc80 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2fc90 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  sjfd) ){.       
2fca0 20 2f 2a 20 4f 6e 6c 79 20 74 72 75 6e 63 61 74   /* Only truncat
2fcb0 65 20 69 66 20 69 74 20 69 73 20 61 6e 20 69 6e  e if it is an in
2fcc0 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
2fcd0 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nal. */.        
2fce0 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d  if( sqlite3IsMem
2fcf0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
2fd00 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  sjfd) ){.       
2fd10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2fd20 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
2fd30 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->sjfd, 0);.    
2fd40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2fd50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2fd60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fd70 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2fd80 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
2fd90 20 20 7d 0a 20 20 20 20 2f 2a 20 45 6c 73 65 20    }.    /* Else 
2fda0 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
2fdb0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c  ck operation, pl
2fdc0 61 79 62 61 63 6b 20 74 68 65 20 73 70 65 63 69  ayback the speci
2fdd0 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a  fied savepoint..
2fde0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
2fdf0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69  s a temp-file, i
2fe00 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
2fe10 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
2fe20 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e  ile has.    ** n
2fe30 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
2fe40 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2fe50 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
2fe60 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a 20   no changes to. 
2fe70 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
2fe80 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65 20  se file, so the 
2fe90 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69  playback operati
2fea0 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  on can be skippe
2feb0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 6c  d..    */.    el
2fec0 73 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  se if( isOpen(pP
2fed0 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
2fee0 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
2fef0 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d  nt *pSavepoint =
2ff00 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50   (nNew==0)?0:&pP
2ff10 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2ff20 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20  [nNew-1];.      
2ff30 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61  rc = pagerPlayba
2ff40 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  ckSavepoint(pPag
2ff50 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b  er, pSavepoint);
2ff60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 72 63  .      assert(rc
2ff70 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a  !=SQLITE_DONE);.
2ff80 20 20 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72      }.  .  }.  r
2ff90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2ffa0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
2ffb0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
2ffc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ffd0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
2ffe0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
2fff0 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
30000 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
30010 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
30020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
30030 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74  n the VFS struct
30040 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ure for the page
30050 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  r..*/.const sqli
30060 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33  te3_vfs *sqlite3
30070 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a  PagerVfs(Pager *
30080 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
30090 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  n pPager->pVfs;.
300a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
300b0 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
300c0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
300d0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
300e0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67  .** with the pag
300f0 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
30100 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  return NULL if t
30110 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e  he file has.** n
30120 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
30130 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66  ed..*/.sqlite3_f
30140 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  ile *sqlite3Page
30150 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61  rFile(Pager *pPa
30160 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
30170 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a  Pager->fd;.}../*
30180 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
30190 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
301a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
301b0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
301c0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
301d0 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
301e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
301f0 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
30200 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
30210 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
30220 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
30230 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
30240 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
30250 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
30260 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
30270 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
30280 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
30290 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
302a0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
302b0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
302c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
302d0 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
302e0 65 74 20 6f 72 20 72 65 74 72 69 65 76 65 20 74  et or retrieve t
302f0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
30300 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69  s pager.*/.stati
30310 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  c void sqlite3Pa
30320 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50  gerSetCodec(.  P
30330 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
30340 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
30350 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
30360 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ,int),.  void (*
30370 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
30380 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a  void*,int,int),.
30390 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
303a0 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76  ree)(void*),.  v
303b0 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20  oid *pCodec.){. 
303c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
303d0 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
303e0 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
303f0 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20  ger->pCodec);.  
30400 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
30410 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f   pPager->memDb ?
30420 20 30 20 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70   0 : xCodec;.  p
30430 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
30440 65 43 68 6e 67 20 3d 20 78 43 6f 64 65 63 53 69  eChng = xCodecSi
30450 7a 65 43 68 6e 67 3b 0a 20 20 70 50 61 67 65 72  zeChng;.  pPager
30460 2d 3e 78 43 6f 64 65 63 46 72 65 65 20 3d 20 78  ->xCodecFree = x
30470 43 6f 64 65 63 46 72 65 65 3b 0a 20 20 70 50 61  CodecFree;.  pPa
30480 67 65 72 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43  ger->pCodec = pC
30490 6f 64 65 63 3b 0a 20 20 70 61 67 65 72 52 65 70  odec;.  pagerRep
304a0 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
304b0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  .}.static void *
304c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 43  sqlite3PagerGetC
304d0 6f 64 65 63 28 50 61 67 65 72 20 2a 70 50 61 67  odec(Pager *pPag
304e0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
304f0 61 67 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a  ager->pCodec;.}.
30500 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
30510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
30520 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
30530 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
30540 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
30550 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
30560 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
30570 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
30580 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
30590 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
305a0 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
305b0 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
305c0 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
305d0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
305e0 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
305f0 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
30600 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
30610 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
30620 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
30630 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
30640 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
30650 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
30660 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
30670 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
30680 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
30690 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
306a0 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
306b0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
306c0 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
306d0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
306e0 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
306f0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
30700 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
30710 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
30720 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
30730 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
30740 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
30750 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
30760 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
30770 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
30780 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
30790 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
307a0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
307b0 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
307c0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
307d0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
307e0 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
307f0 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
30800 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
30810 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
30820 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
30830 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
30840 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c  fourth argument,
30850 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f   isCommit, is no
30860 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
30870 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a  s page is being.
30880 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74  ** moved as part
30890 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72   of a database r
308a0 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75  eorganization ju
308b0 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  st before the tr
308c0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  ansaction .** is
308d0 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
308e0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
308f0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
30900 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
30910 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20  se page .** pPg 
30920 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e  refers to will n
30930 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ot be written to
30940 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
30950 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
30960 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
30970 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
30980 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
30990 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
309a0 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
309b0 63 63 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65  ccurs. Otherwise
309c0 2c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  , it returns SQL
309d0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
309e0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
309f0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
30a00 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
30a10 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69  Pgno pgno, int i
30a20 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64  sCommit){.  PgHd
30a30 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20  r *pPgOld;      
30a40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30a50 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
30a60 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e  ritten. */.  Pgn
30a70 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
30a80 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64   0;       /* Old
30a90 20 76 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70   value of pPg->p
30aa0 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20  gno, if sync is 
30ab0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
30ac0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
30ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
30ae0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
30af0 67 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20  gno origPgno;   
30b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30b10 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
30b20 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73   number */..  as
30b30 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
30b40 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72  0 );..  /* In or
30b50 64 65 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74  der to be able t
30b60 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69  o rollback, an i
30b70 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
30b80 65 20 6d 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e must journal. 
30b90 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 65 20   ** the page we 
30ba0 61 72 65 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e  are moving from.
30bb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
30bc0 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  B ){.    rc = sq
30bd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30be0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
30bf0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30c00 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
30c10 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20  age being moved 
30c20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73  is dirty and has
30c30 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20   not been saved 
30c40 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20  by the latest.  
30c50 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68  ** savepoint, th
30c60 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72  en save the curr
30c70 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
30c80 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
30c90 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72  e .  ** sub-jour
30ca0 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  nal now. This is
30cb0 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e   required to han
30cc0 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  dle the followin
30cd0 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a  g scenario:.  **
30ce0 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20  .  **   BEGIN;. 
30cf0 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
30d00 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f   page X, then mo
30d10 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72  dify it in memor
30d20 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45  y>.  **     SAVE
30d30 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20  POINT one;.  ** 
30d40 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65        <Move page
30d50 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59   X to location Y
30d60 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42  >.  **     ROLLB
30d70 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a  ACK TO one;.  **
30d80 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20  .  ** If page X 
30d90 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e  were not written
30da0 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
30db0 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75  nal here, it wou
30dc0 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70  ld not.  ** be p
30dd0 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f  ossible to resto
30de0 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20  re its contents 
30df0 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41  when the "ROLLBA
30e00 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20  CK TO one".  ** 
30e10 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69  statement were i
30e20 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  s processed..  *
30e30 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61  *.  ** subjourna
30e40 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64  lPage() may need
30e50 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
30e60 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d  ce to store pPg-
30e70 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20  >pgno into.  ** 
30e80 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65  one or more save
30e90 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54  point bitvecs. T
30ea0 68 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f  his is the reaso
30eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
30ec0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
30ed0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20  SQLITE_NOMEM..  
30ee0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
30ef0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 0a  ags&PGHDR_DIRTY.
30f00 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69 72     && subjRequir
30f10 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 26  esPage(pPg).   &
30f20 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
30f30 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
30f40 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20  e(pPg)).  ){.   
30f50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
30f60 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
30f70 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
30f80 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
30f90 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
30fa0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
30fb0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
30fc0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
30fd0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
30fe0 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54  0, pgno));.  IOT
30ff0 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
31000 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
31010 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
31020 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ))..  /* If the 
31030 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
31040 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
31050 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
31060 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
31070 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
31080 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
31090 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
310a0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
310b0 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
310c0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
310d0 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
310e0 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
310f0 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
31100 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
31110 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
31120 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
31130 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
31140 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
31150 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
31160 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
31170 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
31180 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
31190 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
311a0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26  DR_NEED_SYNC) &&
311b0 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20   !isCommit ){.  
311c0 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
311d0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
311e0 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
311f0 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
31200 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
31210 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
31220 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
31230 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
31240 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31250 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
31260 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
31270 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
31280 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
31290 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
312a0 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
312b0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
312c0 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
312d0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
312e0 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
312f0 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
31300 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
31310 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
31320 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
31330 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
31340 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
31350 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  e..  */.  pPg->f
31360 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
31370 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f  EED_SYNC;.  pPgO
31380 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
31390 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
313a0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f  .  assert( !pPgO
313b0 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52  ld || pPgOld->nR
313c0 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ef==1 );.  if( p
313d0 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67  PgOld ){.    pPg
313e0 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f  ->flags |= (pPgO
313f0 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ld->flags&PGHDR_
31400 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20  NEED_SYNC);.    
31410 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
31420 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73     /* Do not dis
31430 63 61 72 64 20 70 61 67 65 73 20 66 72 6f 6d 20  card pages from 
31440 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
31450 61 62 61 73 65 20 73 69 6e 63 65 20 77 65 20 6d  abase since we m
31460 69 67 68 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65  ight.      ** ne
31470 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c  ed to rollback l
31480 61 74 65 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65  ater.  Just move
31490 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 6f 66   the page out of
314a0 20 74 68 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20   the way. */.   
314b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
314c0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
314d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
314e0 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64  cacheMove(pPgOld
314f0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
31500 2b 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  +1);.    }else{.
31510 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
31520 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b  cheDrop(pPgOld);
31530 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72  .    }.  }..  or
31540 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  igPgno = pPg->pg
31550 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  no;.  sqlite3Pca
31560 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e  cheMove(pPg, pgn
31570 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  o);.  sqlite3Pca
31580 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
31590 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  );.  pPager->dbM
315a0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
315b0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
315c0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
315d0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
315e0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
315f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
31600 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
31610 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
31620 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
31630 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
31640 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
31650 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
31660 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
31670 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
31680 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
31690 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
316a0 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22  * "is journaled"
316b0 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73   bitvec flag has
316c0 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
316d0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
316e0 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c  died by.    ** l
316f0 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20  oading the page 
31700 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
31710 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
31720 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
31730 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67  ync .    ** flag
31740 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31750 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
31760 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
31770 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
31780 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
31790 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
317a0 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
317b0 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
317c0 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
317d0 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
317e0 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
317f0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
31800 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
31810 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
31820 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
31830 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
31840 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
31850 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
31860 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
31870 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
31880 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
31890 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
318a0 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
318b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
318c0 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
318d0 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
318e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
318f0 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
31900 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
31910 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
31920 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
31930 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
31940 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
31950 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
31960 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48  ..    */.    PgH
31970 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
31980 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31990 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
319a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
319b0 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
319c0 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
319d0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
319e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
319f0 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
31a00 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno<=pPager->db
31a10 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
31a20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31a30 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30  er->pTmpSpace!=0
31a40 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
31a50 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
31a60 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
31a70 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  l, needSyncPgno,
31a80 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
31a90 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
31aa0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
31ab0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
31ac0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
31ad0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31ae0 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21  ->noSync==0 && !
31af0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67  MEMDB );.    pPg
31b00 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  Hdr->flags |= PG
31b10 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
31b20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
31b30 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  MakeDirty(pPgHdr
31b40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
31b50 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
31b60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
31b70 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
31b80 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65  y database, make
31b90 20 73 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e   sure the origin
31ba0 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65  al page continue
31bb0 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c  s.  ** to exist,
31bc0 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
31bd0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
31be0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73  o roll back.  Us
31bf0 65 20 70 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73  e pPgOld.  ** as
31c00 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
31c10 67 65 20 73 69 6e 63 65 20 69 74 20 68 61 73 20  ge since it has 
31c20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
31c30 6f 63 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  ocated..  */.  i
31c40 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
31c50 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76  sqlite3PcacheMov
31c60 65 28 70 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67  e(pPgOld, origPg
31c70 6e 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  no);.    sqlite3
31c80 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 4f 6c  PagerUnref(pPgOl
31c90 64 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  d);.  }..  retur
31ca0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
31cb0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
31cc0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
31cd0 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
31ce0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
31cf0 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
31d00 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
31d10 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61  bPage *pPg){.  a
31d20 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
31d30 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  >0 || pPg->pPage
31d40 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65  r->memDb );.  re
31d50 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b  turn pPg->pData;
31d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
31d70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
31d80 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
31d90 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
31da0 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
31db0 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
31dc0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
31dd0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
31de0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
31df0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
31e00 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 45 78   return pPg->pEx
31e10 74 72 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  tra;.}../*.** Ge
31e20 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
31e30 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
31e40 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
31e50 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
31e60 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
31e70 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
31e80 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
31e90 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
31ea0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
31eb0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
31ec0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
31ed0 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
31ee0 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
31ef0 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
31f00 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
31f10 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
31f20 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
31f30 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
31f40 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
31f50 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
31f60 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
31f70 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
31f80 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
31f90 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
31fa0 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
31fb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
31fc0 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
31fd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
31fe0 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
31ff0 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
32000 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
32010 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
32020 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
32030 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
32040 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
32050 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
32060 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
32070 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
32080 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
32090 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
320a0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
320b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
320c0 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
320d0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
320e0 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
320f0 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
32100 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
32110 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
32120 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38  lusiveMode = (u8
32130 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65  )eMode;.  }.  re
32140 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
32150 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  ->exclusiveMode;
32160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
32170 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  t the journal-mo
32180 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
32190 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
321a0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  de must be one o
321b0 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45  f:.**.**    PAGE
321c0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
321d0 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ERY.**    PAGER_
321e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
321f0 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  TE.**    PAGER_J
32200 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
32210 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ATE.**    PAGER_
32220 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
32230 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  IST.**    PAGER_
32240 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a  JOURNALMODE_OFF.
32250 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
32260 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a  NALMODE_MEMORY.*
32270 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61  *.** If the para
32280 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
32290 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ERY, then the jo
322a0 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 20 73 65  urnal_mode is se
322b0 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75  t to the.** valu
322c0 65 20 73 70 65 63 69 66 69 65 64 20 69 66 20 74  e specified if t
322d0 68 65 20 63 68 61 6e 67 65 20 69 73 20 61 6c 6c  he change is all
322e0 6f 77 65 64 2e 20 20 54 68 65 20 63 68 61 6e 67  owed.  The chang
322f0 65 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 0a  e is disallowed.
32300 2a 2a 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f  ** for the follo
32310 77 69 6e 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a  wing reasons:.**
32320 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d  .**   *  An in-m
32330 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 63  emory database c
32340 61 6e 20 6f 6e 6c 79 20 68 61 76 65 20 69 74 73  an only have its
32350 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65   journal_mode se
32360 74 20 74 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20  t to _OFF.**    
32370 20 20 6f 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a    or _MEMORY..**
32380 0a 2a 2a 20 20 20 2a 20 20 54 68 65 20 6a 6f 75  .**   *  The jou
32390 72 6e 61 6c 20 6d 6f 64 65 20 6d 61 79 20 6e 6f  rnal mode may no
323a0 74 20 62 65 20 63 68 61 6e 67 65 64 20 77 68 69  t be changed whi
323b0 6c 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  le a transaction
323c0 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a   is active..**.*
323d0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69  * The returned i
323e0 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72 72  ndicate the curr
323f0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
32400 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d  dated) journal-m
32410 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
32420 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d  te3PagerJournalM
32430 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
32440 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
32450 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d   assert( eMode==
32460 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32470 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20  E_QUERY.        
32480 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
32490 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
324a0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
324b0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
324c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
324d0 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20  RUNCATE.        
324e0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
324f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32500 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20  PERSIST.        
32510 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
32520 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32530 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
32540 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32550 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
32560 4f 52 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ORY );.  assert(
32570 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
32580 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
32590 69 66 28 20 65 4d 6f 64 65 3e 3d 30 0a 20 20 20  if( eMode>=0.   
325a0 26 26 20 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d  && (!MEMDB || eM
325b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
325c0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
325d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
325e0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
325f0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20  RNALMODE_OFF).  
32600 20 26 26 20 21 70 50 61 67 65 72 2d 3e 64 62 4d   && !pPager->dbM
32610 6f 64 69 66 69 65 64 0a 20 20 20 26 26 20 28 21  odified.   && (!
32620 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32630 66 64 29 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72  fd) || 0==pPager
32640 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20  ->journalOff).  
32650 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  ){.    if( isOpe
32660 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
32670 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
32680 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
32690 66 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  fd);.    }.    a
326a0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
326b0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
326c0 54 45 20 26 20 31 29 3d 3d 31 20 29 3b 0a 20 20  TE & 1)==1 );.  
326d0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
326e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
326f0 53 49 53 54 20 26 20 31 29 3d 3d 31 20 29 3b 0a  SIST & 1)==1 );.
32700 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
32710 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
32720 45 4c 45 54 45 20 26 20 31 29 3d 3d 30 20 29 3b  ELETE & 1)==0 );
32730 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
32740 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
32750 4d 45 4d 4f 52 59 20 26 20 31 29 3d 3d 30 20 29  MEMORY & 1)==0 )
32760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
32770 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
32780 5f 4f 46 46 20 26 20 31 29 3d 3d 30 20 29 3b 0a  _OFF & 1)==0 );.
32790 20 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d      if( (pPager-
327a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20 31  >journalMode & 1
327b0 29 3d 3d 31 20 26 26 20 28 65 4d 6f 64 65 20 26  )==1 && (eMode &
327c0 20 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20   1)==0.         
327d0 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  && !pPager->excl
327e0 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
327f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
32800 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
32810 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
32820 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
32830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
32840 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
32850 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
32860 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
32870 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
32880 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
32890 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
328a0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
328b0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
328c0 2a 20 53 65 74 74 69 6e 67 20 74 68 65 20 73 69  * Setting the si
328d0 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d 31 20 6d  ze limit to -1 m
328e0 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74 20 69 73  eans no limit is
328f0 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a 20 41 6e   enforced..** An
32900 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
32910 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c 65 72 20  a limit smaller 
32920 74 68 61 6e 20 2d 31 20 69 73 20 61 20 6e 6f 2d  than -1 is a no-
32930 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  op..*/.i64 sqlit
32940 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69  e3PagerJournalSi
32950 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70  zeLimit(Pager *p
32960 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69  Pager, i64 iLimi
32970 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74  t){.  if( iLimit
32980 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67  >=-1 ){.    pPag
32990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
329a0 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20  imit = iLimit;. 
329b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67   }.  return pPag
329c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  er->journalSizeL
329d0 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  imit;.}../*.** R
329e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
329f0 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  to the pPager->p
32a00 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e  Backup variable.
32a10 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75   The backup modu
32a20 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e  le.** in backup.
32a30 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20  c maintains the 
32a40 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
32a50 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d  variable. This m
32a60 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74  odule.** uses it
32a70 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20   opaquely as an 
32a80 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69  argument to sqli
32a90 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74  te3BackupRestart
32aa0 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65  () and.** sqlite
32ab0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 29 20  3BackupUpdate() 
32ac0 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  only..*/.sqlite3
32ad0 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65  _backup **sqlite
32ae0 33 50 61 67 65 72 42 61 63 6b 75 70 50 74 72 28  3PagerBackupPtr(
32af0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
32b00 20 20 72 65 74 75 72 6e 20 26 70 50 61 67 65 72    return &pPager
32b10 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65  ->pBackup;.}..#e
32b20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
32b30 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.